NuDCLその6 [Mac用USBデバイス工作]
古いDCLとNuDCLを較べてきた。今日でだいたい終わる。ヘッダだけ見てたんでは全然わからなかったのに、実際に動かしてるコードを見れば一気に了解度が上がる。
「ヘッダを見ろ、それがすべてだ。それでわからなければ実装を読めばいい」というのはオープンソースにありがちな言い草だけど、見る方が無限の理解力があるならそれでいい。しかし時間は有限で、頼りにしたいヘッダには親切なのとそうでないのがある。
例えばgnuの多くはオープンソースにしてはドキュメントが充実してる、と僕は思う。一方でAppleのNuDCLはgnuの平均を下回っていると僕には思えるんだけど。「使ってもらおう」という意識がgnuのあまたのプロジェクトに較べて低いような気がする。どうだろうか。
古いDCLではコマンド列を作るときAllocate???で始まる関数を使って新しいDCLコマンドを生成した。
NuDCLではAllocate???で始まる関数は
また、NuDCLにはユーティリティと言った感じの関数が多く定義されている。次のコマンドを返したり、ジャンプ先を返したり一つのコマンドが送受信するデータのサイズを返したりといった関数がある。
ひとつよくわからないものがある。
サンプルコードにはすべてのNuDCLコマンドに対して
定数はIOFireWireFamilyCommon.hの中で
「ヘッダを見ろ、それがすべてだ。それでわからなければ実装を読めばいい」というのはオープンソースにありがちな言い草だけど、見る方が無限の理解力があるならそれでいい。しかし時間は有限で、頼りにしたいヘッダには親切なのとそうでないのがある。
例えばgnuの多くはオープンソースにしてはドキュメントが充実してる、と僕は思う。一方でAppleのNuDCLはgnuの平均を下回っていると僕には思えるんだけど。「使ってもらおう」という意識がgnuのあまたのプロジェクトに較べて低いような気がする。どうだろうか。
2.10 DCLコマンドの種類
ということで、古いDCLではいろいろなコマンドがあったけどNuDCLではReceiveとSendとあともう1種類しかない。古いDCLではコマンド列を作るときAllocate???で始まる関数を使って新しいDCLコマンドを生成した。
NuDCLではAllocate???で始まる関数は
NuDCLReceivePacketRef (*AllocateReceivePacket)(IOFireWireLibNuDCLPoolRef self, CFMutableSetRef saveBag, UInt8 headerBytes, UInt32 numBuffers, IOVirtualRange *buffers); NuDCLReceivePacketRef (*AllocateReceivePacket_v)(IOFireWireLibNuDCLPoolRef self, CFMutableSetRef saveBag, UInt8 headerBytes, IOVirtualRange *firstRange, ... ); NuDCLSendPacketRef (*AllocateSendPacket)(IOFireWireLibNuDCLPoolRef self, CFMutableSetRef saveBag, UInt32 numBuffers, IOVirtualRange *buffers); NuDCLSendPacketRef (*AllocateSendPacket_v)(IOFireWireLibNuDCLPoolRef self, CFMutableSetRef saveBag, IOVirtualRange *firstRange, ... ); NuDCLSkipCycleRef (*AllocateSkipCycle)(IOFireWireLibNuDCLPoolRef self);の5つしかない。_vで終わる関数は配列の代わりに引数にずらずら並べて書く用のものらしい。最後のSkipCycleというのは何もしないNuDCLを生成するものらしいが、どれもこのサンプルコードでは使われていないのでよくわからない。
また、NuDCLにはユーティリティと言った感じの関数が多く定義されている。次のコマンドを返したり、ジャンプ先を返したり一つのコマンドが送受信するデータのサイズを返したりといった関数がある。
ひとつよくわからないものがある。
void (*SetDCLFlags)(NuDCLRef dcl, UInt32 flags); UInt32 (*GetDCLFlags)(NuDCLRef dcl);なにかフラグを設定したり読んだりするらしい。HeaderDocのドキュメントも無く、ヘッダには定義があるだけで何も書いてない。不親切。
サンプルコードにはすべてのNuDCLコマンドに対して
(*nuDCLPool)->SetDCLFlags(thisDCL, (kNuDCLDynamic | kNuDCLUpdateBeforeCallback));と設定されている。
定数はIOFireWireFamilyCommon.hの中で
typedef enum { kNuDCLDynamic = BIT( 1 ), kNuDCLUpdateBeforeCallback = BIT( 2 ) } NuDCLFlags ;と、サンプルコードが使っているふたつだけが定義されている。勝手に使うフラグではなく、コマンドの状態を設定するものらしいけど、よくわからない。NuDCLを使うときは設定するものだ、と思っておくぐらいしかできない。
2010-07-03 20:46
nice!(0)
コメント(0)
トラックバック(0)
コメント 0