Max 5 API Reference

C からのJitterオブジェクトの使用

C 言語でJitter の開発を行なう際、既存の Jitter オブジェクトを使用することができます。

この章では、jit.qt.movie とjit.qt.record オブジェクトをあなたの C コードからインスタンス化し、その機能をオブジェクトに組み入れる方法について簡単に調べてみましょう。

実例 1: t_jit_qt_movie オブジェクト

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 をオフにします

      // 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 のような関数です。

Copyright © 2008, Cycling '74