2012-11-07 134 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