6

ファイル プレーヤー オーディオ ユニットを使用してオーディオ ファイルを再生、一時停止、停止するプログラムがあります。これを達成する方法は、ファイル プレーヤーのオーディオ ユニットを初期化してファイルを位置 0 で再生し、ユーザーが一時停止ボタンを押したときに AUGraph を停止し、現在の位置をキャプチャして、その位置を開始位置として使用することです。ユーザーが再生ボタンを押したとき。すべてが正常に機能していますが、3、4 回一時停止してから再生するたびに、一時停止したポイントの 0.5 秒から 1 秒前に曲が再生され始めます。

なぜこれが起こっているのかわかりません。何か考えがある人はいますか?ここに私のコードの簡略版があります。

//initialize AUGraph and File player Audio unit
...
...
...

//Start AUGraph 
...
...
...

// pause playback
- (void) pauseAUGraph {

//first stop the AuGrpah
        result = AUGraphStop (processingGraph);

// get current play head position        
        AudioTimeStamp ts;
        UInt32 size = sizeof(ts);

        result = AudioUnitGetProperty(filePlayerUnit, 
                                      kAudioUnitProperty_CurrentPlayTime, kAudioUnitScope_Global, 0, &ts, 
                                      &size);
        //save our play head position for use later
        //must add it to itself to take care of multiple presses of the pause button
        sampleFrameSavedPosition = sampleFrameSavedPosition + ts.mSampleTime; 


        //this stops the file player unit from playing
        AudioUnitReset(filePlayerUnit, kAudioUnitScope_Global, 0); 
        NSLog (@"AudioUnitReset - stopped file player from playing");

    //all done    
}


// Stop playback

- (void) stopAUGraph {
        // lets set the play head to zero, so that when we restart, we restart at the beginning of the file. 

          sampleFrameSavedPosition = 0;
        //ok now that we saved the current pleayhead position, lets stop the AUGraph
        result = AUGraphStop (processingGraph);
}
4

2 に答える 2

0

コードの丸めの問題が原因である可能性があります。

たとえば、一時停止ボタンを押すたびに、タイマーが実際の一時停止時間の 0.5/4 秒前に記録する場合でも、望ましい結果が得られます。しかし、さらに4回繰り返した後、作成されたスペースの量は0.5/4 x 4であり、これはあなたが経験しているように見える0.5秒です.

したがって、使用しているオブジェクトの種類に注意を払い、それらが不適切に丸められないようにします。サンプル時間にa を使用して、double floatその問題を軽減してみてください!

これが明確で役立つことを願っています! :)

于 2013-05-07T14:16:14.047 に答える