● 小池邦人のMac OS Xへの道 2002/07/16

〜 QuickTime 6とCreateMovieControl() API 〜


2002年7月15日、Mac OS X用のQuickTime 6(日本語版)がダウンロードできるようになりました。前回紹介した「Movie ControllerをCarbon Eventモデルへ対応させる方法」は、QuickTime 5をターゲットにしていました。QuickTime 6を使えば、Carbon Event HandlerやTimerルーチンとして実装していた「面倒なCarbon Event処理」を、完全に取り除くことが可能となります。

それには、NewMovieController() APIの代わりにCreateMovieControl() APIを使います。



このAPI自身は、Universal Interfaces v3.4.2のMovies.hに定義されています。定義のコメントには「Mac OS X 10.2から使用可能」と記されていますが、Mac OS X 10.1.5にQuickTime 6がインストールされていれば問題なく利用できます。利用方法や使用上の注意は、他のToolBoxコントロール(ボタンやスクロールバー等)とほぼ同じで、コントロールがウィンドウ上に正しく作成されれば、APIはControlRefを返してきます。

CreateMovieControl()の最初の引き数は、コントロールを表示するターゲットウィンドウのWindowRefです。その次が、コントロールの表示位置とサイズを決める矩形情報ですが、ここをNULL(ゼロ)にしておけば、Movieの映像サイズをそのまま採用してくれるようです。3番目の引き数には、ファイルから得ておいたMovieを渡します。4番目の引き数は、オプション機能のON/OFFを制御するためのフラグです。オプションフラグの各ビットは、以下のように定義されています。

kMovieControlOptionHideController = 1,  下にスライダーを表示しない
kMovieControlOptionLocateTopLeft =2,  ウィンドウの左上に表示する
kMovieControlOptionEnableEditing = 4,   Movieは編集可能とする
kMovieControlOptionHandleEditingHI = 8,  編集メニューを自動で制御する
kMovieControlOptionSetKeysEnabled = 16, キーによる操作を可能にする
kMovieControlOptionManuallyIdled = 32  Idle処理を手動に切り替える

上記設定が正しく行われ、ウィンドウ上にMovieコントロールが配置できれば、最後の引き数にそのControlRefが返ってきます。

さっそく、新規に書き直した「MoviePlay 4.0」のソースコードを見てみます。最初の注目点は、今回のソースコードでは外部変数をひとつも使っていないことです。それだけMovieをウィンドウに表示する処理がシンプルになったわけです。main()では、前回と同様にEnterMovies() を実行しておく必要があります。



ファイルメニューの選択を処理するには、アプリケーションに対するCarbon Event HandlerをsetUpAppCarbonEvent()で登録しておきます。QuickTime 6では、MovieコントロールのIdle処理をシステム側が受け持ちます。そのため、MCIdle()を定期的に呼ぶためだけに登録していたTimerルーチンは、お役ごめんとなりました。前準備がすべて終わり、RunApplicationEventLoop()を実行すれば、アプリケーションはCarbon Event Loop(メインループ)へ突入します。

メニューから「終了」が選ばれると、myCarbonEventHandler()内のdoCommand()ルーチンからQuitApplicationEventLoop() が実行されます。



これにより、RunApplicationEventLoop()で入ったメインループから抜けることになります。すべてのMovieウィンドウを閉じExitMovies()を実行したら(後処理)、ExitToShell()でアプリケーションを終了します。前回までのdoQuit()ルーチンは、main()ルーチンに組み込まれたことになります。Movieファイルをオープンし、ファイル内部からMovie情報を抽出する処理は、MoviePlay 3.0の場合とまったく同じです。前回の解説を参照してみてください。



以下が、Movie操作用のコントロールをウィンドウに配置する処理です。



まずは、Movie矩形枠に16ピクセル(スライダーの幅)を加えたサイズのウィンドウをオープンします。そこに、CreateMovieControl()でコントロールを配置します。APIの4番目の引き数に「2+4+8+16」が代入されていますが、これはオプションフラグの2、3、4、5ビット目をONにセットしているわけです。最初、オプションフラグのセットに「kMovieControlOptionLocateTopLeft」などのヘッダ定義名を使ってみましたが、なぜだか「定義されていない」とコンパイルエラーが表示されます。多分、Mac OS X 10.2からは問題なく使えるようになるでしょう。オプションフラグの4ビット目(kMovieControlOptionHandleEditingHI)をONにすると、自前でしていた編集メニューの処理(Movieのカット&ペースト)を完全に自動化できます。試してみてください。

newMovieWindow()ルーチンは、外部変数を確保する(配列番号を得てRefConに保存する)処理が取り除かれて非常にシンプルになりました。また、ウインドウ用のCarbon Event Handlerをインストールしていた、setUpWindowCarbonEvent()も外されています。システムディフォルトのEvent Handlerのみで、Movieの操作(映像の再生や停止)に関わるすべての処理が実現されます。う〜ん、感動ですね!これでソースコードの説明はすべて終わり、前回と比べて随分ダイエットされたことが分かります。時間があったらMoviePlayer 2.0から4.0までのソースコードを順次比較し、ToolBoxやQuickTimeの進化の歴史を肌で感じてみてください(笑)。

ここで解説している「MoviePlay 4.0」サンプルアプリケーションは、以下のライブラリサイトに登録されていますので、ダウンロードして参照してみてください。アプリケーションを起動させるのには、Mac OS X 10.1.3以上でQuickTime 6がインストールされていることが条件となります。プロジェクトをコンパイル&リンクするには、Mac OS X 10.1以上とMetrowerks CodeWarrior v8.1が必要です。

http://www.ottimo.co.jp/library/

QuickTime 6で新規追加された機能を調査したい方は、Apple社のQuickTimeサイトにアップロードされている「Whats New in QuickTime 6」(220ページ 1.2MB)というPDFドキュメントを参照してください。この時期にQuickTime 6を配付したと言うことは、来週開催されるMACWORLD Expo NewYorkの基調講演のストリーミング放送にはMPEG-4が使われるのでしょうか?もしそうなら、MPEG-4映像デリバリの最初の大規模な実験になりそうですね...。


copyright 2002 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact Us: koike@ottimo.co.jp