1

現在、ファイルプレーヤーオーディオユニットの配列をループして、オーディオファイルのどの位置で再生を開始するかを指示するループがあります。(これは機能します)この同じループで、ユニットに再生を開始するタイミングを指示する次のコードがあります(-1を指定すると、次のレンダリングサイクルで再生されます)。問題は、3番目のトラックに再生を指示する前に、最初のトラックの再生が開始されるため、それらが同時に開始されないことです。私が言いたいのは、「トラック1、正確に5サイクルで再生する、トラック2で正確に4サイクルで再生する、トラック3で正確に3サイクルで再生する、などです。これらは同時に再生されます。これは正しいアプローチですか?もしそうなら、startTime.mSampleTimeにどのような値を設定しますか?これを行う方法を説明するドキュメントが見つかりません。ありがとうございます。

    // tell the file player AU when to start playing (-1 sample time means next render cycle)
    AudioTimeStamp startTime;
    memset (&startTime, 0, sizeof(startTime));
    startTime.mFlags = kAudioTimeStampSampleTimeValid;
    startTime.mSampleTime = -1;
    AudioUnitSetProperty(fileUnitArray[mycount], kAudioUnitProperty_ScheduleStartTimeStamp, kAudioUnitScope_Global, 0, &startTime, sizeof(startTime));
4

2 に答える 2

0

mSampleTimeを-1以外の値に設定する(つまり、次のサイクルで開始する)ことに関する情報を追跡することはできませんでしたが、問題を回避することはできました。AUGraphを実行し続ける代わりに、AudioUnitResetを使用してファイルプレーヤーのオーディオユニットをリセットし、上記のコードを使用してファイルプレーヤーを再起動する代わりに、現在のファイルプレーヤーの再生ヘッドの位置を保存し、AUGraphを完全に停止し、現在のAUGraphでAUGraphを再初期化します。位置0から開始するように指示する代わりに、再生ヘッドの位置を指定してから、AUGRAPHを再起動します。

于 2012-08-01T14:22:16.980 に答える
0

あなたがする必要があるのは、レンダリングスレッドからのオーディオファイルの再生をスケジュールすることです。別のスレッドにファイルをロードしますが、レンダリングスレッドから次のレンダリングサイクルで再生するようにファイルに指示します。このようにして、すべてのファイルが同時に開始されます。

于 2013-12-02T11:28:21.337 に答える