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 3 // found in the LICENSE file. 4 5 #include "ppapi/cpp/dev/audio_input_dev.h" 6 7 #include "ppapi/c/pp_bool.h" 8 #include "ppapi/c/pp_errors.h" 9 #include "ppapi/cpp/dev/resource_array_dev.h" 10 #include "ppapi/cpp/instance_handle.h" 11 #include "ppapi/cpp/module_impl.h" 12 13 namespace pp { 14 15 namespace { 16 17 template <> const char* interface_name<PPB_AudioInput_Dev_0_2>() { 18 return PPB_AUDIO_INPUT_DEV_INTERFACE_0_2; 19 } 20 21 template <> const char* interface_name<PPB_AudioInput_Dev_0_3>() { 22 return PPB_AUDIO_INPUT_DEV_INTERFACE_0_3; 23 } 24 25 template <> const char* interface_name<PPB_AudioInput_Dev_0_4>() { 26 return PPB_AUDIO_INPUT_DEV_INTERFACE_0_4; 27 } 28 29 } // namespace 30 31 AudioInput_Dev::AudioInput_Dev() { 32 } 33 34 AudioInput_Dev::AudioInput_Dev(const InstanceHandle& instance) { 35 if (has_interface<PPB_AudioInput_Dev_0_4>()) { 36 PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_4>()->Create( 37 instance.pp_instance())); 38 } else if (has_interface<PPB_AudioInput_Dev_0_3>()) { 39 PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_3>()->Create( 40 instance.pp_instance())); 41 } else if (has_interface<PPB_AudioInput_Dev_0_2>()) { 42 PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_2>()->Create( 43 instance.pp_instance())); 44 } 45 } 46 47 AudioInput_Dev::~AudioInput_Dev() { 48 } 49 50 // static 51 bool AudioInput_Dev::IsAvailable() { 52 return has_interface<PPB_AudioInput_Dev_0_4>() || 53 has_interface<PPB_AudioInput_Dev_0_3>() || 54 has_interface<PPB_AudioInput_Dev_0_2>(); 55 } 56 57 int32_t AudioInput_Dev::EnumerateDevices( 58 const CompletionCallbackWithOutput<std::vector<DeviceRef_Dev> >& callback) { 59 if (has_interface<PPB_AudioInput_Dev_0_4>()) { 60 return get_interface<PPB_AudioInput_Dev_0_4>()->EnumerateDevices( 61 pp_resource(), callback.output(), callback.pp_completion_callback()); 62 } 63 if (has_interface<PPB_AudioInput_Dev_0_3>()) { 64 return get_interface<PPB_AudioInput_Dev_0_3>()->EnumerateDevices( 65 pp_resource(), callback.output(), callback.pp_completion_callback()); 66 } 67 if (has_interface<PPB_AudioInput_Dev_0_2>()) { 68 if (!callback.pp_completion_callback().func) 69 return callback.MayForce(PP_ERROR_BLOCKS_MAIN_THREAD); 70 71 // ArrayOutputCallbackConverter is responsible to delete it. 72 ResourceArray_Dev::ArrayOutputCallbackData* data = 73 new ResourceArray_Dev::ArrayOutputCallbackData( 74 callback.output(), callback.pp_completion_callback()); 75 return get_interface<PPB_AudioInput_Dev_0_2>()->EnumerateDevices( 76 pp_resource(), &data->resource_array_output, 77 PP_MakeCompletionCallback( 78 &ResourceArray_Dev::ArrayOutputCallbackConverter, data)); 79 } 80 81 return callback.MayForce(PP_ERROR_NOINTERFACE); 82 } 83 84 int32_t AudioInput_Dev::MonitorDeviceChange( 85 PP_MonitorDeviceChangeCallback callback, 86 void* user_data) { 87 if (has_interface<PPB_AudioInput_Dev_0_4>()) { 88 return get_interface<PPB_AudioInput_Dev_0_4>()->MonitorDeviceChange( 89 pp_resource(), callback, user_data); 90 } 91 if (has_interface<PPB_AudioInput_Dev_0_3>()) { 92 return get_interface<PPB_AudioInput_Dev_0_3>()->MonitorDeviceChange( 93 pp_resource(), callback, user_data); 94 } 95 96 return PP_ERROR_NOINTERFACE; 97 } 98 99 int32_t AudioInput_Dev::Open(const DeviceRef_Dev& device_ref, 100 const AudioConfig& config, 101 PPB_AudioInput_Callback audio_input_callback, 102 void* user_data, 103 const CompletionCallback& callback) { 104 if (has_interface<PPB_AudioInput_Dev_0_4>()) { 105 return get_interface<PPB_AudioInput_Dev_0_4>()->Open( 106 pp_resource(), device_ref.pp_resource(), config.pp_resource(), 107 audio_input_callback, user_data, callback.pp_completion_callback()); 108 } 109 110 return callback.MayForce(PP_ERROR_NOINTERFACE); 111 } 112 113 int32_t AudioInput_Dev::Open( 114 const DeviceRef_Dev& device_ref, 115 const AudioConfig& config, 116 PPB_AudioInput_Callback_0_2 audio_input_callback_0_2, 117 void* user_data, 118 const CompletionCallback& callback) { 119 if (has_interface<PPB_AudioInput_Dev_0_3>()) { 120 return get_interface<PPB_AudioInput_Dev_0_3>()->Open( 121 pp_resource(), device_ref.pp_resource(), config.pp_resource(), 122 audio_input_callback_0_2, user_data, callback.pp_completion_callback()); 123 } 124 if (has_interface<PPB_AudioInput_Dev_0_2>()) { 125 return get_interface<PPB_AudioInput_Dev_0_2>()->Open( 126 pp_resource(), device_ref.pp_resource(), config.pp_resource(), 127 audio_input_callback_0_2, user_data, callback.pp_completion_callback()); 128 } 129 130 return callback.MayForce(PP_ERROR_NOINTERFACE); 131 } 132 133 bool AudioInput_Dev::StartCapture() { 134 if (has_interface<PPB_AudioInput_Dev_0_4>()) { 135 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_4>()->StartCapture( 136 pp_resource())); 137 } 138 if (has_interface<PPB_AudioInput_Dev_0_3>()) { 139 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_3>()->StartCapture( 140 pp_resource())); 141 } 142 if (has_interface<PPB_AudioInput_Dev_0_2>()) { 143 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StartCapture( 144 pp_resource())); 145 } 146 147 return false; 148 } 149 150 bool AudioInput_Dev::StopCapture() { 151 if (has_interface<PPB_AudioInput_Dev_0_4>()) { 152 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_4>()->StopCapture( 153 pp_resource())); 154 } 155 if (has_interface<PPB_AudioInput_Dev_0_3>()) { 156 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_3>()->StopCapture( 157 pp_resource())); 158 } 159 if (has_interface<PPB_AudioInput_Dev_0_2>()) { 160 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StopCapture( 161 pp_resource())); 162 } 163 164 return false; 165 } 166 167 void AudioInput_Dev::Close() { 168 if (has_interface<PPB_AudioInput_Dev_0_4>()) { 169 get_interface<PPB_AudioInput_Dev_0_4>()->Close(pp_resource()); 170 } else if (has_interface<PPB_AudioInput_Dev_0_3>()) { 171 get_interface<PPB_AudioInput_Dev_0_3>()->Close(pp_resource()); 172 } else if (has_interface<PPB_AudioInput_Dev_0_2>()) { 173 get_interface<PPB_AudioInput_Dev_0_2>()->Close(pp_resource()); 174 } 175 } 176 177 } // namespace pp 178