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