OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/cpp/dev/audio_input_dev.h" | 5 #include "ppapi/cpp/dev/audio_input_dev.h" |
6 | 6 |
7 #include "ppapi/c/pp_bool.h" | 7 #include "ppapi/c/pp_bool.h" |
8 #include "ppapi/c/pp_errors.h" | 8 #include "ppapi/c/pp_errors.h" |
9 #include "ppapi/cpp/dev/resource_array_dev.h" | 9 #include "ppapi/cpp/dev/resource_array_dev.h" |
10 #include "ppapi/cpp/instance_handle.h" | 10 #include "ppapi/cpp/instance_handle.h" |
11 #include "ppapi/cpp/module_impl.h" | 11 #include "ppapi/cpp/module_impl.h" |
12 | 12 |
13 namespace pp { | 13 namespace pp { |
14 | 14 |
15 namespace { | 15 namespace { |
16 | 16 |
17 template <> const char* interface_name<PPB_AudioInput_Dev_0_2>() { | 17 template <> const char* interface_name<PPB_AudioInput_Dev_0_2>() { |
18 return PPB_AUDIO_INPUT_DEV_INTERFACE_0_2; | 18 return PPB_AUDIO_INPUT_DEV_INTERFACE_0_2; |
19 } | 19 } |
20 | 20 |
| 21 template <> const char* interface_name<PPB_AudioInput_Dev_0_3>() { |
| 22 return PPB_AUDIO_INPUT_DEV_INTERFACE_0_3; |
| 23 } |
| 24 |
21 } // namespace | 25 } // namespace |
22 | 26 |
23 AudioInput_Dev::AudioInput_Dev() { | 27 AudioInput_Dev::AudioInput_Dev() { |
24 } | 28 } |
25 | 29 |
26 AudioInput_Dev::AudioInput_Dev(const InstanceHandle& instance) { | 30 AudioInput_Dev::AudioInput_Dev(const InstanceHandle& instance) { |
27 if (has_interface<PPB_AudioInput_Dev_0_2>()) { | 31 if (has_interface<PPB_AudioInput_Dev_0_3>()) { |
| 32 PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_3>()->Create( |
| 33 instance.pp_instance())); |
| 34 } else if (has_interface<PPB_AudioInput_Dev_0_2>()) { |
28 PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_2>()->Create( | 35 PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_2>()->Create( |
29 instance.pp_instance())); | 36 instance.pp_instance())); |
30 } | 37 } |
31 } | 38 } |
32 | 39 |
33 AudioInput_Dev::~AudioInput_Dev() { | 40 AudioInput_Dev::~AudioInput_Dev() { |
34 } | 41 } |
35 | 42 |
36 // static | 43 // static |
37 bool AudioInput_Dev::IsAvailable() { | 44 bool AudioInput_Dev::IsAvailable() { |
38 return has_interface<PPB_AudioInput_Dev_0_2>(); | 45 return has_interface<PPB_AudioInput_Dev_0_3>() || |
| 46 has_interface<PPB_AudioInput_Dev_0_2>(); |
39 } | 47 } |
40 | 48 |
41 int32_t AudioInput_Dev::EnumerateDevices( | 49 int32_t AudioInput_Dev::EnumerateDevices( |
42 const CompletionCallbackWithOutput<std::vector<DeviceRef_Dev> >& callback) { | 50 const CompletionCallbackWithOutput<std::vector<DeviceRef_Dev> >& callback) { |
43 if (!has_interface<PPB_AudioInput_Dev_0_2>()) | 51 if (has_interface<PPB_AudioInput_Dev_0_3>()) { |
44 return callback.MayForce(PP_ERROR_NOINTERFACE); | 52 return get_interface<PPB_AudioInput_Dev_0_3>()->EnumerateDevices( |
45 if (!callback.pp_completion_callback().func) | 53 pp_resource(), callback.output(), callback.pp_completion_callback()); |
46 return callback.MayForce(PP_ERROR_BLOCKS_MAIN_THREAD); | 54 } |
| 55 if (has_interface<PPB_AudioInput_Dev_0_2>()) { |
| 56 if (!callback.pp_completion_callback().func) |
| 57 return callback.MayForce(PP_ERROR_BLOCKS_MAIN_THREAD); |
47 | 58 |
48 // ArrayOutputCallbackConverter is responsible to delete it. | 59 // ArrayOutputCallbackConverter is responsible to delete it. |
49 ResourceArray_Dev::ArrayOutputCallbackData* data = | 60 ResourceArray_Dev::ArrayOutputCallbackData* data = |
50 new ResourceArray_Dev::ArrayOutputCallbackData( | 61 new ResourceArray_Dev::ArrayOutputCallbackData( |
51 callback.output(), callback.pp_completion_callback()); | 62 callback.output(), callback.pp_completion_callback()); |
52 return get_interface<PPB_AudioInput_Dev_0_2>()->EnumerateDevices( | 63 return get_interface<PPB_AudioInput_Dev_0_2>()->EnumerateDevices( |
53 pp_resource(), &data->resource_array_output, | 64 pp_resource(), &data->resource_array_output, |
54 PP_MakeCompletionCallback( | 65 PP_MakeCompletionCallback( |
55 &ResourceArray_Dev::ArrayOutputCallbackConverter, data)); | 66 &ResourceArray_Dev::ArrayOutputCallbackConverter, data)); |
| 67 } |
| 68 |
| 69 return callback.MayForce(PP_ERROR_NOINTERFACE); |
| 70 } |
| 71 |
| 72 int32_t AudioInput_Dev::MonitorDeviceChange( |
| 73 PP_MonitorDeviceChangeCallback callback, |
| 74 void* user_data) { |
| 75 if (has_interface<PPB_AudioInput_Dev_0_3>()) { |
| 76 return get_interface<PPB_AudioInput_Dev_0_3>()->MonitorDeviceChange( |
| 77 pp_resource(), callback, user_data); |
| 78 } |
| 79 |
| 80 return PP_ERROR_NOINTERFACE; |
56 } | 81 } |
57 | 82 |
58 int32_t AudioInput_Dev::Open(const DeviceRef_Dev& device_ref, | 83 int32_t AudioInput_Dev::Open(const DeviceRef_Dev& device_ref, |
59 const AudioConfig& config, | 84 const AudioConfig& config, |
60 PPB_AudioInput_Callback audio_input_callback, | 85 PPB_AudioInput_Callback audio_input_callback, |
61 void* user_data, | 86 void* user_data, |
62 const CompletionCallback& callback) { | 87 const CompletionCallback& callback) { |
| 88 if (has_interface<PPB_AudioInput_Dev_0_3>()) { |
| 89 return get_interface<PPB_AudioInput_Dev_0_3>()->Open( |
| 90 pp_resource(), device_ref.pp_resource(), config.pp_resource(), |
| 91 audio_input_callback, user_data, callback.pp_completion_callback()); |
| 92 } |
63 if (has_interface<PPB_AudioInput_Dev_0_2>()) { | 93 if (has_interface<PPB_AudioInput_Dev_0_2>()) { |
64 return get_interface<PPB_AudioInput_Dev_0_2>()->Open( | 94 return get_interface<PPB_AudioInput_Dev_0_2>()->Open( |
65 pp_resource(), device_ref.pp_resource(), config.pp_resource(), | 95 pp_resource(), device_ref.pp_resource(), config.pp_resource(), |
66 audio_input_callback, user_data, callback.pp_completion_callback()); | 96 audio_input_callback, user_data, callback.pp_completion_callback()); |
67 } | 97 } |
68 | 98 |
69 return callback.MayForce(PP_ERROR_NOINTERFACE); | 99 return callback.MayForce(PP_ERROR_NOINTERFACE); |
70 } | 100 } |
71 | 101 |
72 bool AudioInput_Dev::StartCapture() { | 102 bool AudioInput_Dev::StartCapture() { |
| 103 if (has_interface<PPB_AudioInput_Dev_0_3>()) { |
| 104 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_3>()->StartCapture( |
| 105 pp_resource())); |
| 106 } |
73 if (has_interface<PPB_AudioInput_Dev_0_2>()) { | 107 if (has_interface<PPB_AudioInput_Dev_0_2>()) { |
74 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StartCapture( | 108 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StartCapture( |
75 pp_resource())); | 109 pp_resource())); |
76 } | 110 } |
77 | 111 |
78 return false; | 112 return false; |
79 } | 113 } |
80 | 114 |
81 bool AudioInput_Dev::StopCapture() { | 115 bool AudioInput_Dev::StopCapture() { |
| 116 if (has_interface<PPB_AudioInput_Dev_0_3>()) { |
| 117 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_3>()->StopCapture( |
| 118 pp_resource())); |
| 119 } |
82 if (has_interface<PPB_AudioInput_Dev_0_2>()) { | 120 if (has_interface<PPB_AudioInput_Dev_0_2>()) { |
83 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StopCapture( | 121 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StopCapture( |
84 pp_resource())); | 122 pp_resource())); |
85 } | 123 } |
86 | 124 |
87 return false; | 125 return false; |
88 } | 126 } |
89 | 127 |
90 void AudioInput_Dev::Close() { | 128 void AudioInput_Dev::Close() { |
91 if (has_interface<PPB_AudioInput_Dev_0_2>()) | 129 if (has_interface<PPB_AudioInput_Dev_0_3>()) { |
| 130 get_interface<PPB_AudioInput_Dev_0_3>()->Close(pp_resource()); |
| 131 } else if (has_interface<PPB_AudioInput_Dev_0_2>()) { |
92 get_interface<PPB_AudioInput_Dev_0_2>()->Close(pp_resource()); | 132 get_interface<PPB_AudioInput_Dev_0_2>()->Close(pp_resource()); |
| 133 } |
93 } | 134 } |
94 | 135 |
95 } // namespace pp | 136 } // namespace pp |
OLD | NEW |