void UpdateSampleRateIfNeeded(AudioNodeStream* aStream, uint32_t aChannels) { if (mPlaybackRateTimeline.HasSimpleValue()) { mPlaybackRate = mPlaybackRateTimeline.GetValue(); } else { mPlaybackRate = mPlaybackRateTimeline.GetValueAtTime(aStream->GetCurrentPosition()); } // Make sure the playback rate and the doppler shift are something // our resampler can work with. if (ComputeFinalOutSampleRate(aStream->SampleRate()) == 0) { mPlaybackRate = 1.0; mDopplerShift = 1.0; } uint32_t currentOutSampleRate, currentInSampleRate; if (ShouldResample(aStream->SampleRate())) { SpeexResamplerState* resampler = Resampler(aStream, aChannels); speex_resampler_get_rate(resampler, ¤tInSampleRate, ¤tOutSampleRate); uint32_t finalSampleRate = ComputeFinalOutSampleRate(aStream->SampleRate()); if (currentOutSampleRate != finalSampleRate) { speex_resampler_set_rate(resampler, currentInSampleRate, finalSampleRate); } } }
void UpdateSampleRateIfNeeded(uint32_t aChannels) { float playbackRate; if (mPlaybackRateTimeline.HasSimpleValue()) { playbackRate = mPlaybackRateTimeline.GetValue(); } else { playbackRate = mPlaybackRateTimeline.GetValueAtTime(mSource->GetCurrentPosition()); } if (playbackRate <= 0 || playbackRate != playbackRate) { playbackRate = 1.0f; } int32_t outRate = ComputeFinalOutSampleRate(playbackRate); UpdateResampler(outRate, aChannels); }
void UpdateSampleRateIfNeeded(uint32_t aChannels, StreamTime aStreamPosition) { float playbackRate; float detune; if (mPlaybackRateTimeline.HasSimpleValue()) { playbackRate = mPlaybackRateTimeline.GetValue(); } else { playbackRate = mPlaybackRateTimeline.GetValueAtTime(aStreamPosition); } if (mDetuneTimeline.HasSimpleValue()) { detune = mDetuneTimeline.GetValue(); } else { detune = mDetuneTimeline.GetValueAtTime(aStreamPosition); } if (playbackRate <= 0 || mozilla::IsNaN(playbackRate)) { playbackRate = 1.0f; } detune = std::min(std::max(-1200.f, detune), 1200.f); int32_t outRate = ComputeFinalOutSampleRate(playbackRate, detune); UpdateResampler(outRate, aChannels); }