Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1311)

Side by Side Diff: chrome/renderer/audio_device.cc

Issue 6703003: Move a bunch of html5 renderer code to content. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/renderer/audio_device.h ('k') | chrome/renderer/audio_message_filter.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2010 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
5 #include "chrome/renderer/audio_device.h"
6
7 #include "base/singleton.h"
8 #include "chrome/common/render_messages.h"
9 #include "chrome/common/render_messages_params.h"
10 #include "chrome/renderer/render_thread.h"
11 #include "media/audio/audio_util.h"
12
13 scoped_refptr<AudioMessageFilter> AudioDevice::filter_;
14
15 namespace {
16
17 // AudioMessageFilterCreator is intended to be used as a singleton so we can
18 // get access to a shared AudioMessageFilter.
19 // Example usage:
20 // AudioMessageFilter* filter = AudioMessageFilterCreator::SharedFilter();
21
22 class AudioMessageFilterCreator {
23 public:
24 AudioMessageFilterCreator() {
25 int routing_id;
26 RenderThread::current()->Send(
27 new ViewHostMsg_GenerateRoutingID(&routing_id));
28 filter_ = new AudioMessageFilter(routing_id);
29 RenderThread::current()->AddFilter(filter_);
30 }
31
32 static AudioMessageFilter* SharedFilter() {
33 return GetInstance()->filter_.get();
34 }
35
36 static AudioMessageFilterCreator* GetInstance() {
37 return Singleton<AudioMessageFilterCreator>::get();
38 }
39
40 private:
41 scoped_refptr<AudioMessageFilter> filter_;
42 };
43
44 }
45
46 AudioDevice::AudioDevice(size_t buffer_size,
47 int channels,
48 double sample_rate,
49 RenderCallback* callback)
50 : buffer_size_(buffer_size),
51 channels_(channels),
52 sample_rate_(sample_rate),
53 callback_(callback),
54 stream_id_(0) {
55 audio_data_.reserve(channels);
56 for (int i = 0; i < channels; ++i) {
57 float* channel_data = new float[buffer_size];
58 audio_data_.push_back(channel_data);
59 }
60 }
61
62 AudioDevice::~AudioDevice() {
63 Stop();
64 for (int i = 0; i < channels_; ++i)
65 delete [] audio_data_[i];
66 }
67
68 bool AudioDevice::Start() {
69 // Make sure we don't call Start() more than once.
70 DCHECK_EQ(0, stream_id_);
71 if (stream_id_)
72 return false;
73
74 // Lazily create the message filter and share across AudioDevice instances.
75 filter_ = AudioMessageFilterCreator::SharedFilter();
76
77 stream_id_ = filter_->AddDelegate(this);
78
79 ViewHostMsg_Audio_CreateStream_Params params;
80 params.params.format = AudioParameters::AUDIO_PCM_LOW_LATENCY;
81 params.params.channels = channels_;
82 params.params.sample_rate = static_cast<int>(sample_rate_);
83 params.params.bits_per_sample = 16;
84 params.params.samples_per_packet = buffer_size_;
85
86 filter_->Send(
87 new ViewHostMsg_CreateAudioStream(0, stream_id_, params, true));
88
89 return true;
90 }
91
92 bool AudioDevice::Stop() {
93 if (stream_id_) {
94 OnDestroy();
95 return true;
96 }
97 return false;
98 }
99
100 void AudioDevice::OnDestroy() {
101 // Make sure we don't call destroy more than once.
102 DCHECK_NE(0, stream_id_);
103 if (!stream_id_)
104 return;
105
106 filter_->RemoveDelegate(stream_id_);
107 filter_->Send(new ViewHostMsg_CloseAudioStream(0, stream_id_));
108 stream_id_ = 0;
109 if (audio_thread_.get()) {
110 socket_->Close();
111 audio_thread_->Join();
112 }
113 }
114
115 void AudioDevice::OnRequestPacket(AudioBuffersState buffers_state) {
116 // This method does not apply to the low-latency system.
117 NOTIMPLEMENTED();
118 }
119
120 void AudioDevice::OnStateChanged(
121 const ViewMsg_AudioStreamState_Params& state) {
122 // Not needed in this simple implementation.
123 NOTIMPLEMENTED();
124 }
125
126 void AudioDevice::OnCreated(
127 base::SharedMemoryHandle handle, uint32 length) {
128 // Not needed in this simple implementation.
129 NOTIMPLEMENTED();
130 }
131
132 void AudioDevice::OnLowLatencyCreated(
133 base::SharedMemoryHandle handle,
134 base::SyncSocket::Handle socket_handle,
135 uint32 length) {
136
137 #if defined(OS_WIN)
138 DCHECK(handle);
139 DCHECK(socket_handle);
140 #else
141 DCHECK_GE(handle.fd, 0);
142 DCHECK_GE(socket_handle, 0);
143 #endif
144 DCHECK(length);
145 DCHECK(!audio_thread_.get());
146
147 // TODO(crogers) : check that length is big enough for buffer_size_
148
149 shared_memory_.reset(new base::SharedMemory(handle, false));
150 shared_memory_->Map(length);
151
152 socket_.reset(new base::SyncSocket(socket_handle));
153 // Allow the client to pre-populate the buffer.
154 FireRenderCallback();
155
156 // TODO(crogers): we could optionally set the thread to high-priority
157 audio_thread_.reset(
158 new base::DelegateSimpleThread(this, "renderer_audio_thread"));
159 audio_thread_->Start();
160
161 filter_->Send(new ViewHostMsg_PlayAudioStream(0, stream_id_));
162 }
163
164 void AudioDevice::OnVolume(double volume) {
165 // Not needed in this simple implementation.
166 NOTIMPLEMENTED();
167 }
168
169 // Our audio thread runs here.
170 void AudioDevice::Run() {
171 int pending_data;
172 while (sizeof(pending_data) == socket_->Receive(&pending_data,
173 sizeof(pending_data)) &&
174 pending_data >= 0) {
175 FireRenderCallback();
176 }
177 }
178
179 void AudioDevice::FireRenderCallback() {
180 if (callback_) {
181 // Ask client to render audio.
182 callback_->Render(audio_data_, buffer_size_);
183
184 // Interleave, scale, and clip to int16.
185 int16* output_buffer16 = static_cast<int16*>(shared_memory_data());
186 media::InterleaveFloatToInt16(audio_data_, output_buffer16, buffer_size_);
187 }
188 }
OLDNEW
« no previous file with comments | « chrome/renderer/audio_device.h ('k') | chrome/renderer/audio_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698