高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1230
Movie Export Components - Supporting a MovieProgressProc


Q: データをエンコードしてファイルに書き出すムービーエクスポートコンポーネントで作業しています。この処理には少々時間がかかるので、プログレスプロシージャをサポートしたいと思います。MovieProgressProc についての記述を参照しましたが、ConvertMovieToFilePutMovieIntoTypedHandle といった関数を適用しているだけのように見えます。エクスポートコンポーネントで 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 を使ってエクスポートコンポーネントを呼び出します。後で使えるように、この MovieProgressUPPrefcon をコンポーネントの 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 日]