Chromium Code Reviews| Index: ppapi/shared_impl/ppb_audio_shared.cc |
| =================================================================== |
| --- ppapi/shared_impl/ppb_audio_shared.cc (revision 148096) |
| +++ ppapi/shared_impl/ppb_audio_shared.cc (working copy) |
| @@ -11,6 +11,13 @@ |
| namespace ppapi { |
| +#if defined(OS_NACL) |
| +namespace { |
| +// Because this is static, the function pointers will be NULL initially. |
| +PP_ThreadFunctions thread_functions; |
| +} |
| +#endif // defined(OS_NACL) |
| + |
| // FIXME: The following two functions (TotalSharedMemorySizeInBytes, |
| // SetActualDataSizeInBytes) are copied from audio_util.cc. |
| // Remove these functions once a minimal media library is provided for them. |
| @@ -37,6 +44,10 @@ |
| PPB_Audio_Shared::PPB_Audio_Shared() |
| : playing_(false), |
| shared_memory_size_(0), |
| +#if defined(OS_NACL) |
| + thread_id_(), |
|
dmichael (off chromium)
2012/07/25 03:12:26
It would be clearer to put 0 in explicitly.
bbudge
2012/07/25 12:04:37
I copied it from the SRPC code because I thought i
|
| + thread_active_(false), |
| +#endif |
| callback_(NULL), |
| user_data_(NULL) { |
| } |
| @@ -53,8 +64,11 @@ |
| void PPB_Audio_Shared::SetStartPlaybackState() { |
| DCHECK(!playing_); |
| +#if !defined(OS_NACL) |
| DCHECK(!audio_thread_.get()); |
| - |
| +#else |
| + DCHECK(!thread_active_); |
| +#endif |
| // If the socket doesn't exist, that means that the plugin has started before |
| // the browser has had a chance to create all the shared memory info and |
| // notify us. This is a common case. In this case, we just set the playing_ |
| @@ -91,22 +105,62 @@ |
| // Don't start the thread unless all our state is set up correctly. |
| if (!playing_ || !callback_ || !socket_.get() || !shared_memory_->memory()) |
| return; |
| + // Clear contents of shm buffer before starting audio thread. This will |
| + // prevent a burst of static if for some reason the audio thread doesn't |
| + // start up quickly enough. |
| + memset(shared_memory_->memory(), 0, shared_memory_size_); |
| +#if !defined(OS_NACL) |
| DCHECK(!audio_thread_.get()); |
| audio_thread_.reset(new base::DelegateSimpleThread( |
| this, "plugin_audio_thread")); |
| audio_thread_->Start(); |
| +#else |
| + // Use NaCl's special API for IRT code that creates threads that call back |
| + // into user code. |
| + if (NULL == thread_functions.thread_create || |
| + NULL == thread_functions.thread_join) |
| + return; |
| + |
| + int result = thread_functions.thread_create(&thread_id_, CallRun, this); |
| + DCHECK_EQ(result, 0); |
| + thread_active_ = true; |
| +#endif |
| } |
| void PPB_Audio_Shared::StopThread() { |
| // Shut down the socket to escape any hanging |Receive|s. |
| if (socket_.get()) |
| socket_->Shutdown(); |
| + #if !defined(OS_NACL) |
| if (audio_thread_.get()) { |
| audio_thread_->Join(); |
| audio_thread_.reset(); |
| } |
| +#else |
| + if (thread_active_) { |
| + int result = thread_functions.thread_join(thread_id_); |
| + DCHECK_EQ(0, result); |
| + thread_active_ = false; |
| + } |
| +#endif |
| } |
| +#if defined(OS_NACL) |
| +// static |
| +void PPB_Audio_Shared::SetThreadFunctions( |
| + const struct PP_ThreadFunctions* functions) { |
| + DCHECK(thread_functions.thread_create == NULL); |
| + DCHECK(thread_functions.thread_join == NULL); |
| + thread_functions = *functions; |
| +} |
| + |
| +// static |
| +void PPB_Audio_Shared::CallRun(void* self) { |
| + PPB_Audio_Shared* audio = static_cast<PPB_Audio_Shared*>(self); |
| + audio->Run(); |
| +} |
| +#endif |
| + |
| void PPB_Audio_Shared::Run() { |
| int pending_data; |
| void* buffer = shared_memory_->memory(); |