当我点击一个按钮并使用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音频单元实现吗?
答案 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动作。?