2012-07-24 18 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