OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/media/audio_device.h" | 5 #include "content/renderer/media/audio_device.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/threading/thread_restrictions.h" | 9 #include "base/threading/thread_restrictions.h" |
10 #include "base/time.h" | 10 #include "base/time.h" |
11 #include "content/common/child_process.h" | 11 #include "content/common/child_process.h" |
12 #include "content/common/media/audio_messages.h" | 12 #include "content/common/media/audio_messages.h" |
13 #include "content/common/view_messages.h" | 13 #include "content/common/view_messages.h" |
14 #include "content/renderer/render_thread_impl.h" | 14 #include "content/renderer/render_thread_impl.h" |
15 #include "media/audio/audio_output_controller.h" | 15 #include "media/audio/audio_output_controller.h" |
16 #include "media/audio/audio_util.h" | 16 #include "media/audio/audio_util.h" |
17 | 17 |
18 using media::AudioRendererSink; | 18 using media::AudioRendererSink; |
19 | 19 |
20 // Takes care of invoking the render callback on the audio thread. | 20 // Takes care of invoking the render callback on the audio thread. |
21 // An instance of this class is created for each capture stream in | 21 // An instance of this class is created for each capture stream in |
22 // OnStreamCreated(). | 22 // OnStreamCreated(). |
23 class AudioDevice::AudioThreadCallback | 23 class AudioDevice::AudioThreadCallback |
24 : public AudioDeviceThread::Callback { | 24 : public AudioDeviceThread::Callback { |
25 public: | 25 public: |
26 AudioThreadCallback(const AudioParameters& audio_parameters, | 26 AudioThreadCallback(const media::AudioParameters& audio_parameters, |
27 base::SharedMemoryHandle memory, | 27 base::SharedMemoryHandle memory, |
28 int memory_length, | 28 int memory_length, |
29 AudioRendererSink::RenderCallback* render_callback); | 29 AudioRendererSink::RenderCallback* render_callback); |
30 virtual ~AudioThreadCallback(); | 30 virtual ~AudioThreadCallback(); |
31 | 31 |
32 virtual void MapSharedMemory() OVERRIDE; | 32 virtual void MapSharedMemory() OVERRIDE; |
33 | 33 |
34 // Called whenever we receive notifications about pending data. | 34 // Called whenever we receive notifications about pending data. |
35 virtual void Process(int pending_data) OVERRIDE; | 35 virtual void Process(int pending_data) OVERRIDE; |
36 | 36 |
37 private: | 37 private: |
38 AudioRendererSink::RenderCallback* render_callback_; | 38 AudioRendererSink::RenderCallback* render_callback_; |
39 DISALLOW_COPY_AND_ASSIGN(AudioThreadCallback); | 39 DISALLOW_COPY_AND_ASSIGN(AudioThreadCallback); |
40 }; | 40 }; |
41 | 41 |
42 AudioDevice::AudioDevice() | 42 AudioDevice::AudioDevice() |
43 : ScopedLoopObserver(ChildProcess::current()->io_message_loop()), | 43 : ScopedLoopObserver(ChildProcess::current()->io_message_loop()), |
44 callback_(NULL), | 44 callback_(NULL), |
45 volume_(1.0), | 45 volume_(1.0), |
46 stream_id_(0), | 46 stream_id_(0), |
47 play_on_start_(true), | 47 play_on_start_(true), |
48 is_started_(false) { | 48 is_started_(false) { |
49 filter_ = RenderThreadImpl::current()->audio_message_filter(); | 49 filter_ = RenderThreadImpl::current()->audio_message_filter(); |
50 } | 50 } |
51 | 51 |
52 AudioDevice::AudioDevice(const AudioParameters& params, | 52 AudioDevice::AudioDevice(const media::AudioParameters& params, |
53 RenderCallback* callback) | 53 RenderCallback* callback) |
54 : ScopedLoopObserver(ChildProcess::current()->io_message_loop()), | 54 : ScopedLoopObserver(ChildProcess::current()->io_message_loop()), |
55 audio_parameters_(params), | 55 audio_parameters_(params), |
56 callback_(callback), | 56 callback_(callback), |
57 volume_(1.0), | 57 volume_(1.0), |
58 stream_id_(0), | 58 stream_id_(0), |
59 play_on_start_(true), | 59 play_on_start_(true), |
60 is_started_(false) { | 60 is_started_(false) { |
61 filter_ = RenderThreadImpl::current()->audio_message_filter(); | 61 filter_ = RenderThreadImpl::current()->audio_message_filter(); |
62 } | 62 } |
63 | 63 |
64 void AudioDevice::Initialize(const AudioParameters& params, | 64 void AudioDevice::Initialize(const media::AudioParameters& params, |
65 RenderCallback* callback) { | 65 RenderCallback* callback) { |
66 CHECK_EQ(0, stream_id_) << | 66 CHECK_EQ(0, stream_id_) << |
67 "AudioDevice::Initialize() must be called before Start()"; | 67 "AudioDevice::Initialize() must be called before Start()"; |
68 | 68 |
69 CHECK(!callback_); // Calling Initialize() twice? | 69 CHECK(!callback_); // Calling Initialize() twice? |
70 | 70 |
71 audio_parameters_ = params; | 71 audio_parameters_ = params; |
72 callback_ = callback; | 72 callback_ = callback; |
73 } | 73 } |
74 | 74 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 volume_ = volume; | 116 volume_ = volume; |
117 | 117 |
118 return true; | 118 return true; |
119 } | 119 } |
120 | 120 |
121 void AudioDevice::GetVolume(double* volume) { | 121 void AudioDevice::GetVolume(double* volume) { |
122 // Return a locally cached version of the current scaling factor. | 122 // Return a locally cached version of the current scaling factor. |
123 *volume = volume_; | 123 *volume = volume_; |
124 } | 124 } |
125 | 125 |
126 void AudioDevice::InitializeOnIOThread(const AudioParameters& params) { | 126 void AudioDevice::InitializeOnIOThread(const media::AudioParameters& params) { |
127 DCHECK(message_loop()->BelongsToCurrentThread()); | 127 DCHECK(message_loop()->BelongsToCurrentThread()); |
128 // Make sure we don't create the stream more than once. | 128 // Make sure we don't create the stream more than once. |
129 DCHECK_EQ(0, stream_id_); | 129 DCHECK_EQ(0, stream_id_); |
130 if (stream_id_) | 130 if (stream_id_) |
131 return; | 131 return; |
132 | 132 |
133 stream_id_ = filter_->AddDelegate(this); | 133 stream_id_ = filter_->AddDelegate(this); |
134 Send(new AudioHostMsg_CreateStream(stream_id_, params)); | 134 Send(new AudioHostMsg_CreateStream(stream_id_, params)); |
135 } | 135 } |
136 | 136 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 } | 248 } |
249 | 249 |
250 void AudioDevice::WillDestroyCurrentMessageLoop() { | 250 void AudioDevice::WillDestroyCurrentMessageLoop() { |
251 LOG(ERROR) << "IO loop going away before the audio device has been stopped"; | 251 LOG(ERROR) << "IO loop going away before the audio device has been stopped"; |
252 ShutDownOnIOThread(); | 252 ShutDownOnIOThread(); |
253 } | 253 } |
254 | 254 |
255 // AudioDevice::AudioThreadCallback | 255 // AudioDevice::AudioThreadCallback |
256 | 256 |
257 AudioDevice::AudioThreadCallback::AudioThreadCallback( | 257 AudioDevice::AudioThreadCallback::AudioThreadCallback( |
258 const AudioParameters& audio_parameters, | 258 const media::AudioParameters& audio_parameters, |
259 base::SharedMemoryHandle memory, | 259 base::SharedMemoryHandle memory, |
260 int memory_length, | 260 int memory_length, |
261 media::AudioRendererSink::RenderCallback* render_callback) | 261 media::AudioRendererSink::RenderCallback* render_callback) |
262 : AudioDeviceThread::Callback(audio_parameters, memory, memory_length), | 262 : AudioDeviceThread::Callback(audio_parameters, memory, memory_length), |
263 render_callback_(render_callback) { | 263 render_callback_(render_callback) { |
264 } | 264 } |
265 | 265 |
266 AudioDevice::AudioThreadCallback::~AudioThreadCallback() { | 266 AudioDevice::AudioThreadCallback::~AudioThreadCallback() { |
267 } | 267 } |
268 | 268 |
(...skipping 24 matching lines...) Expand all Loading... |
293 // to the browser process as float, so we don't lose precision for | 293 // to the browser process as float, so we don't lose precision for |
294 // audio hardware which has better than 16bit precision. | 294 // audio hardware which has better than 16bit precision. |
295 int16* data = reinterpret_cast<int16*>(shared_memory_.memory()); | 295 int16* data = reinterpret_cast<int16*>(shared_memory_.memory()); |
296 media::InterleaveFloatToInt16(audio_data_, data, | 296 media::InterleaveFloatToInt16(audio_data_, data, |
297 audio_parameters_.frames_per_buffer()); | 297 audio_parameters_.frames_per_buffer()); |
298 | 298 |
299 // Let the host know we are done. | 299 // Let the host know we are done. |
300 media::SetActualDataSizeInBytes(&shared_memory_, memory_length_, | 300 media::SetActualDataSizeInBytes(&shared_memory_, memory_length_, |
301 num_frames * audio_parameters_.channels() * sizeof(data[0])); | 301 num_frames * audio_parameters_.channels() * sizeof(data[0])); |
302 } | 302 } |
OLD | NEW |