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 |