SSブログ

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

こないだからFireWire(IEEE1394)のアイソクロナス転送経由でデータのやりとりをするためのMacOS XのメカニズムであるDCLの2種類のバージョンの簡単な比較を、FireWire SDK26(要Developer Account)のサンプルコードをもとに見てきた。

基本的な違いはわかった。次にサンプルコードがどのように使っているかを見て、以前書いたIIDCカメラドライバの参考にする。

3  サンプルコードでのNuDCLの使い方

実際にサンプルコード「AVCVideoServices-42」の「UniversalReceiveTest」を見てどうやって使うのかをみてみる。

サンプルコードはC++のコマンドライン用に書かれていて、いろいろなアプリがビルドできるようになっている。
その中でUniversalReceiverTest.cppがFireWireUniversalIsoch.cppを経由してUniversalReceiver.cppを使っている。

UniversalReceiverTest.cppにはmain関数があって、MPEG-2ストリームをFireWire経由で受けるというのを想定しているらしい。main関数の流れは
  1. MPEG-2のエンコーダなどを作る
  2. UniversalReceiverのインスタンスを作る
  3. データを受け取るためのコールバックなどを設定する
  4. アイソクロナスチャンネルを設定する
  5. 受け取りを開始する
  6. コールバックが呼ばれるようにusleepしながら待つ
  7. 受け取りを止める
  8. インスタンスを破棄する
となっている。
UniversalReceiverのインスタンスを作ったり破棄したりと言う作業はFireWireUniversalIsoch.cppにあるヘルパ関数を使っている。FireWireUniversalIsoch.cppにはクラス定義は無く、関数だけが定義されている。

3.1  FireWireUniversalIsoch.cpp

このファイルにはデータ受信用としてUniversalReceiverのインスタンスを作るCreateUniversalReceiverと、破棄するDestroyUniversalReceiverというふたつの関数が定義されている。

なぜこんなヘルパ関数を使っているかと言うと、インスタンスを作るだけでなく作業スレッドも一緒に作ったり破棄したりしている。

3.1.1  CreateUniversalReceiver関数

インスタンス作成関数である。これは簡単で単に
  1. スレッドを設定する
  2. UniversalReceiverRTThreadStart関数を新しいスレッドで走らせる
  3. threadReadyという変数がtrueになるまでポーリングする(スリープしながら)
  4. エラーチェックをして返る
をしている。

3.1.2  UniversalReceiverRTThreadStart関数

これは新しい作業スレッドで実行される関数。ここでは
  1. UniversalReceiverのインスタンスを作る
  2. インスタンスのsetupIsochReceiver関数を呼ぶ
  3. インスタンスのコールバック関数を設定する
  4. 自分のスレッドをリアルタイムスレッドに設定する
  5. threadReady変数をtrueにする
  6. CFRunLoopを走らせる
としている。これも一直線なので簡単。リアルタイムスレッドの設定はこのファイルにはなく、AVSCommon.cppという別のヘルパ関数がつまったファイルにあるMakeCurrentThreadTimeContraintThreadという関数でやっている。どうでもいいけど綴りが間違ったまま使われている。Constraintと書きたかったんだよな。

リアルタイムスレッドに設定するためのパラメータは決めうちになっていて、最終的にthread_policy_set関数を読んで設定している。

3.1.3  DestroyUniversalReceiver関数

ここでUniversalReceiverのインスタンスを破棄してそのインスタンスの乗っているCFRunLoopを止めて終わっている。CFRunLoopを止めるとUniversalReceiverRTThreadStart関数から抜けて作業スレッドは終わることになる。そうか、こうすればいいのか。これは簡単。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

献立07/05献立07/06 ブログトップ

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