| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium 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_ppb_audio.h" | 5 #include "native_client/src/shared/ppapi_proxy/plugin_ppb_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> |
| 11 #include <sys/mman.h> | 11 #include <sys/mman.h> |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 close(shm_); | 61 close(shm_); |
| 62 shm_ = -1; | 62 shm_ = -1; |
| 63 } | 63 } |
| 64 if (socket_ != -1) { | 64 if (socket_ != -1) { |
| 65 close(socket_); | 65 close(socket_); |
| 66 socket_ = -1; | 66 socket_ = -1; |
| 67 } | 67 } |
| 68 } | 68 } |
| 69 | 69 |
| 70 bool PluginAudio::InitFromBrowserResource(PP_Resource resource) { | 70 bool PluginAudio::InitFromBrowserResource(PP_Resource resource) { |
| 71 DebugPrintf("PluginAudio::InitFromBrowserResource: resource=%"NACL_PRIu32"\n", | 71 DebugPrintf("PluginAudio::InitFromBrowserResource: resource=%"NACL_PRId32"\n", |
| 72 resource); | 72 resource); |
| 73 resource_ = resource; | 73 resource_ = resource; |
| 74 return true; | 74 return true; |
| 75 } | 75 } |
| 76 | 76 |
| 77 void PluginAudio::AudioThread(void* self) { | 77 void PluginAudio::AudioThread(void* self) { |
| 78 PluginAudio* audio = static_cast<PluginAudio*>(self); | 78 PluginAudio* audio = static_cast<PluginAudio*>(self); |
| 79 DebugPrintf("PluginAudio::AudioThread: self=%p\n", self); | 79 DebugPrintf("PluginAudio::AudioThread: self=%p\n", self); |
| 80 while (true) { | 80 while (true) { |
| 81 int32_t sync_value; | 81 int32_t sync_value; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 return false; | 146 return false; |
| 147 } | 147 } |
| 148 | 148 |
| 149 // Start of untrusted PPB_Audio functions | 149 // Start of untrusted PPB_Audio functions |
| 150 namespace { | 150 namespace { |
| 151 | 151 |
| 152 PP_Resource Create(PP_Instance instance, | 152 PP_Resource Create(PP_Instance instance, |
| 153 PP_Resource config, | 153 PP_Resource config, |
| 154 PPB_Audio_Callback user_callback, | 154 PPB_Audio_Callback user_callback, |
| 155 void* user_data) { | 155 void* user_data) { |
| 156 DebugPrintf("PPB_Audio::Create: instance=%"NACL_PRIu32" config=%"NACL_PRIu32 | 156 DebugPrintf("PPB_Audio::Create: instance=%"NACL_PRId32" config=%"NACL_PRId32 |
| 157 " user_callback=%p user_data=%p\n", | 157 " user_callback=%p user_data=%p\n", |
| 158 instance, config, user_callback, user_data); | 158 instance, config, user_callback, user_data); |
| 159 PP_Resource audio_resource; | 159 PP_Resource audio_resource; |
| 160 // Proxy to browser Create, get audio PP_Resource | 160 // Proxy to browser Create, get audio PP_Resource |
| 161 NaClSrpcError srpc_result = PpbAudioRpcClient::PPB_Audio_Create( | 161 NaClSrpcError srpc_result = PpbAudioRpcClient::PPB_Audio_Create( |
| 162 GetMainSrpcChannel(), | 162 GetMainSrpcChannel(), |
| 163 instance, | 163 instance, |
| 164 config, | 164 config, |
| 165 &audio_resource); | 165 &audio_resource); |
| 166 DebugPrintf("PPB_Audio::Create: %s\n", NaClSrpcErrorString(srpc_result)); | 166 DebugPrintf("PPB_Audio::Create: %s\n", NaClSrpcErrorString(srpc_result)); |
| 167 if (NACL_SRPC_RESULT_OK != srpc_result) { | 167 if (NACL_SRPC_RESULT_OK != srpc_result) { |
| 168 return kInvalidResourceId; | 168 return kInvalidResourceId; |
| 169 } | 169 } |
| 170 if (kInvalidResourceId == audio_resource) { | 170 if (kInvalidResourceId == audio_resource) { |
| 171 return kInvalidResourceId; | 171 return kInvalidResourceId; |
| 172 } | 172 } |
| 173 scoped_refptr<PluginAudio> audio = | 173 scoped_refptr<PluginAudio> audio = |
| 174 PluginResource::AdoptAs<PluginAudio>(audio_resource); | 174 PluginResource::AdoptAs<PluginAudio>(audio_resource); |
| 175 if (audio.get()) { | 175 if (audio.get()) { |
| 176 audio->set_callback(user_callback, user_data); | 176 audio->set_callback(user_callback, user_data); |
| 177 return audio_resource; | 177 return audio_resource; |
| 178 } | 178 } |
| 179 return kInvalidResourceId; | 179 return kInvalidResourceId; |
| 180 } | 180 } |
| 181 | 181 |
| 182 PP_Bool IsAudio(PP_Resource resource) { | 182 PP_Bool IsAudio(PP_Resource resource) { |
| 183 int32_t success; | 183 int32_t success; |
| 184 DebugPrintf("PPB_Audio::IsAudio: resource=%"NACL_PRIu32"\n", resource); | 184 DebugPrintf("PPB_Audio::IsAudio: resource=%"NACL_PRId32"\n", resource); |
| 185 NaClSrpcError srpc_result = | 185 NaClSrpcError srpc_result = |
| 186 PpbAudioRpcClient::PPB_Audio_IsAudio( | 186 PpbAudioRpcClient::PPB_Audio_IsAudio( |
| 187 GetMainSrpcChannel(), | 187 GetMainSrpcChannel(), |
| 188 resource, | 188 resource, |
| 189 &success); | 189 &success); |
| 190 DebugPrintf("PPB_Audio::IsAudio: %s\n", NaClSrpcErrorString(srpc_result)); | 190 DebugPrintf("PPB_Audio::IsAudio: %s\n", NaClSrpcErrorString(srpc_result)); |
| 191 if (NACL_SRPC_RESULT_OK != srpc_result) { | 191 if (NACL_SRPC_RESULT_OK != srpc_result) { |
| 192 return PP_FALSE; | 192 return PP_FALSE; |
| 193 } | 193 } |
| 194 return PP_FromBool(success); | 194 return PP_FromBool(success); |
| 195 } | 195 } |
| 196 | 196 |
| 197 PP_Resource GetCurrentConfig(PP_Resource audio) { | 197 PP_Resource GetCurrentConfig(PP_Resource audio) { |
| 198 DebugPrintf("PPB_Audio::GetCurrentConfig: audio=%"NACL_PRIu32"\n", audio); | 198 DebugPrintf("PPB_Audio::GetCurrentConfig: audio=%"NACL_PRId32"\n", audio); |
| 199 PP_Resource config_resource; | 199 PP_Resource config_resource; |
| 200 NaClSrpcError srpc_result = | 200 NaClSrpcError srpc_result = |
| 201 PpbAudioRpcClient::PPB_Audio_GetCurrentConfig( | 201 PpbAudioRpcClient::PPB_Audio_GetCurrentConfig( |
| 202 GetMainSrpcChannel(), | 202 GetMainSrpcChannel(), |
| 203 audio, | 203 audio, |
| 204 &config_resource); | 204 &config_resource); |
| 205 DebugPrintf("PPB_Audio::GetCurrentConfig: %s\n", | 205 DebugPrintf("PPB_Audio::GetCurrentConfig: %s\n", |
| 206 NaClSrpcErrorString(srpc_result)); | 206 NaClSrpcErrorString(srpc_result)); |
| 207 if (NACL_SRPC_RESULT_OK != srpc_result) { | 207 if (NACL_SRPC_RESULT_OK != srpc_result) { |
| 208 return kInvalidResourceId; | 208 return kInvalidResourceId; |
| 209 } | 209 } |
| 210 return config_resource; | 210 return config_resource; |
| 211 } | 211 } |
| 212 | 212 |
| 213 PP_Bool StartPlayback(PP_Resource audio_resource) { | 213 PP_Bool StartPlayback(PP_Resource audio_resource) { |
| 214 DebugPrintf("PPB_Audio::StartPlayback: audio_resource=%"NACL_PRIu32"\n", | 214 DebugPrintf("PPB_Audio::StartPlayback: audio_resource=%"NACL_PRId32"\n", |
| 215 audio_resource); | 215 audio_resource); |
| 216 scoped_refptr<PluginAudio> audio = | 216 scoped_refptr<PluginAudio> audio = |
| 217 PluginResource::GetAs<PluginAudio>(audio_resource); | 217 PluginResource::GetAs<PluginAudio>(audio_resource); |
| 218 if (NULL == audio.get()) { | 218 if (NULL == audio.get()) { |
| 219 return PP_FALSE; | 219 return PP_FALSE; |
| 220 } | 220 } |
| 221 if (audio->state() == AUDIO_INCOMPLETE) { | 221 if (audio->state() == AUDIO_INCOMPLETE) { |
| 222 audio->set_state(AUDIO_PENDING); | 222 audio->set_state(AUDIO_PENDING); |
| 223 } | 223 } |
| 224 if (audio->state() == AUDIO_READY) { | 224 if (audio->state() == AUDIO_READY) { |
| 225 if (!audio->StartAudioThread()) { | 225 if (!audio->StartAudioThread()) { |
| 226 return PP_FALSE; | 226 return PP_FALSE; |
| 227 } | 227 } |
| 228 } | 228 } |
| 229 int32_t success; | 229 int32_t success; |
| 230 NaClSrpcError srpc_result = | 230 NaClSrpcError srpc_result = |
| 231 PpbAudioRpcClient::PPB_Audio_StartPlayback( | 231 PpbAudioRpcClient::PPB_Audio_StartPlayback( |
| 232 GetMainSrpcChannel(), | 232 GetMainSrpcChannel(), |
| 233 audio_resource, | 233 audio_resource, |
| 234 &success); | 234 &success); |
| 235 DebugPrintf("PPB_Audio::StartPlayback: %s\n", | 235 DebugPrintf("PPB_Audio::StartPlayback: %s\n", |
| 236 NaClSrpcErrorString(srpc_result)); | 236 NaClSrpcErrorString(srpc_result)); |
| 237 if (NACL_SRPC_RESULT_OK != srpc_result || !success) { | 237 if (NACL_SRPC_RESULT_OK != srpc_result || !success) { |
| 238 return PP_FALSE; | 238 return PP_FALSE; |
| 239 } | 239 } |
| 240 return PP_TRUE; | 240 return PP_TRUE; |
| 241 } | 241 } |
| 242 | 242 |
| 243 PP_Bool StopPlayback(PP_Resource audio_resource) { | 243 PP_Bool StopPlayback(PP_Resource audio_resource) { |
| 244 DebugPrintf("PPB_Audio::StopPlayback: audio_resource=%"NACL_PRIu32"\n", | 244 DebugPrintf("PPB_Audio::StopPlayback: audio_resource=%"NACL_PRId32"\n", |
| 245 audio_resource); | 245 audio_resource); |
| 246 scoped_refptr<PluginAudio> audio = | 246 scoped_refptr<PluginAudio> audio = |
| 247 PluginResource::GetAs<PluginAudio>(audio_resource); | 247 PluginResource::GetAs<PluginAudio>(audio_resource); |
| 248 if (NULL == audio.get()) { | 248 if (NULL == audio.get()) { |
| 249 return PP_FALSE; | 249 return PP_FALSE; |
| 250 } | 250 } |
| 251 if (audio->state() == AUDIO_PENDING) { | 251 if (audio->state() == AUDIO_PENDING) { |
| 252 // audio is pending to start, but StreamCreated() hasn't occurred yet... | 252 // audio is pending to start, but StreamCreated() hasn't occurred yet... |
| 253 audio->set_state(AUDIO_INCOMPLETE); | 253 audio->set_state(AUDIO_INCOMPLETE); |
| 254 } | 254 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 // memory, provided by the trusted audio implementation. | 292 // memory, provided by the trusted audio implementation. |
| 293 void PppAudioRpcServer::PPP_Audio_StreamCreated( | 293 void PppAudioRpcServer::PPP_Audio_StreamCreated( |
| 294 NaClSrpcRpc* rpc, | 294 NaClSrpcRpc* rpc, |
| 295 NaClSrpcClosure* done, | 295 NaClSrpcClosure* done, |
| 296 PP_Resource audio_resource, | 296 PP_Resource audio_resource, |
| 297 NaClSrpcImcDescType shm, | 297 NaClSrpcImcDescType shm, |
| 298 int32_t shm_size, | 298 int32_t shm_size, |
| 299 NaClSrpcImcDescType sync_socket) { | 299 NaClSrpcImcDescType sync_socket) { |
| 300 NaClSrpcClosureRunner runner(done); | 300 NaClSrpcClosureRunner runner(done); |
| 301 rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 301 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 302 DebugPrintf("PPP_Audio::StreamCreated: audio_resource=%"NACL_PRIu32 | 302 DebugPrintf("PPP_Audio::StreamCreated: audio_resource=%"NACL_PRId32 |
| 303 " shm=%"NACL_PRIx32" shm_size=%"NACL_PRIuS | 303 " shm=%"NACL_PRIx32" shm_size=%"NACL_PRIuS |
| 304 " sync_socket=%"NACL_PRIx32"\n", | 304 " sync_socket=%"NACL_PRIx32"\n", |
| 305 audio_resource, shm, shm_size, sync_socket); | 305 audio_resource, shm, shm_size, sync_socket); |
| 306 scoped_refptr<ppapi_proxy::PluginAudio> audio = | 306 scoped_refptr<ppapi_proxy::PluginAudio> audio = |
| 307 ppapi_proxy::PluginResource:: | 307 ppapi_proxy::PluginResource:: |
| 308 GetAs<ppapi_proxy::PluginAudio>(audio_resource); | 308 GetAs<ppapi_proxy::PluginAudio>(audio_resource); |
| 309 if (NULL == audio.get()) { | 309 if (NULL == audio.get()) { |
| 310 // Ignore if no audio_resource -> audio_instance mapping exists, | 310 // Ignore if no audio_resource -> audio_instance mapping exists, |
| 311 // the app may have shutdown audio before StreamCreated() invoked. | 311 // the app may have shutdown audio before StreamCreated() invoked. |
| 312 rpc->result = NACL_SRPC_RESULT_OK; | 312 rpc->result = NACL_SRPC_RESULT_OK; |
| 313 return; | 313 return; |
| 314 } | 314 } |
| 315 audio->StreamCreated(sync_socket, shm, shm_size); | 315 audio->StreamCreated(sync_socket, shm, shm_size); |
| 316 rpc->result = NACL_SRPC_RESULT_OK; | 316 rpc->result = NACL_SRPC_RESULT_OK; |
| 317 } | 317 } |
| OLD | NEW |