6

我有一个使用文件播放器音频单元来播放、暂停和停止音频文件的程序。我完成此操作的方法是初始化文件播放器音频单元以在零位置播放文件,然后当用户按下暂停按钮时,我停止 AUGraph,捕获当前位置,然后使用该位置作为开始位置当用户按下播放按钮时。一切正常,但每 3 或 4 次我点击暂停然后播放,这首歌在我点击暂停之前开始播放半秒到整秒。

我不知道为什么会这样,你们有什么想法吗?这是我的代码的简化版本。

//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

2

可能您应该使用数据包计数而不是时间戳,因为您只想暂停和播放音乐,而不是显示时间信息。

有关使用此方法的示例,请参阅BufferedAudioPlayer 。

于 2013-05-13T06:07:43.917 回答
0

这可能是由于您的代码的舍入问题:

例如,如果您每次按下暂停按钮,您的计时器都会在实际暂停时间之前的 0.5/4 秒处记录,您仍然会看到所需的结果。但是在再重复四次之后,您创建的空间量是 0.5/4 乘以 4,这是您似乎正在经历的半秒。

因此,我会特别注意您正在使用的对象类型,并确保它们不会不恰当地四舍五入。尝试使用 adouble float作为您的采样时间来尝试缓解该问题!

希望这是清楚和有帮助的!:)

于 2013-05-07T14:16:14.047 回答