将ScheduledAudioFileRegion设置为重新开始

时间:2012-08-02 15:32:47

标签: ios5 core-audio audiounit

当我点击一个按钮并使用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?我希望从开始到结束按下按钮时播放声音,但是当再次点击按钮时,即使文件当前正在播放,它也应该从头开始。这可以通过fileplayer音频单元实现吗?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

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