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 "ppapi/cpp/dev/audio_input_dev.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_bool.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/dev/resource_array_dev.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance_handle.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module_impl.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <> const char* interface_name<PPB_AudioInput_Dev_0_2>() { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PPB_AUDIO_INPUT_DEV_INTERFACE_0_2; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <> const char* interface_name<PPB_AudioInput_Dev_0_3>() { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PPB_AUDIO_INPUT_DEV_INTERFACE_0_3; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <> const char* interface_name<PPB_AudioInput_Dev_0_4>() { 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PPB_AUDIO_INPUT_DEV_INTERFACE_0_4; 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioInput_Dev::AudioInput_Dev() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioInput_Dev::AudioInput_Dev(const InstanceHandle& instance) { 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_AudioInput_Dev_0_4>()) { 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_4>()->Create( 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch instance.pp_instance())); 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (has_interface<PPB_AudioInput_Dev_0_3>()) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_3>()->Create( 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance.pp_instance())); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (has_interface<PPB_AudioInput_Dev_0_2>()) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_2>()->Create( 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance.pp_instance())); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioInput_Dev::~AudioInput_Dev() { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AudioInput_Dev::IsAvailable() { 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return has_interface<PPB_AudioInput_Dev_0_4>() || 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch has_interface<PPB_AudioInput_Dev_0_3>() || 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_interface<PPB_AudioInput_Dev_0_2>(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t AudioInput_Dev::EnumerateDevices( 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallbackWithOutput<std::vector<DeviceRef_Dev> >& callback) { 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_AudioInput_Dev_0_4>()) { 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return get_interface<PPB_AudioInput_Dev_0_4>()->EnumerateDevices( 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp_resource(), callback.output(), callback.pp_completion_callback()); 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_interface<PPB_AudioInput_Dev_0_3>()) { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return get_interface<PPB_AudioInput_Dev_0_3>()->EnumerateDevices( 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), callback.output(), callback.pp_completion_callback()); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_interface<PPB_AudioInput_Dev_0_2>()) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!callback.pp_completion_callback().func) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return callback.MayForce(PP_ERROR_BLOCKS_MAIN_THREAD); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ArrayOutputCallbackConverter is responsible to delete it. 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceArray_Dev::ArrayOutputCallbackData* data = 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ResourceArray_Dev::ArrayOutputCallbackData( 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.output(), callback.pp_completion_callback()); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return get_interface<PPB_AudioInput_Dev_0_2>()->EnumerateDevices( 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), &data->resource_array_output, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_MakeCompletionCallback( 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &ResourceArray_Dev::ArrayOutputCallbackConverter, data)); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return callback.MayForce(PP_ERROR_NOINTERFACE); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t AudioInput_Dev::MonitorDeviceChange( 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_MonitorDeviceChangeCallback callback, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* user_data) { 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_AudioInput_Dev_0_4>()) { 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return get_interface<PPB_AudioInput_Dev_0_4>()->MonitorDeviceChange( 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp_resource(), callback, user_data); 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_interface<PPB_AudioInput_Dev_0_3>()) { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return get_interface<PPB_AudioInput_Dev_0_3>()->MonitorDeviceChange( 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), callback, user_data); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_NOINTERFACE; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t AudioInput_Dev::Open(const DeviceRef_Dev& device_ref, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AudioConfig& config, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPB_AudioInput_Callback audio_input_callback, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* user_data, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) { 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_AudioInput_Dev_0_4>()) { 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return get_interface<PPB_AudioInput_Dev_0_4>()->Open( 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp_resource(), device_ref.pp_resource(), config.pp_resource(), 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch audio_input_callback, user_data, callback.pp_completion_callback()); 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return callback.MayForce(PP_ERROR_NOINTERFACE); 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t AudioInput_Dev::Open( 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const DeviceRef_Dev& device_ref, 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const AudioConfig& config, 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PPB_AudioInput_Callback_0_2 audio_input_callback_0_2, 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void* user_data, 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const CompletionCallback& callback) { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_interface<PPB_AudioInput_Dev_0_3>()) { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return get_interface<PPB_AudioInput_Dev_0_3>()->Open( 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), device_ref.pp_resource(), config.pp_resource(), 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch audio_input_callback_0_2, user_data, callback.pp_completion_callback()); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_interface<PPB_AudioInput_Dev_0_2>()) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_interface<PPB_AudioInput_Dev_0_2>()->Open( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_resource(), device_ref.pp_resource(), config.pp_resource(), 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch audio_input_callback_0_2, user_data, callback.pp_completion_callback()); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return callback.MayForce(PP_ERROR_NOINTERFACE); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AudioInput_Dev::StartCapture() { 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_AudioInput_Dev_0_4>()) { 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_4>()->StartCapture( 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp_resource())); 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_interface<PPB_AudioInput_Dev_0_3>()) { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_3>()->StartCapture( 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource())); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_interface<PPB_AudioInput_Dev_0_2>()) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StartCapture( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_resource())); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AudioInput_Dev::StopCapture() { 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_AudioInput_Dev_0_4>()) { 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_4>()->StopCapture( 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp_resource())); 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_interface<PPB_AudioInput_Dev_0_3>()) { 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_3>()->StopCapture( 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource())); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_interface<PPB_AudioInput_Dev_0_2>()) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StopCapture( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_resource())); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AudioInput_Dev::Close() { 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_AudioInput_Dev_0_4>()) { 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch get_interface<PPB_AudioInput_Dev_0_4>()->Close(pp_resource()); 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (has_interface<PPB_AudioInput_Dev_0_3>()) { 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_interface<PPB_AudioInput_Dev_0_3>()->Close(pp_resource()); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (has_interface<PPB_AudioInput_Dev_0_2>()) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_interface<PPB_AudioInput_Dev_0_2>()->Close(pp_resource()); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace pp 178