audio_renderer_mixer.cc 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "media/base/audio_renderer_mixer.h"
  5. #include <cmath>
  6. #include "base/check_op.h"
  7. #include "base/memory/ptr_util.h"
  8. #include "base/time/time.h"
  9. #include "base/trace_event/trace_event.h"
  10. #include "media/base/audio_renderer_mixer_input.h"
  11. #include "media/base/audio_timestamp_helper.h"
  12. namespace media {
  13. constexpr base::TimeDelta kPauseDelay = base::Seconds(10);
  14. AudioRendererMixer::AudioRendererMixer(const AudioParameters& output_params,
  15. scoped_refptr<AudioRendererSink> sink)
  16. : output_params_(output_params),
  17. audio_sink_(std::move(sink)),
  18. aggregate_converter_(output_params, output_params, true),
  19. pause_delay_(kPauseDelay),
  20. last_play_time_(base::TimeTicks::Now()),
  21. // Initialize |playing_| to true since Start() results in an auto-play.
  22. playing_(true) {
  23. DCHECK(audio_sink_);
  24. // If enabled we will disable the real audio output stream for muted/silent
  25. // playbacks after some time elapses.
  26. RenderCallback* callback = this;
  27. audio_sink_->Initialize(output_params, callback);
  28. audio_sink_->Start();
  29. }
  30. AudioRendererMixer::~AudioRendererMixer() {
  31. // AudioRendererSink must be stopped before mixer is destructed.
  32. audio_sink_->Stop();
  33. // Ensure that all mixer inputs have removed themselves prior to destruction.
  34. DCHECK(aggregate_converter_.empty());
  35. DCHECK(converters_.empty());
  36. DCHECK(error_callbacks_.empty());
  37. }
  38. void AudioRendererMixer::AddMixerInput(const AudioParameters& input_params,
  39. AudioConverter::InputCallback* input) {
  40. base::AutoLock auto_lock(lock_);
  41. if (!playing_) {
  42. playing_ = true;
  43. last_play_time_ = base::TimeTicks::Now();
  44. audio_sink_->Play();
  45. }
  46. int input_sample_rate = input_params.sample_rate();
  47. if (can_passthrough(input_sample_rate)) {
  48. aggregate_converter_.AddInput(input);
  49. } else {
  50. auto converter = converters_.find(input_sample_rate);
  51. if (converter == converters_.end()) {
  52. std::pair<AudioConvertersMap::iterator, bool> result =
  53. converters_.insert(std::make_pair(
  54. input_sample_rate, std::make_unique<LoopbackAudioConverter>(
  55. // We expect all InputCallbacks to be
  56. // capable of handling arbitrary buffer
  57. // size requests, disabling FIFO.
  58. input_params, output_params_, true)));
  59. converter = result.first;
  60. // Add newly-created resampler as an input to the aggregate mixer.
  61. aggregate_converter_.AddInput(converter->second.get());
  62. }
  63. converter->second->AddInput(input);
  64. }
  65. }
  66. void AudioRendererMixer::RemoveMixerInput(
  67. const AudioParameters& input_params,
  68. AudioConverter::InputCallback* input) {
  69. base::AutoLock auto_lock(lock_);
  70. int input_sample_rate = input_params.sample_rate();
  71. if (can_passthrough(input_sample_rate)) {
  72. aggregate_converter_.RemoveInput(input);
  73. } else {
  74. auto converter = converters_.find(input_sample_rate);
  75. DCHECK(converter != converters_.end());
  76. converter->second->RemoveInput(input);
  77. if (converter->second->empty()) {
  78. // Remove converter when it's empty.
  79. aggregate_converter_.RemoveInput(converter->second.get());
  80. converters_.erase(converter);
  81. }
  82. }
  83. }
  84. void AudioRendererMixer::AddErrorCallback(AudioRendererMixerInput* input) {
  85. base::AutoLock auto_lock(lock_);
  86. error_callbacks_.insert(input);
  87. }
  88. void AudioRendererMixer::RemoveErrorCallback(AudioRendererMixerInput* input) {
  89. base::AutoLock auto_lock(lock_);
  90. error_callbacks_.erase(input);
  91. }
  92. bool AudioRendererMixer::CurrentThreadIsRenderingThread() {
  93. return audio_sink_->CurrentThreadIsRenderingThread();
  94. }
  95. void AudioRendererMixer::SetPauseDelayForTesting(base::TimeDelta delay) {
  96. base::AutoLock auto_lock(lock_);
  97. pause_delay_ = delay;
  98. }
  99. int AudioRendererMixer::Render(base::TimeDelta delay,
  100. base::TimeTicks delay_timestamp,
  101. int prior_frames_skipped,
  102. AudioBus* audio_bus) {
  103. TRACE_EVENT0("audio", "AudioRendererMixer::Render");
  104. base::AutoLock auto_lock(lock_);
  105. // If there are no mixer inputs and we haven't seen one for a while, pause the
  106. // sink to avoid wasting resources when media elements are present but remain
  107. // in the pause state.
  108. const base::TimeTicks now = base::TimeTicks::Now();
  109. if (!aggregate_converter_.empty()) {
  110. last_play_time_ = now;
  111. } else if (now - last_play_time_ >= pause_delay_ && playing_) {
  112. audio_sink_->Pause();
  113. playing_ = false;
  114. }
  115. // Since AudioConverter uses uint32_t for delay calculations, we must drop
  116. // negative delay values (which are incorrect anyways).
  117. if (delay.is_negative())
  118. delay = base::TimeDelta();
  119. uint32_t frames_delayed =
  120. AudioTimestampHelper::TimeToFrames(delay, output_params_.sample_rate());
  121. aggregate_converter_.ConvertWithDelay(frames_delayed, audio_bus);
  122. return audio_bus->frames();
  123. }
  124. void AudioRendererMixer::OnRenderError() {
  125. // Call each mixer input and signal an error.
  126. base::AutoLock auto_lock(lock_);
  127. for (auto* input : error_callbacks_)
  128. input->OnRenderError();
  129. }
  130. } // namespace media