2012-11-07 135 views
1

我试图使用文件播放器音频单元(kAudioUnitSubType_AudioFilePlayer)播放多个文件(当然不是同时播放)。这是在iOS上。 所以我已经成功地打开了这些文件并将它们的详细信息存储在AudioFileID的数组中,我使用kAudioUnitProperty_ScheduledFileIDs设置了音频单元。现在,我想定义2 ScheduledAudioFileRegion的,每一个文件,并用文件播放器使用了他们...使用单个文件播放器音频单元播放多个文件

但我似乎无法找出:

  • 如何设置kAudioUnitProperty_ScheduledFileRegion属性来存储这2个区域(实际上,如何定义每个区域的索引)?
  • 如何触发特定区域的回放..我的猜测是kAudioTimeStampSampleTimeValid参数应该启用此功能,但是如何定义您想要播放的区域?

也许我只是明显错了我应该使用这个音频单元的方式,但是文档很难得到,我还没有找到任何示例显示同一播放器上播放2个区域! 在此先感谢。

回答

2

您需要在每次播放文件时安排区域。在ScheduledAudioFileRegion中,您必须设置AudioFileID才能播放。当单位(样本)的当前时间等于或大于预定区域中的采样时间时,播放开始。

例子:

// get current unit time 
AudioTimeStamp timeStamp; 
UInt32 propSize = sizeof(AudioTimeStamp); 
AudioUnitGetProperty(m_playerUnit, kAudioUnitProperty_CurrentPlayTime, kAudioUnitScope_Global, 0, &timeStamp, &propSize); 

// when to start playback 
timeStamp.mSampleTime += 100; 

// schedule region 

ScheduledAudioFileRegion region; 
memset(&region, 0, sizeof(ScheduledAudioFileRegion)); 
region.mAudioFile = ...; // your AudioFileID 
region.mFramesToPlay = ...; // count of frames to play 
region.mLoopCount = 1; 
region.mStartFrame = 0; 
region.mTimeStamp = timeStamp; 


AudioUnitSetProperty(m_playerUnit, kAudioUnitProperty_ScheduledFileRegion, kAudioUnitScope_Global, 0, &region,sizeof(region)); 
+0

非常感谢......我认为,API将允许在预先定义多个区域,然后触发你想打一个! – ThomasWeiss

+0

@Aliaksandr我尝试使用这种方法来获取我尝试使用音频单元播放的音频文件的当前时间戳,但它返回一个空的'ts'结构。它根本不会改变以前的值。 (音频播放正在工作) 我得到-10879,即kAudioUnitErr_InvalidProperty作为返​​回值OSStatus – neeraj