| OLD | NEW |
| 1 // Copyright (c) 2010 The Native Client Authors. All rights reserved. | 1 // Copyright (c) 2010 The Native Client 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 "native_client/src/shared/ppapi_proxy/plugin_audio.h" | 5 #include "native_client/src/shared/ppapi_proxy/plugin_audio.h" |
| 6 | 6 |
| 7 #include <pthread.h> | 7 #include <pthread.h> |
| 8 #include <stdio.h> | 8 #include <stdio.h> |
| 9 #include <string.h> | 9 #include <string.h> |
| 10 #include <sys/errno.h> | 10 #include <sys/errno.h> |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 // Start of untrusted PPB_Audio functions | 215 // Start of untrusted PPB_Audio functions |
| 216 | 216 |
| 217 PP_Resource Create(PP_Instance instance, | 217 PP_Resource Create(PP_Instance instance, |
| 218 PP_Resource config, | 218 PP_Resource config, |
| 219 PPB_Audio_Callback user_callback, | 219 PPB_Audio_Callback user_callback, |
| 220 void* user_data) { | 220 void* user_data) { |
| 221 PP_Resource audioResource; | 221 PP_Resource audioResource; |
| 222 NaClSrpcError retval = NACL_SRPC_RESULT_OK; | 222 NaClSrpcError retval = NACL_SRPC_RESULT_OK; |
| 223 NaClSrpcChannel* channel = NULL; | 223 NaClSrpcChannel* channel = NULL; |
| 224 AudioProxy* audio = NULL; | 224 AudioProxy* audio = NULL; |
| 225 int64_t audioResource64 = 0; | |
| 226 int64_t instance64 = static_cast<int64_t>(instance); | |
| 227 int64_t config64 = static_cast<int64_t>(config); | |
| 228 // TODO(audio): remove check below when & if we support | 225 // TODO(audio): remove check below when & if we support |
| 229 // multiple simultanious audio devices from same untrusted instance | 226 // multiple simultanious audio devices from same untrusted instance |
| 230 if (NULL != GetCurrentAudio()) { | 227 if (NULL != GetCurrentAudio()) { |
| 231 return kInvalidResourceId; | 228 return kInvalidResourceId; |
| 232 } | 229 } |
| 233 // Proxy to browser Create, get audio PP_Resource | 230 // Proxy to browser Create, get audio PP_Resource |
| 234 channel = ppapi_proxy::GetMainSrpcChannel(); | 231 channel = ppapi_proxy::GetMainSrpcChannel(); |
| 235 retval = PpbAudioDevRpcClient::PPB_Audio_Dev_Create( | 232 retval = PpbAudioDevRpcClient::PPB_Audio_Dev_Create( |
| 236 channel, | 233 channel, |
| 237 instance64, | 234 instance, |
| 238 config64, | 235 config, |
| 239 &audioResource64); | 236 &audioResource); |
| 240 audioResource = static_cast<PP_Resource>(audioResource64); | |
| 241 if (NACL_SRPC_RESULT_OK != retval) { | 237 if (NACL_SRPC_RESULT_OK != retval) { |
| 242 return kInvalidResourceId; | 238 return kInvalidResourceId; |
| 243 } | 239 } |
| 244 if (kInvalidResourceId == audioResource) { | 240 if (kInvalidResourceId == audioResource) { |
| 245 return kInvalidResourceId; | 241 return kInvalidResourceId; |
| 246 } | 242 } |
| 247 // Create an AudioProxy | 243 // Create an AudioProxy |
| 248 audio = new AudioProxy(audioResource, user_callback, user_data); | 244 audio = new AudioProxy(audioResource, user_callback, user_data); |
| 249 if (NULL == audio) { | 245 if (NULL == audio) { |
| 250 return kInvalidResourceId; | 246 return kInvalidResourceId; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 267 resource, | 263 resource, |
| 268 &out_bool); | 264 &out_bool); |
| 269 if (NACL_SRPC_RESULT_OK != retval) { | 265 if (NACL_SRPC_RESULT_OK != retval) { |
| 270 return PP_FALSE; | 266 return PP_FALSE; |
| 271 } | 267 } |
| 272 return pp::BoolToPPBool(out_bool); | 268 return pp::BoolToPPBool(out_bool); |
| 273 } | 269 } |
| 274 | 270 |
| 275 PP_Resource GetCurrentConfig(PP_Resource audio) { | 271 PP_Resource GetCurrentConfig(PP_Resource audio) { |
| 276 NaClSrpcChannel* channel = ppapi_proxy::GetMainSrpcChannel(); | 272 NaClSrpcChannel* channel = ppapi_proxy::GetMainSrpcChannel(); |
| 277 int64_t out_resource; | 273 PP_Resource out_resource; |
| 278 NaClSrpcError retval = | 274 NaClSrpcError retval = |
| 279 PpbAudioDevRpcClient::PPB_Audio_Dev_GetCurrentConfig( | 275 PpbAudioDevRpcClient::PPB_Audio_Dev_GetCurrentConfig( |
| 280 channel, | 276 channel, |
| 281 audio, | 277 audio, |
| 282 &out_resource); | 278 &out_resource); |
| 283 if (NACL_SRPC_RESULT_OK != retval) { | 279 if (NACL_SRPC_RESULT_OK != retval) { |
| 284 return kInvalidResourceId; | 280 return kInvalidResourceId; |
| 285 } | 281 } |
| 286 return static_cast<PP_Resource>(out_resource); | 282 return out_resource; |
| 287 } | 283 } |
| 288 | 284 |
| 289 PP_Bool StartPlayback(PP_Resource audioResource) { | 285 PP_Bool StartPlayback(PP_Resource audioResource) { |
| 290 NaClSrpcChannel* channel = ppapi_proxy::GetMainSrpcChannel(); | 286 NaClSrpcChannel* channel = ppapi_proxy::GetMainSrpcChannel(); |
| 291 int32_t out_bool; | 287 int32_t out_bool; |
| 292 AudioProxy* audio = GetBoundAudio(audioResource); | 288 AudioProxy* audio = GetBoundAudio(audioResource); |
| 293 if (NULL == audio) { | 289 if (NULL == audio) { |
| 294 return PP_FALSE; | 290 return PP_FALSE; |
| 295 } | 291 } |
| 296 if (audio->state() == AUDIO_INCOMPLETE) { | 292 if (audio->state() == AUDIO_INCOMPLETE) { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 } | 352 } |
| 357 | 353 |
| 358 } // namespace ppapi_proxy | 354 } // namespace ppapi_proxy |
| 359 | 355 |
| 360 // PppAudioDevRpcServer::PPP_Audio_Dev_StreamCreated() must be in global | 356 // PppAudioDevRpcServer::PPP_Audio_Dev_StreamCreated() must be in global |
| 361 // namespace. This function receives handles for the socket and shared | 357 // namespace. This function receives handles for the socket and shared |
| 362 // memory, provided by the trusted audio implementation. | 358 // memory, provided by the trusted audio implementation. |
| 363 void PppAudioDevRpcServer::PPP_Audio_Dev_StreamCreated( | 359 void PppAudioDevRpcServer::PPP_Audio_Dev_StreamCreated( |
| 364 NaClSrpcRpc* rpc, | 360 NaClSrpcRpc* rpc, |
| 365 NaClSrpcClosure* done, | 361 NaClSrpcClosure* done, |
| 366 int64_t audioResource64, | 362 PP_Resource audioResource, |
| 367 NaClSrpcImcDescType shm, | 363 NaClSrpcImcDescType shm, |
| 368 int32_t shm_size, | 364 int32_t shm_size, |
| 369 NaClSrpcImcDescType sync_socket) { | 365 NaClSrpcImcDescType sync_socket) { |
| 370 NaClSrpcClosureRunner runner(done); | 366 NaClSrpcClosureRunner runner(done); |
| 371 PP_Resource audioResource = static_cast<PP_Resource>(audioResource64); | |
| 372 rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 367 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 373 ppapi_proxy::AudioProxy* audio = ppapi_proxy::GetBoundAudio(audioResource); | 368 ppapi_proxy::AudioProxy* audio = ppapi_proxy::GetBoundAudio(audioResource); |
| 374 if (NULL == audio) { | 369 if (NULL == audio) { |
| 375 // Ignore if no audioResource -> audioInstance mapping exists, | 370 // Ignore if no audioResource -> audioInstance mapping exists, |
| 376 // the app may have shutdown audio before StreamCreated() invoked. | 371 // the app may have shutdown audio before StreamCreated() invoked. |
| 377 rpc->result = NACL_SRPC_RESULT_OK; | 372 rpc->result = NACL_SRPC_RESULT_OK; |
| 378 return; | 373 return; |
| 379 } | 374 } |
| 380 audio->StreamCreated(sync_socket, shm, shm_size); | 375 audio->StreamCreated(sync_socket, shm, shm_size); |
| 381 rpc->result = NACL_SRPC_RESULT_OK; | 376 rpc->result = NACL_SRPC_RESULT_OK; |
| 382 } | 377 } |
| OLD | NEW |