| Index: ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_audio_rpc_server.cc
|
| ===================================================================
|
| --- ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_audio_rpc_server.cc (revision 0)
|
| +++ ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_audio_rpc_server.cc (revision 0)
|
| @@ -0,0 +1,216 @@
|
| +// Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +//
|
| +// SRPC-abstraction wrappers around PPB_Audio functions.
|
| +
|
| +#include "native_client/src/include/nacl_scoped_ptr.h"
|
| +#include "native_client/src/include/portability.h"
|
| +#include "native_client/src/shared/ppapi_proxy/browser_globals.h"
|
| +#include "native_client/src/shared/ppapi_proxy/browser_ppp.h"
|
| +#include "native_client/src/shared/ppapi_proxy/plugin_globals.h"
|
| +#include "native_client/src/shared/ppapi_proxy/utility.h"
|
| +#include "native_client/src/trusted/desc/nacl_desc_invalid.h"
|
| +#include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
|
| +#include "ppapi/c/ppb_audio.h"
|
| +#include "ppapi/c/ppb_audio_config.h"
|
| +#include "ppapi/c/pp_errors.h"
|
| +#include "ppapi/c/trusted/ppb_audio_trusted.h"
|
| +#include "ppapi/cpp/completion_callback.h"
|
| +#include "ppapi/cpp/core.h"
|
| +#include "ppapi/cpp/module.h"
|
| +#include "srpcgen/ppb_rpc.h"
|
| +#include "srpcgen/ppp_rpc.h"
|
| +
|
| +using ppapi_proxy::DebugPrintf;
|
| +
|
| +namespace {
|
| +
|
| +const PPB_AudioTrusted* GetAudioTrustedInterface() {
|
| + DebugPrintf("GetAudioTrustedInterface\n");
|
| + static const PPB_AudioTrusted* audioTrusted =
|
| + static_cast<const PPB_AudioTrusted*>
|
| + (ppapi_proxy::GetBrowserInterface(PPB_AUDIO_TRUSTED_INTERFACE));
|
| + return audioTrusted;
|
| +}
|
| +
|
| +const PPB_Audio* GetAudioInterface() {
|
| + DebugPrintf("GetAudioInterface\n");
|
| + static const PPB_Audio* audio =
|
| + static_cast<const PPB_Audio*>
|
| + (ppapi_proxy::GetBrowserInterface(PPB_AUDIO_INTERFACE));
|
| + return audio;
|
| +}
|
| +
|
| +struct StreamCreatedCallbackData {
|
| + PP_Instance instance_id;
|
| + PP_Resource audio_id;
|
| + StreamCreatedCallbackData(PP_Instance i, PP_Resource a) :
|
| + instance_id(i),
|
| + audio_id(a) { }
|
| +};
|
| +
|
| +// This completion callback will be invoked when the sync socket and shared
|
| +// memory handles become available.
|
| +void StreamCreatedCallback(void* user_data, int32_t result) {
|
| + DebugPrintf("StreamCreatedCallback: user_data=%p result=%"NACL_PRId32"\n",
|
| + user_data, result);
|
| + if (NULL == user_data) {
|
| + return;
|
| + }
|
| + nacl::scoped_ptr<StreamCreatedCallbackData> data(
|
| + static_cast<StreamCreatedCallbackData*>(user_data));
|
| + if (result < 0) {
|
| + return;
|
| + }
|
| + const PPB_AudioTrusted* audioTrusted = GetAudioTrustedInterface();
|
| + if (NULL == audioTrusted) {
|
| + return;
|
| + }
|
| + int sync_socket_handle;
|
| + int shared_memory_handle;
|
| + uint32_t shared_memory_size;
|
| + if (PP_OK != audioTrusted->GetSyncSocket(data->audio_id,
|
| + &sync_socket_handle)) {
|
| + return;
|
| + }
|
| + if (PP_OK != audioTrusted->GetSharedMemory(data->audio_id,
|
| + &shared_memory_handle,
|
| + &shared_memory_size)) {
|
| + return;
|
| + }
|
| + nacl::DescWrapperFactory factory;
|
| + NaClHandle nacl_shm_handle = (NaClHandle)shared_memory_handle;
|
| + NaClHandle nacl_sync_handle = (NaClHandle)sync_socket_handle;
|
| + nacl::scoped_ptr<nacl::DescWrapper> shm_wrapper(factory.ImportShmHandle(
|
| + nacl_shm_handle, shared_memory_size));
|
| + nacl::scoped_ptr<nacl::DescWrapper> socket_wrapper(
|
| + factory.ImportSyncSocketHandle(nacl_sync_handle));
|
| + NaClDesc *nacl_shm = NaClDescRef(shm_wrapper->desc());
|
| + NaClDesc *nacl_socket = NaClDescRef(socket_wrapper->desc());
|
| + int r;
|
| + r = PppAudioRpcClient::PPP_Audio_StreamCreated(
|
| + ppapi_proxy::GetMainSrpcChannel(data->instance_id),
|
| + data->audio_id,
|
| + nacl_shm,
|
| + shared_memory_size,
|
| + nacl_socket);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +void PpbAudioRpcServer::PPB_Audio_Create(
|
| + NaClSrpcRpc* rpc,
|
| + NaClSrpcClosure* done,
|
| + PP_Instance instance,
|
| + PP_Resource config,
|
| + PP_Resource* resource) {
|
| + DebugPrintf("PPB_Audio::Create: instance=%"NACL_PRIu32" config=%"NACL_PRIu32
|
| + "\n", instance, config);
|
| + NaClSrpcClosureRunner runner(done);
|
| + const PPB_AudioTrusted* audio = GetAudioTrustedInterface();
|
| + PP_CompletionCallback callback;
|
| + StreamCreatedCallbackData* data;
|
| + rpc->result = NACL_SRPC_RESULT_APP_ERROR;
|
| + if (ppapi_proxy::kInvalidResourceId == config) {
|
| + return;
|
| + }
|
| + if (NULL == audio) {
|
| + return;
|
| + }
|
| + *resource = audio->CreateTrusted(instance);
|
| + DebugPrintf("PPB_Audio::Create: resource=%"NACL_PRIu32"\n", *resource);
|
| + PP_Resource audio_id = *resource;
|
| + if (ppapi_proxy::kInvalidResourceId == audio_id) {
|
| + return;
|
| + }
|
| + data = new StreamCreatedCallbackData(instance, audio_id);
|
| + callback = PP_MakeOptionalCompletionCallback(StreamCreatedCallback, data);
|
| + int32_t pp_error = audio->Open(audio_id, config, callback);
|
| + DebugPrintf("PPB_Audio::Create: pp_error=%"NACL_PRIu32"\n", pp_error);
|
| + // If the Open() call failed, pass failure code and explicitly
|
| + // invoke the completion callback, giving it a chance to release data.
|
| + if (pp_error != PP_OK_COMPLETIONPENDING) {
|
| + PP_RunCompletionCallback(&callback, pp_error);
|
| + return;
|
| + }
|
| + rpc->result = NACL_SRPC_RESULT_OK;
|
| +}
|
| +
|
| +void PpbAudioRpcServer::PPB_Audio_StartPlayback(
|
| + NaClSrpcRpc* rpc,
|
| + NaClSrpcClosure* done,
|
| + PP_Resource resource,
|
| + int32_t* success) {
|
| + DebugPrintf("PPB_Audio::StartPlayback: resource=%"NACL_PRIu32"\n", resource);
|
| + NaClSrpcClosureRunner runner(done);
|
| + const PPB_Audio* audio = GetAudioInterface();
|
| + rpc->result = NACL_SRPC_RESULT_APP_ERROR;
|
| + if (NULL == audio) {
|
| + *success = false;
|
| + return;
|
| + }
|
| + PP_Bool pp_success = audio->StartPlayback(resource);
|
| + DebugPrintf("PPB_Audio::StartPlayback: pp_success=%d\n", pp_success);
|
| + *success = (pp_success == PP_TRUE);
|
| + rpc->result = NACL_SRPC_RESULT_OK;
|
| +}
|
| +
|
| +void PpbAudioRpcServer::PPB_Audio_StopPlayback(
|
| + NaClSrpcRpc* rpc,
|
| + NaClSrpcClosure* done,
|
| + PP_Resource resource,
|
| + int32_t* success) {
|
| + DebugPrintf("PPB_Audio::StopPlayback: resource=%"NACL_PRIu32"\n", resource);
|
| + NaClSrpcClosureRunner runner(done);
|
| + const PPB_Audio* audio = GetAudioInterface();
|
| + rpc->result = NACL_SRPC_RESULT_APP_ERROR;
|
| + if (NULL == audio) {
|
| + *success = false;
|
| + return;
|
| + }
|
| + PP_Bool pp_success = audio->StopPlayback(resource);
|
| + DebugPrintf("PPB_Audio::StopPlayback: pp_success=%d\n", pp_success);
|
| + *success = (pp_success == PP_TRUE);
|
| + rpc->result = NACL_SRPC_RESULT_OK;
|
| +}
|
| +
|
| +void PpbAudioRpcServer::PPB_Audio_IsAudio(
|
| + NaClSrpcRpc* rpc,
|
| + NaClSrpcClosure* done,
|
| + PP_Resource resource,
|
| + int32_t* success) {
|
| + DebugPrintf("PPB_Audio::IsAudio: resource=%"NACL_PRIu32"\n", resource);
|
| + NaClSrpcClosureRunner runner(done);
|
| + const PPB_Audio* audio = GetAudioInterface();
|
| + rpc->result = NACL_SRPC_RESULT_APP_ERROR;
|
| + if (NULL == audio) {
|
| + *success = false;
|
| + return;
|
| + }
|
| + PP_Bool pp_success = audio->IsAudio(resource);
|
| + DebugPrintf("PPB_Audio::IsAudio: pp_success=%d\n", pp_success);
|
| + *success = (pp_success == PP_TRUE);
|
| + rpc->result = NACL_SRPC_RESULT_OK;
|
| +}
|
| +
|
| +void PpbAudioRpcServer::PPB_Audio_GetCurrentConfig(
|
| + NaClSrpcRpc* rpc,
|
| + NaClSrpcClosure* done,
|
| + PP_Resource resource,
|
| + PP_Resource* config) {
|
| + DebugPrintf("PPB_Audio::GetCurrentConfig: resource=%"NACL_PRIu32"\n",
|
| + resource);
|
| + NaClSrpcClosureRunner runner(done);
|
| + const PPB_Audio* audio = GetAudioInterface();
|
| + rpc->result = NACL_SRPC_RESULT_APP_ERROR;
|
| + if (NULL == audio) {
|
| + return;
|
| + }
|
| + if (ppapi_proxy::kInvalidResourceId == resource) {
|
| + return;
|
| + }
|
| + *config = audio->GetCurrentConfig(resource);
|
| + DebugPrintf("PPB_Audio::GetCurrentConfig: config=%"NACL_PRIu32"\n", *config);
|
| + rpc->result = NACL_SRPC_RESULT_OK;
|
| +}
|
|
|