2011年06月28日

modo501 SDK いじってみた その19 modo501 SP3

今年ももう半分終わろうとしているんだねぇ。以前に買った地デジチューナー+ネットワークプレーヤーのHVT-BCT300は今月上旬にファームウェアがアップデートされてDLNAサーバー機能が付くって話だったので楽しみに待っていたら下旬に変更になっていた。その下旬もそろそろ終わりですが、期待して待ってます>IODATA

さて、ここまでわかったチャンネルモディファイヤ作成のための手順をまとめると、

  1. CLxImpl_Packageを継承したパッケージクラスを作り、static LXtTagInfoDesc descInfo[]とインスタンスを生成ためのファクトリーサーバーCLxPolymorph<> chanmod_factoryを追加し、pkg_SetupChannels ()、pkg_TestInterface ()、pkg_Attach ()をオーバーライドする。
  2. 1のクラスで生成されるインスタンスのクラスをCLxImpl_PackageInstanceとCLxImpl_ChannelModItemクラスを継承したクラスとして定義し、pins_Initialize ()、pins_Cleanup ()、pins_SynthName ()、cmod_Flags ()、cmod_Allocate ()、cmod_Cleanup ()、cmod_Evaluate ()をオーバーライドする。さらにこのインスタンスを生成するパッケージを示すポインター変数とCLxUser_Itemクラスのメンバー変数、インスタンスのインターフェースを格納するメンバー変数を用意する。
  3. 1で追加したstatic LXtTagInfoDesc descInfo[]は生成するインスタンスの親クラスがchanModifyであることを示すために、

    LXtTagInfoDesc CLinearBlendPackage::descInfo[] = {
     { LXsPKG_SUPERTYPE, "chanModify" },
     { 0 }
    };

    の部分が必須である。
  4. 1のクラスのコンストラクタでファクトリーサーバーにCLxIfc_PackageInstanceとCLxIfc_ChannelModItemのインターフェースを2で定義したインスタンスクラスをテンプレートクラスとして追加する。
  5. 1でオーバーライドしたpkg_SetupChannels ()の実装は、メソッドに渡された引数からCLxUser_AddChannelオブジェクトを作り、そのオブジェクトのNewChannel (チャンネルのラベル, チャンネルタイプ)メソッドを使ってチャンネルモディファイヤに必要な数のチャンネルを追加し、SetDefault (実数初期値, 整数初期値)で初期値を設定する。
  6. 1でオーバーライドしたpkg_TestInterface ()の実装は、引数で与えられたguidのインターフェースがファクトリーサーバーにあるかどうかを返すようにする。
  7. 1でオーバーライドしたpkg_Attach ()の実装はファクトリーサーバーのAlloc()メソッドでインスタンスを生成させ、そのインスタンスにそれを生み出したパッケージのポインタとインターフェースを登録してメソッドの引数で渡されたポインタにインスタンスを返す。
  8. 2でオーバーライドしたcmod_Allocate ()メソッドは渡された引数からアイテムとチャンネルモディファイヤのラッパーオブジェクトを作って、アイテムのChannelLookup()メソッドで5で定義したチャンネルのラベルからチャンネルのインデックス番号を調べ、チャンネルモディファイヤのAddInput()、AddOutput()メソッドでアイテムのインデックス番目と接続した入出力チャンネルをチャンネルモディファイヤに追加する。さらに必要ならローカルデータを割り当てることも出来て、cmod_Evaluate ()メソッドの引数void *dataとして渡す事が出来るらしい。void **ppvDataがその橋渡しの変数だろうね。
  9. 2でオーバーライドしたcmod_Cleanup ()メソッドは8のcmod_Allocate ()メソッドでアロケートされたものがあればここで開放する。
  10. 2でオーバーライドしたcmod_Flags ()メソッドはスケマティックビューに表示されるアイテム用で、引数indexが指すアイテムチャンネルの役割をフラグで返す。フラグは LXfCHMOD_OUTPUT、 LXfCHMOD_INPUT、 LXfCHMOD_MULTILINKの3種類あり、LXfCHMOD_MULTILINKはLXfCHMOD_INPUTと組み合わせて使用して、マルチチャンネル入力を定義する。こんな感じ。

    if (LXx_OK (modItem.ChannelLookup ("inputs", &chanIdx)))
    {
      if (index == chanIdx)
        return (LXfCHMOD_INPUT | LXfCHMOD_MULTILINK);
    }

  11. 2でオーバーライドしたcmod_Evaluate ()メソッドにはチャンネルモディファイヤのメインの処理部分を記述する。引数で与えられたチャンネルモディファイヤをCLxLoc_ChannelModifierでローカライズしてやれば、ReadInputFloat()メソッドなどでチャンネルから値が取り出せ、WriteOutputFloat()メソッドなどで値が出力できる。マルチチャンネルならInputCount()メソッドで接続されているリンクの数を調べてReadInputFloatByIndex()などでチャンネル番号+リンク番号で読み込みが出来る。
  12. 2でオーバーライドしたpins_Initialize ()メソッドはパッケージがアイテムをアタッチする時に呼び出される。引数として生成されたインスとその親クラスのインスタンスが渡される。ここでsetを使ってインスタンスを参照したら、pins_Cleanup ()でclear()して開放する。
  13. 2でオーバーライドしたpins_Cleanup ()メソッドはアイテムが削除される直前に呼び出されるメソッド。ここでメモリーを開放したり参照カウントを下げたりするんだろうね。
  14. 2でオーバーライドしたpins_SynthName ()メソッドはアイテムに自動でつく名前を設定する。
  15. プラグインのinitialize()ファンクションに、1のクラスをCLxPolymorph<>のテンプレートクラスとしてインスタンスを生成し、そこにCLxIfc_PackageインターフェースとCLxIfc_StaticDescインターフェースを追加してthisModuleにAddServerするコードを書く。

とまあこんな感じだ。リニアブレンドのコードはまさにチャンネルモディファイヤの骨組みみたいなもんで、自分で新しいチャンネルモディファイヤを作りたければこのコードをそっくりコピーして肉付けしていけば済みそうだ。未だに不明なのはLXsPKG_IS_MASKの役割かな。

それではまた次回。

カテゴリー別ページ



take_z_ultima at 11:30│Comments(0)TrackBack(0)modo | CG

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 

Archives