Mac用USBデバイス-65 Cocoaクラスの実装その2 [Mac用USBデバイス工作]
たった一週間でなにをやってたのか忘れてしまう。そうそう、Cocoa/Objective-CレベルのIIDCカメラのドライバのインターフェイスを考えていたんだった。まさしく佳境じゃん。
デリゲートは画像データの渡し先。IIDCFrameHolderというのは画像データとタイムスタンプを組にしたコンテナクラス。インフォーマルプロトコルのfaucet:setFrameHolder:はデリゲートが実装する。画像データがそろうとデリゲートのこのメソッドを呼ぶ。
startとstopのメソッドは転送を開始したり止めたりするもの。
この下のレベルの実装を考えるときに整理し直さないといけない。
カメラが外れると、コントローラは転送を止めて蛇口を破棄して、そのあとカメラオブジェクトを破棄する。
うまく動くかどうかわからないけど、いちおう複数台のカメラがつなげられることを前提に書いておくことにする。
IIDCFaucet
蛇口オブジェクト。@class IIDCCamera; @class IIDCFrameHolder; @interface NSObject (IIDCIsochronousFausetInformal) - (void)faucet:(id)fauset setFrameHolder:(IIDCFrameHolder *)frameHolder; @end @interface IIDCFaucet : NSObject先日考えたカメラのオブジェクトをもらって初期化する。IIDCChannelAndPortsはアイソクロナス転送を実際に行うオブジェクトで、カメラのフォーマットやモードが変更されると作り直す。変更はカメラからの通知を監視する。{ IIDCCamera *camera; IIDCChannelAndPorts *channelAndPorts; id delegate; IIDCFrameHolder *fholder; } - (id)initWithCameraDevice:(IIDCCamera *)cameraDevice; - (void)setDelegate:(id)newDelegate; - (id)delegate; - (void)start; - (void)stop;
デリゲートは画像データの渡し先。IIDCFrameHolderというのは画像データとタイムスタンプを組にしたコンテナクラス。インフォーマルプロトコルのfaucet:setFrameHolder:はデリゲートが実装する。画像データがそろうとデリゲートのこのメソッドを呼ぶ。
startとstopのメソッドは転送を開始したり止めたりするもの。
IIDCChannelAndPorts
アイソクロナス転送のためのクラス。これはちょっと面倒なのでもうすこしあとから考えることにするが、中身は@interface IIDCChannelAndPorts : NSObject { packetSizeConfoguration pConf; IOFireWireLibNubRef localNode; IOFireWireLibDCLCommandPoolRef commandPool; DCLCommand firstDCL; IOFireWireLibIsochChannelRef channel; IOFireWireLibRemoteIsochPortRef remotePort; IIDCFaucet *faucet; void *dest; } - (id)initWithFaucet:(IIDCFaucet *)iidcFaucet; ....アイソクロナス転送用のDCLプールやポートを保持しないといけない。packetSizeConfogurationはフォーマットとモードから決まるパケットのサイズや1フレーム内のパケットの数とかを保持するコンテナクラス。単なる構造体でいいか、これは。
この下のレベルの実装を考えるときに整理し直さないといけない。
IIDCController
カメラと蛇口を保持するコントローラオブジェクト。@interface IIDCCameraController : NSObjectあとの動的監視オブジェクトのオブザーバでもある。{ IIDCCamera *camera; IIDCFaucet *faucet; } - (IIDCCamera *)camera; - (IIDCFaucet *)facuet; @end
IICNotifier
カメラがFireWireバスにつながったり外れたりするのをIOServiceAddMatchingNotification()なんかを使って監視するオブジェクト。これはシングルトンになる。@interface IIDCNotifier : NSObject { NSMutableArray *observers; } + (id)defaultIIDCNotifier; - (void)setObserver:(idオブザーバはさっきのコントローラで、カメラがつながったらio\_service\_tをコントローラに渡す。コントローラはそれを使ってカメラオブジェクトを作る。そのあと蛇口オブジェクトを作ってカメラにつなぐということをする。)observer; - (void)removeObserver:(id)observer; - (void)startNotify;
カメラが外れると、コントローラは転送を止めて蛇口を破棄して、そのあとカメラオブジェクトを破棄する。
うまく動くかどうかわからないけど、いちおう複数台のカメラがつなげられることを前提に書いておくことにする。
2010-02-17 22:01
nice!(0)
コメント(0)
トラックバック(0)
コメント 0