Q: データをエンコードしてファイルに書き出すムービーエクスポートコンポーネントで作業しています。この処理には少々時間がかかるので、プログレスプロシージャをサポートしたいと思います。MovieProgressProc についての記述を参照しましたが、ConvertMovieToFile や PutMovieIntoTypedHandle といった関数を適用しているだけのように見えます。エクスポートコンポーネントで ProgressProc をサポートする方法はありますか?
A: エクスポートコンポーネントでプログレスプロシージャをサポートすることは、とても簡単です。
このアプリケーションは、リスト 1 に示すプロトタイプと同じ MovieProgressProc を提供しています。これは、コンポーネントから呼び出すユーザ関数です。
OSErr MyMovieProgressProc(Movie theMovie,
short message,
short whatOperation,
Fixed percentDone,
long refcon); |
|
リスト 1. アプリケーションで定義される MovieProgressProc のプロトタイプ |
SetProgressProc セレクタをサポートして、エクスポートコンポーネントに SetProgressProc 関数を組み込む必要があります。これにより、MovieExportSetProgressProc API でコンポーネントを呼び出すことができます。
ComponentCall (SetProgressProc) |
|
リスト 2. SetProgressProc セレクタのサポート |
QuickTime は次に、ProgressProc (MovieProgressUPP) と refcon を使ってエクスポートコンポーネントを呼び出します。後で使えるように、この MovieProgressUPP と refcon をコンポーネントの globals に保存します。
pascal ComponentResult MyExport_SetProgressProc(
myExportGlobals glob,
MovieProgressUPP proc,
long refcon)
{
if ((NULL == proc) || (-1 == proc)) return paramErr;
glob->progressProc = proc;
glob->progressProcRefCon = refCon;
return noErr;
} |
|
リスト 3. エクスポートコンポーネント SetProgressProc の実装 |
エクスポート中に(コンポーネントがこの処理を実行しているときに)、InvokeMovieProgressUPP を使用してプログレスプロシージャを呼び出し、進捗を示す適切なメッセージと、最新のパーセンテージの値が表示されることを確認します。
message パラメータは、次のいずれかの値に設定する必要があります。
movieProgressOpen−エクスポータが長い処理を開始しています。これが常に必ず最初のメッセージになります。
movieProgressUpdatePercent−処理の相対的な完了度合。
movieProgressClose−エクスポート処理が完了しました。これが必ず最後のメッセージになります。
whatOperation パラメータは、エクスポート処理を反映するように設定する必要があります。
progressOpExportMovie−エクスポート処理。
InvokeMovieProgressUPP(
NULL, // ムービー
movieProgress..., // movieProgressOpen、
// movieProgressUpdatePercent、
// または movieProgressClose
progressOpExportMovie, // エクスポート
myPercentDone, // 固定値 1.0 は、100% 処理完了
store->progressProcRefCon,
glob->progressProc); |
|
リスト 4. エクスポートコンポーネントからの MovieProgressProc 呼び出し |
アプリケーションのデベロッパは、-1 の「Default Progress Proc」値を MovieExportSetProgressProc で使用できないことに注意する必要があります。この API には、関数を正しく呼び戻すことが必要です。
参考文献:
[2003 年 1 月 31 日]
|