summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ppapi/proxy/plugin_main_nacl.cc9
-rw-r--r--ppapi/shared_impl/DEPS3
-rw-r--r--ppapi/shared_impl/ppb_audio_shared.cc56
-rw-r--r--ppapi/shared_impl/ppb_audio_shared.h16
4 files changed, 79 insertions, 5 deletions
diff --git a/ppapi/proxy/plugin_main_nacl.cc b/ppapi/proxy/plugin_main_nacl.cc
index 9182731..96a6891 100644
--- a/ppapi/proxy/plugin_main_nacl.cc
+++ b/ppapi/proxy/plugin_main_nacl.cc
@@ -23,6 +23,7 @@
#include "ppapi/c/ppp_instance.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/plugin_globals.h"
+#include "ppapi/shared_impl/ppb_audio_shared.h"
#if defined(IPC_MESSAGE_LOG_ENABLED)
#define IPC_MESSAGE_MACROS_LOG_ENABLED
@@ -38,8 +39,6 @@ using ppapi::proxy::PluginGlobals;
namespace {
-struct PP_ThreadFunctions thread_funcs;
-
// Copied from src/content/ppapi_plugin/ppapi_thread. This is a minimal
// implementation to get us started.
class PluginDispatcherDelegate : public PluginDispatcher::PluginDelegate {
@@ -101,8 +100,10 @@ class PluginDispatcherDelegate : public PluginDispatcher::PluginDelegate {
} // namespace
void PpapiPluginRegisterThreadCreator(
- const struct PP_ThreadFunctions* new_funcs) {
- thread_funcs = *new_funcs;
+ const struct PP_ThreadFunctions* thread_functions) {
+ // Initialize all classes that need to create threads that call back into
+ // user code.
+ ppapi::PPB_Audio_Shared::SetThreadFunctions(thread_functions);
}
int IrtInit() {
diff --git a/ppapi/shared_impl/DEPS b/ppapi/shared_impl/DEPS
index 3460266..823b983 100644
--- a/ppapi/shared_impl/DEPS
+++ b/ppapi/shared_impl/DEPS
@@ -5,6 +5,9 @@ include_rules = [
"+skia",
"+webkit/glue",
+ # The untrusted build references the NaCl integrated runtime (IRT).
+ "+native_client/src/untrusted/irt",
+
# Since this is used by the implementation in /webkit, we don't want it to
# depend on IPC.
"-ipc",
diff --git a/ppapi/shared_impl/ppb_audio_shared.cc b/ppapi/shared_impl/ppb_audio_shared.cc
index dbf05be..1a62130 100644
--- a/ppapi/shared_impl/ppb_audio_shared.cc
+++ b/ppapi/shared_impl/ppb_audio_shared.cc
@@ -11,6 +11,13 @@ using base::subtle::Atomic32;
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 @@ const int PPB_Audio_Shared::kPauseMark = -1;
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::SetCallback(PPB_Audio_Callback callback,
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,21 +105,61 @@ void PPB_Audio_Shared::StartThread() {
// 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;
diff --git a/ppapi/shared_impl/ppb_audio_shared.h b/ppapi/shared_impl/ppb_audio_shared.h
index 3e8826e..cde075b 100644
--- a/ppapi/shared_impl/ppb_audio_shared.h
+++ b/ppapi/shared_impl/ppb_audio_shared.h
@@ -13,6 +13,10 @@
#include "ppapi/shared_impl/resource.h"
#include "ppapi/thunk/ppb_audio_api.h"
+#if defined(OS_NACL)
+#include "native_client/src/untrusted/irt/irt_ppapi.h"
+#endif
+
namespace ppapi {
// Implements the logic to map shared memory and run the audio thread signaled
@@ -54,6 +58,11 @@ class PPAPI_SHARED_EXPORT PPB_Audio_Shared
size_t shared_memory_size,
base::SyncSocket::Handle socket_handle);
+#if defined(OS_NACL)
+ // NaCl has a special API for IRT code to create threads that can call back
+ // into user code.
+ static void SetThreadFunctions(const struct PP_ThreadFunctions* functions);
+#endif
private:
// Starts execution of the audio thread.
void StartThread();
@@ -79,8 +88,15 @@ class PPAPI_SHARED_EXPORT PPB_Audio_Shared
// The size of the sample buffer in bytes.
size_t shared_memory_size_;
+#if !defined(OS_NACL)
// When the callback is set, this thread is spawned for calling it.
scoped_ptr<base::DelegateSimpleThread> audio_thread_;
+#else
+ uintptr_t thread_id_;
+ bool thread_active_;
+
+ static void CallRun(void* self);
+#endif
// Callback to call when audio is ready to accept new samples.
PPB_Audio_Callback callback_;