C 言語でJitter の開発を行なう際、既存の Jitter オブジェクトを使用することができます。この章では、jit.qt.movie とjit.qt.record オブジェクトをあなたの C コードからインスタンス化し、オブジェクトに組み入れる方法について簡単に調べてみましょう。
t_jit_qt_movie のようなオブジェクトは、独自のコードから簡単に使用することができます。これは標準的な Jitter オブジェクトであるため、jit_object_new および jit_object_free を使ってオブジェクトのインスタンス化や開放を行い、jit_object_method を使ってメッセージを送信し、jit_attr_get や jit_attr_set を使ってアトリビュートのゲット、セットを行なうことができます。例えば、次に示すコードの部分では、t_jit_qt_movie オブジェクトを生成し、あらかじめ指定したムービーをディスクから読み込み、その第1フレームをムービーのもともとのサイズにセットしたマトリックスの中に伸張します。
void jit_foo_read_first_movie_frame(t_jit_foo *x, t_symbol *s, long ac, t_atom *av) { void *qtmovie; // 1x1 のサイズで、t_jit_qt_movie を作ります。 qtmovie = jit_object_new(gensym("jit_qt_movie"), 1, 1); if (qtmovie) { t_atom rv; // "read" 呼び出しによって返されるすべての値を保持します。 // rvarr を含みます。 t_object *rvarr; // 実際に返される値を持った t_atom の配列 // autostart をオフにします。 jit_attr_setlong(qtmovie, gensym("autostart"), 0); // movie の読み込み。 関数に引数として渡すだけです。 object_method_typed(qtmovie, gensym("read"), ac, av, &rv); // 戻り値をチェックし、ムービーの読み込みを確認します。 if (rvarr = jit_atom_getobj(&rv)) { long rvac = 0; t_atom *rvav = NULL; object_getvalueof(rvarr, &rvac, &rvav); if (rvac && rvav) { // Max の場合と同様に、リスト "ファイル名 success"を取得します。 // success 1 は読み込みが成功したことを示します。 if (rvac > 1 && jit_atom_getlong(rvav + 1)) { long dim[2]; void *matrix; t_jit_matrix_info info; // ムービー自身が持つ画面サイズ(dim)を取得します。 jit_attr_getlong_array(qtmovie, gensym("movie_dim"), 2, dim); // t_jit_qt_movie の dim をムービーの値に合わせてセットします。 jit_object_method(qtmovie,_jit_sym_dim,dim[0],dim[1]); // 私たちのマトリックスの大きさを合わせます。 jit_matrix_info_default(&info); info.type = _jit_sym_char; info.planecount = 4; info.dimcount = 2; info.dim[0] = dim[0]; info.dim[1] = dim[1]; matrix = jit_object_new(_jit_sym_jit_matrix, &info); if (matrix) { // 私たちのマトリックスを引数として t_jit_qt_movie の // matrix_calc メソッドを、呼び出します。 err = (t_jit_err)jit_object_method(qtmovie, _jit_sym_matrix_calc, NULL, matrix); if (err != JIT_ERR_NONE) { error("something went wrong"); } // マトリックスで何らかの処理を行ないます。 // マトリックスを解放します。 jit_object_free(matrix); } } freebytes(rvav, sizeof(t_atom) * rvac); } freeobject(rvarr); } jit_object_free(qtmovie); } }
当然ながら、t_jit_qt_movieオブジェクトの time アトリビュートをセットしたり、frame メソッドを呼び出したり、時間の中の位置にあるデータを復元したりすることができます。実際、ドキュメント化されている jit.qt.movie のほとんどすべてのメソッドとアトリビュートは、Max インターフェイス内の関数として C から使用することができます。例外は、Max ラッパーオブジェクトで実装されている framedump などの関数です。