@@ -188,13 +188,19 @@ AudioTrackAudioSink::~AudioTrackAudioSink() {
188188
189189void AudioTrackAudioSink::SetPlaybackRate (double playback_rate) {
190190 SB_DCHECK_GE (playback_rate, 0.0 );
191- if (playback_rate != 0.0 && playback_rate != 1.0 ) {
192- SB_NOTIMPLEMENTED () << " TODO: Only playback rates of 0.0 and 1.0 are "
193- " currently supported." ;
194- playback_rate = (playback_rate > 0.0 ) ? 1.0 : 0.0 ;
191+ SB_DLOG (INFO) << " Set playback rate to " << playback_rate;
192+
193+ {
194+ std::lock_guard lock (mutex_);
195+ playback_rate_ = playback_rate;
196+ }
197+
198+ // AudioTrack doesn't support playback speed of 0.
199+ if (playback_rate > 0.0 ) {
200+ // AudioTrackBridge.setPlaybackRate() currently is only enabled for tunnel
201+ // mode. It will be no-op for non tunnel player.
202+ bridge_.SetPlaybackRate (playback_rate);
195203 }
196- std::lock_guard lock (mutex_);
197- playback_rate_ = playback_rate;
198204}
199205
200206// TODO: Break down the function into manageable pieces.
@@ -439,6 +445,21 @@ int AudioTrackAudioSinkType::GetMinBufferSizeInFrames(
439445 int sampling_frequency_hz) {
440446 SB_CHECK (audio_track_audio_sink_type_);
441447 JNIEnv* env = AttachCurrentThread ();
448+
449+ const bool force_tunnel_mode =
450+ features::FeatureList::IsEnabled (features::kForceTunnelMode );
451+ if (force_tunnel_mode) {
452+ // AudioTrack.setPlaybackParams() needs extra buffer to support playback
453+ // speed greater than 1.0x.
454+ const double kMaxPlaybackSpeed = 2.0 ;
455+ return std::max<int >(
456+ AudioOutputManager::GetInstance ()->GetMinBufferSizeInFrames (
457+ env, sample_type, channels, sampling_frequency_hz),
458+ audio_track_audio_sink_type_->GetMinBufferSizeInFramesInternal (
459+ channels, sample_type, sampling_frequency_hz) *
460+ kMaxPlaybackSpeed );
461+ }
462+
442463 return std::max (
443464 AudioOutputManager::GetInstance ()->GetMinBufferSizeInFrames (
444465 env, sample_type, channels, sampling_frequency_hz),
0 commit comments