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_1>() { | |
22 return PPB_AUDIO_INPUT_DEV_INTERFACE_0_1; | |
23 } | |
24 | |
25 } // namespace | 21 } // namespace |
26 | 22 |
27 AudioInput_Dev::AudioInput_Dev() : audio_input_callback_(NULL), | 23 AudioInput_Dev::AudioInput_Dev() { |
28 user_data_(NULL) { | |
29 } | 24 } |
30 | 25 |
31 AudioInput_Dev::AudioInput_Dev(const InstanceHandle& instance, | 26 AudioInput_Dev::AudioInput_Dev(const InstanceHandle& instance) { |
32 const AudioConfig& config, | |
33 PPB_AudioInput_Callback callback, | |
34 void* user_data) | |
35 : config_(config), | |
36 audio_input_callback_(callback), | |
37 user_data_(user_data) { | |
38 if (has_interface<PPB_AudioInput_Dev_0_2>()) { | 27 if (has_interface<PPB_AudioInput_Dev_0_2>()) { |
39 PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_2>()->Create( | 28 PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_2>()->Create( |
40 instance.pp_instance())); | 29 instance.pp_instance())); |
41 } else if (has_interface<PPB_AudioInput_Dev_0_1>()) { | |
42 PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_1>()->Create( | |
43 instance.pp_instance(), config.pp_resource(), callback, user_data)); | |
44 } | |
45 } | |
46 | |
47 AudioInput_Dev::AudioInput_Dev(const InstanceHandle& instance) | |
48 : audio_input_callback_(NULL), | |
49 user_data_(NULL) { | |
50 if (has_interface<PPB_AudioInput_Dev_0_2>()) { | |
51 PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_2>()->Create( | |
52 instance.pp_instance())); | |
53 } | 30 } |
54 } | 31 } |
55 | 32 |
56 AudioInput_Dev::~AudioInput_Dev() { | 33 AudioInput_Dev::~AudioInput_Dev() { |
57 } | 34 } |
58 | 35 |
59 // static | 36 // static |
60 bool AudioInput_Dev::IsAvailable() { | 37 bool AudioInput_Dev::IsAvailable() { |
61 return has_interface<PPB_AudioInput_Dev_0_2>() || | 38 return has_interface<PPB_AudioInput_Dev_0_2>(); |
62 has_interface<PPB_AudioInput_Dev_0_1>(); | |
63 } | 39 } |
64 | 40 |
65 int32_t AudioInput_Dev::EnumerateDevices( | 41 int32_t AudioInput_Dev::EnumerateDevices( |
66 const CompletionCallbackWithOutput<std::vector<DeviceRef_Dev> >& callback) { | 42 const CompletionCallbackWithOutput<std::vector<DeviceRef_Dev> >& callback) { |
67 if (!has_interface<PPB_AudioInput_Dev_0_2>()) | 43 if (!has_interface<PPB_AudioInput_Dev_0_2>()) |
68 return callback.MayForce(PP_ERROR_NOINTERFACE); | 44 return callback.MayForce(PP_ERROR_NOINTERFACE); |
69 if (!callback.pp_completion_callback().func) | 45 if (!callback.pp_completion_callback().func) |
70 return callback.MayForce(PP_ERROR_BLOCKS_MAIN_THREAD); | 46 return callback.MayForce(PP_ERROR_BLOCKS_MAIN_THREAD); |
71 | 47 |
72 // ArrayOutputCallbackConverter is responsible to delete it. | 48 // ArrayOutputCallbackConverter is responsible to delete it. |
73 ResourceArray_Dev::ArrayOutputCallbackData* data = | 49 ResourceArray_Dev::ArrayOutputCallbackData* data = |
74 new ResourceArray_Dev::ArrayOutputCallbackData( | 50 new ResourceArray_Dev::ArrayOutputCallbackData( |
75 callback.output(), callback.pp_completion_callback()); | 51 callback.output(), callback.pp_completion_callback()); |
76 return get_interface<PPB_AudioInput_Dev_0_2>()->EnumerateDevices( | 52 return get_interface<PPB_AudioInput_Dev_0_2>()->EnumerateDevices( |
77 pp_resource(), &data->resource_array_output, | 53 pp_resource(), &data->resource_array_output, |
78 PP_MakeCompletionCallback( | 54 PP_MakeCompletionCallback( |
79 &ResourceArray_Dev::ArrayOutputCallbackConverter, data)); | 55 &ResourceArray_Dev::ArrayOutputCallbackConverter, data)); |
80 } | 56 } |
81 | 57 |
82 int32_t AudioInput_Dev::Open(const DeviceRef_Dev& device_ref, | 58 int32_t AudioInput_Dev::Open(const DeviceRef_Dev& device_ref, |
83 const CompletionCallback& callback) { | |
84 if (has_interface<PPB_AudioInput_Dev_0_2>()) { | |
85 return get_interface<PPB_AudioInput_Dev_0_2>()->Open( | |
86 pp_resource(), device_ref.pp_resource(), config_.pp_resource(), | |
87 audio_input_callback_, user_data_, callback.pp_completion_callback()); | |
88 } | |
89 | |
90 if (has_interface<PPB_AudioInput_Dev_0_1>()) { | |
91 if (is_null()) | |
92 return callback.MayForce(PP_ERROR_FAILED); | |
93 | |
94 // If the v0.1 interface is being used and there is a valid resource handle, | |
95 // then the default device has been successfully opened during resource | |
96 // creation. | |
97 if (device_ref.is_null()) | |
98 return callback.MayForce(PP_OK); | |
99 | |
100 // The v0.1 interface doesn't support devices other than the default one. | |
101 return callback.MayForce(PP_ERROR_NOTSUPPORTED); | |
102 } | |
103 | |
104 return callback.MayForce(PP_ERROR_NOINTERFACE); | |
105 } | |
106 | |
107 int32_t AudioInput_Dev::Open(const DeviceRef_Dev& device_ref, | |
108 const AudioConfig& config, | 59 const AudioConfig& config, |
109 PPB_AudioInput_Callback audio_input_callback, | 60 PPB_AudioInput_Callback audio_input_callback, |
110 void* user_data, | 61 void* user_data, |
111 const CompletionCallback& callback) { | 62 const CompletionCallback& callback) { |
112 if (has_interface<PPB_AudioInput_Dev_0_2>()) { | 63 if (has_interface<PPB_AudioInput_Dev_0_2>()) { |
113 return get_interface<PPB_AudioInput_Dev_0_2>()->Open( | 64 return get_interface<PPB_AudioInput_Dev_0_2>()->Open( |
114 pp_resource(), device_ref.pp_resource(), config.pp_resource(), | 65 pp_resource(), device_ref.pp_resource(), config.pp_resource(), |
115 audio_input_callback, user_data, callback.pp_completion_callback()); | 66 audio_input_callback, user_data, callback.pp_completion_callback()); |
116 } | 67 } |
117 | 68 |
118 return callback.MayForce(PP_ERROR_NOINTERFACE); | 69 return callback.MayForce(PP_ERROR_NOINTERFACE); |
119 } | 70 } |
120 | 71 |
121 bool AudioInput_Dev::StartCapture() { | 72 bool AudioInput_Dev::StartCapture() { |
122 if (has_interface<PPB_AudioInput_Dev_0_2>()) { | 73 if (has_interface<PPB_AudioInput_Dev_0_2>()) { |
123 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StartCapture( | 74 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StartCapture( |
124 pp_resource())); | 75 pp_resource())); |
125 } | 76 } |
126 | 77 |
127 if (has_interface<PPB_AudioInput_Dev_0_1>()) { | |
128 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_1>()->StartCapture( | |
129 pp_resource())); | |
130 } | |
131 | |
132 return false; | 78 return false; |
133 } | 79 } |
134 | 80 |
135 bool AudioInput_Dev::StopCapture() { | 81 bool AudioInput_Dev::StopCapture() { |
136 if (has_interface<PPB_AudioInput_Dev_0_2>()) { | 82 if (has_interface<PPB_AudioInput_Dev_0_2>()) { |
137 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StopCapture( | 83 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StopCapture( |
138 pp_resource())); | 84 pp_resource())); |
139 } | 85 } |
140 | 86 |
141 if (has_interface<PPB_AudioInput_Dev_0_1>()) { | |
142 return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_1>()->StopCapture( | |
143 pp_resource())); | |
144 } | |
145 | |
146 return false; | 87 return false; |
147 } | 88 } |
148 | 89 |
149 void AudioInput_Dev::Close() { | 90 void AudioInput_Dev::Close() { |
150 if (has_interface<PPB_AudioInput_Dev_0_2>()) | 91 if (has_interface<PPB_AudioInput_Dev_0_2>()) |
151 get_interface<PPB_AudioInput_Dev_0_2>()->Close(pp_resource()); | 92 get_interface<PPB_AudioInput_Dev_0_2>()->Close(pp_resource()); |
152 } | 93 } |
153 | 94 |
154 } // namespace pp | 95 } // namespace pp |
OLD | NEW |