| Index: content/renderer/media/audio_renderer_mixer_manager.cc
|
| diff --git a/content/renderer/media/audio_renderer_mixer_manager.cc b/content/renderer/media/audio_renderer_mixer_manager.cc
|
| index 71fafcbdd81ca6a6835dcc0e7c2b7526251ab495..49ff4437b28aa7ba50278074b6226510b40e6dee 100644
|
| --- a/content/renderer/media/audio_renderer_mixer_manager.cc
|
| +++ b/content/renderer/media/audio_renderer_mixer_manager.cc
|
| @@ -6,18 +6,26 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| +// #include "content/renderer/media/audio_hardware.h"
|
| #include "content/renderer/media/audio_device_factory.h"
|
| #include "content/renderer/media/renderer_audio_output_device.h"
|
| #include "media/base/audio_renderer_mixer.h"
|
| #include "media/base/audio_renderer_mixer_input.h"
|
| +#include "media/base/audio_hardware_config.h"
|
|
|
| namespace content {
|
|
|
| -AudioRendererMixerManager::AudioRendererMixerManager(int hardware_sample_rate,
|
| - int hardware_buffer_size)
|
| - : hardware_sample_rate_(hardware_sample_rate),
|
| - hardware_buffer_size_(hardware_buffer_size),
|
| +// AudioRendererMixerManager::AudioRendererMixerManager(int hardware_sample_rate,
|
| +// int hardware_buffer_size)
|
| +// : hardware_sample_rate_(hardware_sample_rate),
|
| +// hardware_buffer_size_(hardware_buffer_size),
|
| +AudioRendererMixerManager::AudioRendererMixerManager(
|
| + media::AudioHardwareConfig* hardware_config)
|
| + : hardware_config_(hardware_config),
|
| sink_for_testing_(NULL) {
|
| + // TODO(dalecurtis): Fix this so that buffer size and sample rate are only
|
| + // passed in for testing. Though RendererViewImpl still needs to initialize
|
| + // the AudioHardware cache...
|
| }
|
|
|
| AudioRendererMixerManager::~AudioRendererMixerManager() {
|
| @@ -46,32 +54,48 @@ media::AudioRendererMixer* AudioRendererMixerManager::GetMixer(
|
| const MixerKey key(source_render_view_id, params);
|
| base::AutoLock auto_lock(mixers_lock_);
|
|
|
| - AudioRendererMixerMap::iterator it = mixers_.find(key);
|
| - if (it != mixers_.end()) {
|
| - it->second.ref_count++;
|
| - return it->second.mixer;
|
| - }
|
| + // AudioRendererMixerMap::iterator it = mixers_.find(key);
|
| + // if (it != mixers_.end()) {
|
| + // it->second.ref_count++;
|
| + // return it->second.mixer;
|
| + // }
|
| +
|
| + LOG(ERROR) << "Getting mixer...";
|
|
|
| // On Linux and ChromeOS we can rely on the playback device to handle
|
| // resampling, so don't waste cycles on it here.
|
| -#if defined(OS_LINUX)
|
| - int sample_rate = params.sample_rate();
|
| -#else
|
| - int sample_rate = hardware_sample_rate_;
|
| -#endif
|
| +// #if defined(OS_LINUX)
|
| +// int sample_rate = params.sample_rate();
|
| +// #else
|
| +// int sample_rate = hardware_sample_rate_;
|
| +// #endif
|
|
|
| // Create output parameters based on the audio hardware configuration for
|
| // passing on to the output sink. Force to 16-bit output for now since we
|
| // know that works well for WebAudio and WebRTC.
|
| media::AudioParameters output_params(
|
| media::AudioParameters::AUDIO_PCM_LOW_LATENCY, params.channel_layout(),
|
| - sample_rate, 16, hardware_buffer_size_);
|
| + // hardware_sample_rate_, 16, hardware_buffer_size_);
|
| + hardware_config_->GetOutputSampleRate(), 16,
|
| + hardware_config_->GetOutputBufferSize());
|
| +
|
| + // GetAudioOutputSampleRate(), 16, GetAudioOutputBufferSize());
|
| + // TODO(justinlin): Fix and uncomment the above.
|
| + LOG(ERROR) << "GetAudioOutputSampleRate() and GetAudioOutputBufferSize() will"
|
| + << " fail if no cache exists since we're not on the RenderThread!";
|
|
|
| // If we've created invalid output parameters, simply pass on the input params
|
| // and let the browser side handle automatic fallback.
|
| if (!output_params.IsValid())
|
| output_params = params;
|
|
|
| + IOParamsKey mixer_key = std::make_pair(params, output_params);
|
| + AudioRendererMixerMap::iterator it = mixers_.find(mixer_key);
|
| + if (it != mixers_.end()) {
|
| + it->second.ref_count++;
|
| + return it->second.mixer;
|
| + }
|
| +
|
| media::AudioRendererMixer* mixer;
|
| if (sink_for_testing_) {
|
| mixer = new media::AudioRendererMixer(
|
| @@ -84,17 +108,25 @@ media::AudioRendererMixer* AudioRendererMixerManager::GetMixer(
|
| }
|
|
|
| AudioRendererMixerReference mixer_reference = { mixer, 1 };
|
| - mixers_[key] = mixer_reference;
|
| + // mixers_[key] = mixer_reference;
|
| + mixers_[mixer_key] = mixer_reference;
|
| return mixer;
|
| }
|
|
|
| void AudioRendererMixerManager::RemoveMixer(
|
| int source_render_view_id,
|
| - const media::AudioParameters& params) {
|
| - const MixerKey key(source_render_view_id, params);
|
| + media::AudioRendererMixer* mixer/*const media::AudioParameters& params*/) {
|
| +// +void AudioRendererMixerManager::RemoveMixer(media::AudioRendererMixer* mixer) {
|
| + // base::AutoLock auto_lock(mixers_lock_);
|
| +
|
| + // const MixerKey key(source_render_view_id, params);
|
| base::AutoLock auto_lock(mixers_lock_);
|
|
|
| - AudioRendererMixerMap::iterator it = mixers_.find(key);
|
| + // AudioRendererMixerMap::iterator it = mixers_.find(key);
|
| + IOParamsKey mixer_key = std::make_pair(
|
| + mixer->input_params(), mixer->output_params());
|
| +
|
| + AudioRendererMixerMap::iterator it = mixers_.find(mixer_key);
|
| DCHECK(it != mixers_.end());
|
|
|
| // Only remove the mixer if AudioRendererMixerManager is the last owner.
|
|
|