15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/audio_helper.h" 6bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/logging.h" 8bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/common.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_completion_callback.h" 10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "ppapi/c/pp_errors.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::TrackedCallback; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AudioHelper ----------------------------------------------------------------- 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioHelper::AudioHelper() : shared_memory_size_for_create_callback_(0) { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioHelper::~AudioHelper() { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t AudioHelper::GetSyncSocketImpl(int* sync_socket) { 25b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (socket_for_create_callback_) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *sync_socket = socket_for_create_callback_->handle(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *sync_socket = reinterpret_cast<int>(socket_for_create_callback_->handle()); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #error "Platform not supported." 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_OK; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ERROR_FAILED; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t AudioHelper::GetSharedMemoryImpl(int* shm_handle, uint32_t* shm_size) { 39b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (shared_memory_for_create_callback_) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *shm_handle = shared_memory_for_create_callback_->handle().fd; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *shm_handle = reinterpret_cast<int>( 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_memory_for_create_callback_->handle()); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #error "Platform not supported." 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *shm_size = shared_memory_size_for_create_callback_; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_OK; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ERROR_FAILED; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AudioHelper::StreamCreated( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SharedMemoryHandle shared_memory_handle, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t shared_memory_size, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SyncSocket::Handle socket_handle) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TrackedCallback::IsPending(create_callback_)) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trusted side of proxy can specify a callback to recieve handles. In 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this case we don't need to map any data or start the thread since it 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be handled by the proxy. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_memory_for_create_callback_.reset( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::SharedMemory(shared_memory_handle, false)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_memory_size_for_create_callback_ = shared_memory_size; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_for_create_callback_.reset(new base::SyncSocket(socket_handle)); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_callback_->Run(PP_OK); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It might be nice to close the handles here to free up some system 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resources, but we can't since there's a race condition. The handles must 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be valid until they're sent over IPC, which is done from the I/O thread 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which will often get done after this code executes. We could do 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // something more elaborate like an ACK from the plugin or post a task to 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the I/O thread and back, but this extra complexity doesn't seem worth it 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just to clean up these handles faster. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetStreamInfo(shared_memory_handle, shared_memory_size, socket_handle); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AudioHelper::SetCreateCallback( 824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch scoped_refptr<ppapi::TrackedCallback> create_callback) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!TrackedCallback::IsPending(create_callback_)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_callback_ = create_callback; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} // namespace content