将超能力高级音频播放器同步到绝对位置

Syncing SuperpoweredAdvancedAudioPlayer to absolute position

本文关键字:位置 同步 播放器 超能力 高级 音频      更新时间:2023-10-16

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;
  }
[...]

不需要 setPosition,播放器将同步到下一个节拍。只需调用 play(true( 即可重新同步。