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

Side by Side Diff: ppapi/shared_impl/ppb_audio_shared.cc

Issue 22886005: Switch audio synchronization from sleep() based to select() based. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix DCHECK. Created 7 years, 1 month 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 | « ppapi/proxy/ppb_audio_proxy.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "ppapi/shared_impl/ppb_audio_shared.h" 5 #include "ppapi/shared_impl/ppb_audio_shared.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "media/audio/shared_memory_util.h"
9 #include "ppapi/shared_impl/ppapi_globals.h" 8 #include "ppapi/shared_impl/ppapi_globals.h"
10 #include "ppapi/shared_impl/ppb_audio_config_shared.h" 9 #include "ppapi/shared_impl/ppb_audio_config_shared.h"
11 #include "ppapi/shared_impl/proxy_lock.h" 10 #include "ppapi/shared_impl/proxy_lock.h"
12 11
13 namespace ppapi { 12 namespace ppapi {
14 13
15 #if defined(OS_NACL) 14 #if defined(OS_NACL)
16 namespace { 15 namespace {
17 // Because this is static, the function pointers will be NULL initially. 16 // Because this is static, the function pointers will be NULL initially.
18 PP_ThreadFunctions thread_functions; 17 PP_ThreadFunctions thread_functions;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 size_t shared_memory_size, 106 size_t shared_memory_size,
108 base::SyncSocket::Handle socket_handle, 107 base::SyncSocket::Handle socket_handle,
109 PP_AudioSampleRate sample_rate, 108 PP_AudioSampleRate sample_rate,
110 int sample_frame_count) { 109 int sample_frame_count) {
111 socket_.reset(new base::CancelableSyncSocket(socket_handle)); 110 socket_.reset(new base::CancelableSyncSocket(socket_handle));
112 shared_memory_.reset(new base::SharedMemory(shared_memory_handle, false)); 111 shared_memory_.reset(new base::SharedMemory(shared_memory_handle, false));
113 shared_memory_size_ = shared_memory_size; 112 shared_memory_size_ = shared_memory_size;
114 bytes_per_second_ = kAudioOutputChannels * (kBitsPerAudioOutputSample / 8) * 113 bytes_per_second_ = kAudioOutputChannels * (kBitsPerAudioOutputSample / 8) *
115 sample_rate; 114 sample_rate;
116 115
117 if (!shared_memory_->Map( 116 if (!shared_memory_->Map(shared_memory_size_)) {
118 media::TotalSharedMemorySizeInBytes(shared_memory_size_))) {
119 PpapiGlobals::Get()->LogWithSource( 117 PpapiGlobals::Get()->LogWithSource(
120 instance, 118 instance,
121 PP_LOGLEVEL_WARNING, 119 PP_LOGLEVEL_WARNING,
122 std::string(), 120 std::string(),
123 "Failed to map shared memory for PPB_Audio_Shared."); 121 "Failed to map shared memory for PPB_Audio_Shared.");
124 } else { 122 } else {
125 audio_bus_ = media::AudioBus::WrapMemory( 123 audio_bus_ = media::AudioBus::WrapMemory(
126 kAudioOutputChannels, sample_frame_count, shared_memory_->memory()); 124 kAudioOutputChannels, sample_frame_count, shared_memory_->memory());
127 // Setup integer audio buffer for user audio data. 125 // Setup integer audio buffer for user audio data.
128 client_buffer_size_bytes_ = 126 client_buffer_size_bytes_ =
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 } 194 }
197 195
198 // static 196 // static
199 void PPB_Audio_Shared::CallRun(void* self) { 197 void PPB_Audio_Shared::CallRun(void* self) {
200 PPB_Audio_Shared* audio = static_cast<PPB_Audio_Shared*>(self); 198 PPB_Audio_Shared* audio = static_cast<PPB_Audio_Shared*>(self);
201 audio->Run(); 199 audio->Run();
202 } 200 }
203 #endif 201 #endif
204 202
205 void PPB_Audio_Shared::Run() { 203 void PPB_Audio_Shared::Run() {
206 int pending_data; 204 int pending_data = 0;
207 const int bytes_per_frame = 205 uint32_t buffer_index = 0;
208 sizeof(*audio_bus_->channel(0)) * audio_bus_->channels();
209
210 while (sizeof(pending_data) == 206 while (sizeof(pending_data) ==
211 socket_->Receive(&pending_data, sizeof(pending_data)) && 207 socket_->Receive(&pending_data, sizeof(pending_data)) &&
212 pending_data != media::kPauseMark) { 208 pending_data >= 0) {
213 PP_TimeDelta latency = 209 PP_TimeDelta latency =
214 static_cast<double>(pending_data) / bytes_per_second_; 210 static_cast<double>(pending_data) / bytes_per_second_;
215 callback_.Run(client_buffer_.get(), client_buffer_size_bytes_, latency, 211 callback_.Run(client_buffer_.get(), client_buffer_size_bytes_, latency,
216 user_data_); 212 user_data_);
217 213
218 // Deinterleave the audio data into the shared memory as float. 214 // Deinterleave the audio data into the shared memory as float.
219 audio_bus_->FromInterleaved( 215 audio_bus_->FromInterleaved(
220 client_buffer_.get(), audio_bus_->frames(), 216 client_buffer_.get(), audio_bus_->frames(),
221 kBitsPerAudioOutputSample / 8); 217 kBitsPerAudioOutputSample / 8);
222 218
223 // Let the host know we are done. 219 ++buffer_index;
224 // TODO(dalecurtis): Technically this is not the exact size. Due to channel 220 size_t bytes_sent = socket_->Send(&buffer_index, sizeof(buffer_index));
225 // padding for alignment, there may be more data available than this. We're 221 if (bytes_sent != sizeof(buffer_index))
226 // relying on AudioSyncReader::Read() to parse this with that in mind. 222 break;
227 // Rename these methods to Set/GetActualFrameCount().
228 media::SetActualDataSizeInBytes(
229 shared_memory_.get(), shared_memory_size_,
230 audio_bus_->frames() * bytes_per_frame);
231 } 223 }
232 } 224 }
233 225
234 } // namespace ppapi 226 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/proxy/ppb_audio_proxy.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698