2

我正在尝试在点击按钮并使用 iOS 5 文件播放器音频单元时播放声音。

文件播放器使用 ScheduledAudioFileRegion 播放音频,并且可以根据需要安排播放尽可能多的帧

ScheduledAudioFileRegion rgn;
memset (&rgn.mTimeStamp, 0, sizeof(rgn.mTimeStamp));
rgn.mTimeStamp.mFlags = kAudioTimeStampSampleTimeValid;
rgn.mTimeStamp.mSampleTime = 0;
rgn.mCompletionProc = NULL;
rgn.mCompletionProcUserData = NULL;
rgn.mAudioFile = audioFile;
rgn.mLoopCount = INT_MAX;
rgn.mStartFrame = 0;
rgn.mFramesToPlay = nPackets * fileASBD.mFramesPerPacket; // plays entire file.

每当按下按钮时,我如何告诉这个文件播放器从一开始就播放声音,或者我每次都必须创建一个新区域并memset它?我希望从开始到结束按下按钮时播放声音,但是当再次点击按钮时,即使文件当前正在播放,它也应该从头开始。文件播放器音频单元可以做到这一点吗?

4

2 回答 2

3

调用AudioUnitReset以停止播放,然后启动并再次播放。立即发生(或尽可能接近没有区别。)

每当您的用户按下按钮时执行此操作:

// Reset
AudioUnitReset(filePlayerUnit, kAudioUnitScope_Global, 0);
// Prime (have to do this before every play call.)
UInt32 defaultVal = 0;
AudioUnitSetProperty(filePlayerUnit, 
                     kAudioUnitProperty_ScheduledFilePrime,                
                     kAudioUnitScope_Global, 
                     0, 
                     &defaultVal, 
                     sizeof(defaultVal));
// Play (again)
AudioUnitSetProperty(_playerUnit,
                     kAudioUnitProperty_ScheduleStartTimeStamp,
                     kAudioUnitScope_Global,
                     0,
                     &startTime,
                     sizeof(startTime));

您已经拥有该地区的时间戳。您需要这些,但您还必须创建一个AudioTimeStamp

AudioTimeStamp startTime;
memset(&startTime, 0, sizeof(startTime));
startTime.mFlags = kAudioTimeStampSampleTimeValid;
startTime.mSampleTime = -1;

创建它,并在第一次调用 play 之前从上面的第一个代码段调用相关的 SetProperty。

于 2012-12-10T02:30:22.650 回答
1

你能不能让你的 UIButton 在调用 Play 之前触发一个 Stop 动作..?

于 2012-11-30T16:49:06.450 回答