2012-07-24 63 views
1

現在我有一個循環遍歷文件播放器音頻單元陣列,並告訴它們在音頻文件中開始播放的位置。 (這工作)在這個相同的循環中,我有以下代碼來告訴單位什麼時候開始播放(-1使他們在下一個渲染週期中播放)。問題在於他們不是同時開始,因爲第一首曲目在我有機會告訴第三首曲目播放之前就開始播放。我想說的是「第一首歌曲,正好在5個週期中播放,第二曲目正好在4個週期中播放,第三曲目正好在3個週期中播放......等等,這樣他們就可以同時播放。正確的做法嗎?如果是這樣,你的startTime.mSampleTime設置什麼樣的價值?我還沒有找到,告訴我如何做到這一點的任何文檔。謝謝如何設置多個文件播放器音頻單元同時啓動?

// tell the file player AU when to start playing (-1 sample time means next render cycle) 
    AudioTimeStamp startTime; 
    memset (&startTime, 0, sizeof(startTime)); 
    startTime.mFlags = kAudioTimeStampSampleTimeValid; 
    startTime.mSampleTime = -1; 
    AudioUnitSetProperty(fileUnitArray[mycount], kAudioUnitProperty_ScheduleStartTimeStamp, kAudioUnitScope_Global, 0, &startTime, sizeof(startTime)); 

回答

0

我無法追查上設置任何信息mSampleTime到任何其他值,然後-1(即在下一個週期開始),但我能夠解決問題,而不是保持AUGraph運行,使用AudioUnitReset重置文件播放器音頻單元,然後使用上面的代碼重新啓動文件播放器,我存儲當前文件播放器的播放頭位置,完全停止AUGraph,用當前的AURraph重新初始化播放頭位置,而不是告訴它從零開始,然後重新啓動AUGRAPH。

+0

重新啓動AUGraph是矯枉過正。你不需要那樣做。 – 2017-09-22 00:10:49

0

你需要做的是安排從渲染線程回放音頻文件。 您將文件加載到不同的線程中,但您告訴文件要在渲染線程的下一個渲染週期中播放。這樣,所有的文件將同時啓動。

+0

當你說「你在不同的線程上加載文件」時,你能解釋一下你的意思嗎?我是CoreAudio的新手,我想知道我們如何做到這一點。 – DEADBEEF 2017-08-09 12:34:02

+0

請先閱讀本文http://www.rossbencina.com/code/real-time-audio-programming-101-time-waits-for-nothing – 2017-08-09 18:35:00

+0

這些東西相當複雜。如果您想播放短文件,請使用AUSampler並製作一個自定義樂器,其中包含所有聲音文件。這樣你就可以用midi音符來觸發它。基本上我使用pthread庫來啓動一個新線程,然後讓線程休眠。然後當我需要加載一個新文件時,我使用非阻塞消息發送來告訴線程喚醒並加載文件。然後我使用非阻塞操作來告訴AUFilePlayer在下一個渲染週期開始播放。讓它工作並同步是非常棘手的,但它是可能的。 – 2017-08-09 18:38:08

相關問題