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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/pepper/pepper_audio_input_host.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/pepper_media_device_manager.h"
10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/pepper_platform_audio_input.h"
1158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
12bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/renderer/render_frame_impl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/dispatch_host_message.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/ppapi_host.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/serialized_structs.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::PlatformFile ConvertSyncSocketHandle(const base::SyncSocket& socket) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return socket.handle();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::PlatformFile ConvertSharedMemoryHandle(
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::SharedMemory& shared_memory) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return shared_memory.handle().fd;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return shared_memory.handle();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error "Platform not supported."
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPepperAudioInputHost::PepperAudioInputHost(RendererPpapiHostImpl* host,
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                           PP_Instance instance,
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                           PP_Resource resource)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ResourceHost(host->GetPpapiHost(), instance, resource),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      renderer_ppapi_host_(host),
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      audio_input_(NULL),
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      enumeration_helper_(this,
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          PepperMediaDeviceManager::GetForRenderFrame(
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              host->GetRenderFrameForInstance(pp_instance())),
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          PP_DEVICETYPE_DEV_AUDIOCAPTURE,
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          host->GetDocumentURL(instance)) {}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPepperAudioInputHost::~PepperAudioInputHost() { Close(); }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t PepperAudioInputHost::OnResourceMessageReceived(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& msg,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::host::HostMessageContext* context) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t result = PP_ERROR_FAILED;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (enumeration_helper_.HandleResourceMessage(msg, context, &result))
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PPAPI_BEGIN_MESSAGE_MAP(PepperAudioInputHost, msg)
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_AudioInput_Open, OnOpen)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_AudioInput_StartOrStop,
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      OnStartOrStop)
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_AudioInput_Close, OnClose)
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PPAPI_END_MESSAGE_MAP()
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_ERROR_FAILED;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperAudioInputHost::StreamCreated(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SharedMemoryHandle shared_memory_handle,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t shared_memory_size,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SyncSocket::Handle socket) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnOpenComplete(PP_OK, shared_memory_handle, shared_memory_size, socket);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperAudioInputHost::StreamCreationFailed() {
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  OnOpenComplete(PP_ERROR_FAILED,
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                 base::SharedMemory::NULLHandle(),
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                 0,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::SyncSocket::kInvalidHandle);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochint32_t PepperAudioInputHost::OnOpen(ppapi::host::HostMessageContext* context,
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                     const std::string& device_id,
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                     PP_AudioSampleRate sample_rate,
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                     uint32_t sample_frame_count) {
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (open_context_.is_valid())
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ERROR_INPROGRESS;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (audio_input_)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ERROR_FAILED;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL document_url = renderer_ppapi_host_->GetDocumentURL(pp_instance());
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!document_url.is_valid())
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return PP_ERROR_FAILED;
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When it is done, we'll get called back on StreamCreated() or
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // StreamCreationFailed().
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  audio_input_ = PepperPlatformAudioInput::Create(
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      renderer_ppapi_host_->GetRenderFrameForInstance(pp_instance())->
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          GetRoutingID(),
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      device_id,
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      document_url,
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      static_cast<int>(sample_rate),
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      static_cast<int>(sample_frame_count),
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      this);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (audio_input_) {
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    open_context_ = context->MakeReplyMessageContext();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_OK_COMPLETIONPENDING;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ERROR_FAILED;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperAudioInputHost::OnStartOrStop(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::host::HostMessageContext* /* context */,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool capture) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!audio_input_)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ERROR_FAILED;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (capture)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    audio_input_->StartCapture();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    audio_input_->StopCapture();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_OK;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperAudioInputHost::OnClose(
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::host::HostMessageContext* /* context */) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Close();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_OK;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperAudioInputHost::OnOpenComplete(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32_t result,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SharedMemoryHandle shared_memory_handle,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t shared_memory_size,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SyncSocket::Handle socket_handle) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the handles are cleaned up.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SyncSocket scoped_socket(socket_handle);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SharedMemory scoped_shared_memory(shared_memory_handle, false);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!open_context_.is_valid()) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi::proxy::SerializedHandle serialized_socket_handle(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ppapi::proxy::SerializedHandle::SOCKET);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi::proxy::SerializedHandle serialized_shared_memory_handle(
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ppapi::proxy::SerializedHandle::SHARED_MEMORY);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == PP_OK) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::PlatformFileForTransit temp_socket =
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IPC::InvalidPlatformFileForTransit();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SharedMemoryHandle temp_shmem = base::SharedMemory::NULLHandle();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = GetRemoteHandles(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_socket, scoped_shared_memory, &temp_socket, &temp_shmem);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialized_socket_handle.set_socket(temp_socket);
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    serialized_shared_memory_handle.set_shmem(temp_shmem, shared_memory_size);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send all the values, even on error. This simplifies some of our cleanup
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // code since the handles will be in the other process and could be
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // inconvenient to clean up. Our IPC code will automatically handle this for
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // us, as long as the remote side always closes the handles it receives, even
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the failure case.
170a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  open_context_.params.AppendHandle(serialized_socket_handle);
171a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  open_context_.params.AppendHandle(serialized_shared_memory_handle);
172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  SendOpenReply(result);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t PepperAudioInputHost::GetRemoteHandles(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::SyncSocket& socket,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::SharedMemory& shared_memory,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::PlatformFileForTransit* remote_socket_handle,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SharedMemoryHandle* remote_shared_memory_handle) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *remote_socket_handle = renderer_ppapi_host_->ShareHandleWithRemote(
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertSyncSocketHandle(socket), false);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (*remote_socket_handle == IPC::InvalidPlatformFileForTransit())
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ERROR_FAILED;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *remote_shared_memory_handle = renderer_ppapi_host_->ShareHandleWithRemote(
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertSharedMemoryHandle(shared_memory), false);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (*remote_shared_memory_handle == IPC::InvalidPlatformFileForTransit())
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ERROR_FAILED;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_OK;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperAudioInputHost::Close() {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!audio_input_)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  audio_input_->ShutDown();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  audio_input_ = NULL;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
200a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (open_context_.is_valid())
201a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SendOpenReply(PP_ERROR_ABORTED);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid PepperAudioInputHost::SendOpenReply(int32_t result) {
205a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  open_context_.params.set_result(result);
206a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  host()->SendReply(open_context_, PpapiPluginMsg_AudioInput_OpenReply());
207a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  open_context_ = ppapi::host::ReplyMessageContext();
208a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace content
211