NuDCLその7 [Mac用USBデバイス工作]
こないだからFireWire(IEEE1394)のアイソクロナス転送経由でデータのやりとりをするためのMacOS XのメカニズムであるDCLの2種類のバージョンの簡単な比較を、FireWire SDK26(要Developer Account)のサンプルコードをもとに見てきた。
基本的な違いはわかった。次にサンプルコードがどのように使っているかを見て、以前書いたIIDCカメラドライバの参考にする。
サンプルコードはC++のコマンドライン用に書かれていて、いろいろなアプリがビルドできるようになっている。 その中でUniversalReceiverTest.cppがFireWireUniversalIsoch.cppを経由してUniversalReceiver.cppを使っている。
UniversalReceiverTest.cppにはmain関数があって、MPEG-2ストリームをFireWire経由で受けるというのを想定しているらしい。main関数の流れは
なぜこんなヘルパ関数を使っているかと言うと、インスタンスを作るだけでなく作業スレッドも一緒に作ったり破棄したりしている。
リアルタイムスレッドに設定するためのパラメータは決めうちになっていて、最終的にthread_policy_set関数を読んで設定している。
基本的な違いはわかった。次にサンプルコードがどのように使っているかを見て、以前書いたIIDCカメラドライバの参考にする。
3 サンプルコードでのNuDCLの使い方
実際にサンプルコード「AVCVideoServices-42」の「UniversalReceiveTest」を見てどうやって使うのかをみてみる。サンプルコードはC++のコマンドライン用に書かれていて、いろいろなアプリがビルドできるようになっている。 その中でUniversalReceiverTest.cppがFireWireUniversalIsoch.cppを経由してUniversalReceiver.cppを使っている。
UniversalReceiverTest.cppにはmain関数があって、MPEG-2ストリームをFireWire経由で受けるというのを想定しているらしい。main関数の流れは
- MPEG-2のエンコーダなどを作る
- UniversalReceiverのインスタンスを作る
- データを受け取るためのコールバックなどを設定する
- アイソクロナスチャンネルを設定する
- 受け取りを開始する
- コールバックが呼ばれるようにusleepしながら待つ
- 受け取りを止める
- インスタンスを破棄する
3.1 FireWireUniversalIsoch.cpp
このファイルにはデータ受信用としてUniversalReceiverのインスタンスを作るCreateUniversalReceiverと、破棄するDestroyUniversalReceiverというふたつの関数が定義されている。なぜこんなヘルパ関数を使っているかと言うと、インスタンスを作るだけでなく作業スレッドも一緒に作ったり破棄したりしている。
3.1.1 CreateUniversalReceiver関数
インスタンス作成関数である。これは簡単で単に- スレッドを設定する
- UniversalReceiverRTThreadStart関数を新しいスレッドで走らせる
- threadReadyという変数がtrueになるまでポーリングする(スリープしながら)
- エラーチェックをして返る
3.1.2 UniversalReceiverRTThreadStart関数
これは新しい作業スレッドで実行される関数。ここでは- UniversalReceiverのインスタンスを作る
- インスタンスのsetupIsochReceiver関数を呼ぶ
- インスタンスのコールバック関数を設定する
- 自分のスレッドをリアルタイムスレッドに設定する
- threadReady変数をtrueにする
- CFRunLoopを走らせる
リアルタイムスレッドに設定するためのパラメータは決めうちになっていて、最終的にthread_policy_set関数を読んで設定している。
3.1.3 DestroyUniversalReceiver関数
ここでUniversalReceiverのインスタンスを破棄してそのインスタンスの乗っているCFRunLoopを止めて終わっている。CFRunLoopを止めるとUniversalReceiverRTThreadStart関数から抜けて作業スレッドは終わることになる。そうか、こうすればいいのか。これは簡単。2010-07-05 22:19
nice!(0)
コメント(0)
トラックバック(0)
コメント 0