SSブログ

NuDCLその3 [Mac用USBデバイス工作]

MacOS XでFireWire(IEEE1394)のアイソクロナス転送を効率よく行うためのI/O Kitフレームワークの機能であるNuDCLのおさらいの続き。昨日から古いDCLとNuDCLの使い方の比較を始めた。今日はループを記述するためのジャンプのしかたなど。

2.5  ジャンプ先となるDCL

DCLコマンドではループを作るのに、ラベルへジャンプする、というコマンド列を作る。これは新旧同じ思想になっている。

古いDCLでは、ジャンプ先は専用のラベルとなるDCLコマンドを生成する。
    pLastDCL = (*dclCommandPool)->AllocateLabelDCL(dclCommandPool, pLastDCL) ;
のようにしてラベルDCLを作って、そのDCLをジャンプ先に指定する、ということになる。

NuDCLではどのDCLでもジャンプ先にできるのでラベルDCLというのはない。これは簡単。

2.6  update

DCLでは、ReceivePacketコマンドは単にデータをバッファへ転送する機能しかなく、ヘッダ部分のエンディアンを調整したり、タイムスタンプを捕ったりという作業はいちいち指定しないと実行されない。その作業をupdateと呼ぶ。

古いDCLではupdateコマンドがあって、
    pLastDCL = (*dclCommandPool)->AllocateUpdateDCLListDCL(
                                    dclCommandPool,
                                    pLastDCL,
                                    startUpdateDCLList,
                                    updateListCnt);
というupdate専用のDCLコマンドを生成する必要がある。AllocateUpdateDCLListDCL関数は
DCLCommand* (*AllocateUpdateDCLListDCL)(IOFireWireLibDCLCommandPoolRef self,
                                         DCLCommand* inDCL,
                                         DCLCommand** inDCLCommandList,
                                         UInt32 inNumCommands);
と定義されていて、updateすべきDCLコマンドへのポインタの配列を作っておいてそのアドレスをinDCLCommandListに渡す。またその配列の長さをinNumCommandsに渡してやるということをする。

この配列の確保設定破棄はプログラマの責任になる。たいしたことないけど、こういうのは雑用でちょっとウザい。

NuDCLではどうなるかというとupdate専用のDCLコマンドというのはない。どのDCLでもupdateできる。updateするにはプールの関数である
IOReturn    (*SetDCLUpdateList)(NuDCLRef dcl,
                                CFSetRef dclList);
を使う。引数のdclは、このDCLコマンドが実行されたあとupdateが実行されるということで、update対象のコマンドは配列ではなくCore Foundationの集合として渡す。この集合はさっきのAllocateReceivePacket関数の第4引数として渡していたCFMutableSetである。

CFMutableSetをひとつ作ってAllocateReceivePacketに引数として渡してやるとその集合に作られたコマンドが要素として追加される。そしてupdateのタイミングとなるDCLコマンドをSetDCLUpdateListに指定してやればいい、ということになる。これはちょっとした親切。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立06/29献立06/30 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。