SSブログ

Mac用USBデバイス-65 Cocoaクラスの実装その2 [Mac用USBデバイス工作]

たった一週間でなにをやってたのか忘れてしまう。そうそう、Cocoa/Objective-CレベルのIIDCカメラのドライバのインターフェイスを考えていたんだった。まさしく佳境じゃん。

IIDCFaucet

蛇口オブジェクト。
@class IIDCCamera;
@class IIDCFrameHolder;

@interface NSObject (IIDCIsochronousFausetInformal)
- (void)faucet:(id)fauset setFrameHolder:(IIDCFrameHolder *)frameHolder;
@end

@interface IIDCFaucet : NSObject {
    IIDCCamera          *camera;
    IIDCChannelAndPorts *channelAndPorts;
    id                  delegate;
    IIDCFrameHolder     *fholder;
}

- (id)initWithCameraDevice:(IIDCCamera *)cameraDevice;
- (void)setDelegate:(id)newDelegate;
- (id)delegate;

- (void)start;
- (void)stop;
先日考えたカメラのオブジェクトをもらって初期化する。IIDCChannelAndPortsはアイソクロナス転送を実際に行うオブジェクトで、カメラのフォーマットやモードが変更されると作り直す。変更はカメラからの通知を監視する。

デリゲートは画像データの渡し先。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)observer;
- (void)removeObserver:(id)observer;

- (void)startNotify;
オブザーバはさっきのコントローラで、カメラがつながったらio\_service\_tをコントローラに渡す。コントローラはそれを使ってカメラオブジェクトを作る。そのあと蛇口オブジェクトを作ってカメラにつなぐということをする。

カメラが外れると、コントローラは転送を止めて蛇口を破棄して、そのあとカメラオブジェクトを破棄する。

うまく動くかどうかわからないけど、いちおう複数台のカメラがつなげられることを前提に書いておくことにする。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

献立02/17献立02/18 ブログトップ

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