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

Technical Q&A QA1190
Filtering the Effects List returned by QTGetEffectsList


Q: QTGetEffectsList 関数を通じて QuickTime エフェクトのリストを取得しています。その後、このリストを QTCreateStandardParameterDialog 関数に渡してダイアログを作成し、ユーザがリストからエフェクトを選択できるようにしています。しかし、指定したエフェクトだけがリストに表示されるように、このリストを事前に編集したいと思っています。これは可能でしょうか?

A: QuickTime 6 では、QTGetEffectsListExtended という便利な関数を使用して、エフェクトリストに入れるエフェクトをフィルタ処理できます。この関数の完全なドキュメントは、「What's New in QuickTime 6」にあります。アップルでは、QuickTime の将来のバージョンとの互換性を保証するために、この手法を使うことを強くお勧めします。

たとえば、以下に、マルチソースのトランシジョンエフェクトだけを表示する呼び出しの例を示します。

QTAtomContainer effectsList;
OSErr err;


err = QTGetEffectsListExtended(
    &effectsList,
    2,  /* ソース数の最小値 */
    -1, /* ソース数の最大値はなし */
    0,  /* getOptions - 省略可能 */
    kTransitionMajorClass, /* マルチソースのモーフエフェクトをフィルタにかける */
    kTransitionMinorClass, /* トランシジョンをフィルタにかける */
    0,  /* オプションのフィルタ処理 */
    0); /* フィルタ処理手順に対するオプションの refcon  */

リスト 1 QTGetEffectsListExtended を使用したエフェクトリストのフィルタ処理

QuickTime 5 およびそれ以前のバージョンでは、QTGetEffectsList によって戻されたエフェクトのリストを手動で確認し、表示したくないエフェクトをリストから削除する必要があります。QTGetEffectsList から戻されるリストには、各エフェクトコンポーネントに対して 2 つのアトムが含まれています。1 つは、型が kEffectNameAtom ('name') のアトムであり、エフェクトの名前が含まれています。もう 1 つは、型が kEffectTypeAtom ('type') のアトムで、エフェクトコンポーネントのサブタイプであるエフェクトのタイプが含まれています。単純にこのリストを確認して、表示したくないエフェクトに対応する kEffectNameAtom および kEffectTypeAtom アトムを削除します。以下は、この方法を示したコードの例です。

void BuildAndEditEffectsList() {
    short             childCount, index;
    OSErr             err;
    QTAtomContainer   effectsList, effectSample;
    QTParameterDialog effectsDialog;
        /* これらがリストに表示したいエフェクト */
    const OSType supportedEffects[] = {
        kBlurImageFilterType,
        kBrightnessContrastImageFilterType
    };


        /* エフェクトの現在のリストを取得 */
        /* 最小値 == 最大値 == -1、つまり最小値も最大値もなし */
    err = QTGetEffectsList( &effectsList, -1, -1, 0 );
    if (err != noErr) goto bailError;

        /* リスト中のエフェクト数のカウントを取得 */
    childCount = QTCountChildrenOfType(
        effectsList, kParentAtomIsContainer, kEffectNameAtom );
        /* 反復処理を実行してリスト中の各エフェクトを処理し、
        上であらかじめ選択したエフェクトと一致しないものを削除 */
    for( index = childCount; index > 0 ; index -- )
    {
        QTAtom     effectTypeAtom;
        QTAtomID   id;
        long       effectCodeSize;
        Ptr        effectCodePtr;
        OSType     effectCode;
        short      j;
        Boolean    effectIsSupported;

        effectTypeAtom = QTFindChildByIndex( effectsList,
            kParentAtomIsContainer,
            kEffectTypeAtom, index, &id );
        err = QTLockContainer( effectsList );
        if (err != noErr) goto bailError;

        err = QTGetAtomDataPtr( effectsList,
            effectTypeAtom,
            &effectCodeSize,
            &effectCodePtr);
        if (err != noErr) goto bailError;

            /* 実際のエフェクトコードを取得 */
        effectCode = *(OSType *)effectCodePtr;

        err = QTUnlockContainer( effectsList );

            /* 現在のエフェクトが、上で選択したリストに
            あるかどうかチェック */
        for( j=0, effectIsSupported=false ;
            j<sizeof(supportedEffects)/sizeof(OSType) ; j++ )
        {
            if ( effectCode == supportedEffects[j] )
            {
                effectIsSupported = true;
                break;
            }
        }
            /* 上記のカスタムリストに一致するものがなかった場合は、
            このエフェクトを削除 */
        if ( !effectIsSupported )
        {
            QTAtom effectNameAtom;

            effectNameAtom = QTFindChildByIndex( effectsList,
                kParentAtomIsContainer, kEffectNameAtom, index, &id );
            err = QTRemoveAtom( effectsList, effectTypeAtom );
            err = QTRemoveAtom( effectsList, effectNameAtom );
        }
    }

        /* 新しく作成されたエフェクトリストを使用して、
        その後で使用するダイアログを作成 */
    err = QTNewAtomContainer( &effectSample );
    err = QTCreateStandardParameterDialog( effectsList,
            effectSample, 0, &effectsDialog );

bailError:
    return;
}

リスト 2 QTGetEffectsList によって戻されたエフェクトのリストの編集


[2002年 9 月 4 日]