SuperpoweredAdvancedAudioPlayer
内置节拍同步效果很好。但我希望将播放器同步到我的节拍器的绝对位置,并尝试通过在每个处理循环中使用播放器setPosition (double ms, bool andStop, bool synchronisedStart)
方法设置此位置来实现此目的。只要玩家以原始bpm播放,这就有效。当我改变速度并且播放时间延长时,我得到了失真的音频。
我尝试将位置设置为主人的位置以及玩家原始速度的计算位置(masterPositionMs
* playerBpm
/ masterBpm
)。我还尝试了打开和关闭节拍同步。
我做错了什么?有没有更好的方法来进行绝对同步?
bool MyAudioSession::process(short int *in_out, unsigned int numberOfInputSamples) {
float currentBPM = metronome->getBpm();
double msElapsedSinceLastMasterBeat = metronome->getMsElapsedSinceLastBeat();
double msPositionMaster = metronome->getPositionMs();
bool silence = true;
if(metronome->process(stereoOutputBuffer, !silence, numberOfInputSamples, volMetronome))
silence = false;
for (int i = 0; i < audioPlayers.size(); i++) {
if(audioPlayers[i]->playing) {
audioPlayers[i]->setPosition(
(msPositionMaster * audioPlayers[i]->bpm / currentBPM) + audioPlayers[i]->firstBeatMs,
!metronome->isPlaying(),
SYNCHRONISED_START);
}
if(audioPlayers[i]->process(stereoOutputBuffer, !silence, numberOfInputSamples, audioPlayers[i]->volume, currentBPM, msElapsedSinceLastMasterBeat))
silence = false;
}
[...]
答案 0 :(得分:0)
不需要setPosition,播放器将同步到下一个节拍。只需调用play(true)即可重新同步。