Index: ppapi/shared_impl/ppb_audio_shared.cc |
=================================================================== |
--- ppapi/shared_impl/ppb_audio_shared.cc (revision 148266) |
+++ 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_(0), |
+ 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(); |