• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "audio_hw_default"
18 //#define LOG_NDEBUG 0
19 
20 #include <errno.h>
21 #include <pthread.h>
22 #include <stdint.h>
23 #include <sys/time.h>
24 
25 #include <cutils/log.h>
26 
27 #include <hardware/hardware.h>
28 #include <system/audio.h>
29 #include <hardware/audio.h>
30 
31 struct stub_audio_device {
32     struct audio_hw_device device;
33 };
34 
35 struct stub_stream_out {
36     struct audio_stream_out stream;
37 };
38 
39 struct stub_stream_in {
40     struct audio_stream_in stream;
41 };
42 
out_get_sample_rate(const struct audio_stream * stream)43 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
44 {
45     return 44100;
46 }
47 
out_set_sample_rate(struct audio_stream * stream,uint32_t rate)48 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
49 {
50     return 0;
51 }
52 
out_get_buffer_size(const struct audio_stream * stream)53 static size_t out_get_buffer_size(const struct audio_stream *stream)
54 {
55     return 4096;
56 }
57 
out_get_channels(const struct audio_stream * stream)58 static uint32_t out_get_channels(const struct audio_stream *stream)
59 {
60     return AUDIO_CHANNEL_OUT_STEREO;
61 }
62 
out_get_format(const struct audio_stream * stream)63 static audio_format_t out_get_format(const struct audio_stream *stream)
64 {
65     return AUDIO_FORMAT_PCM_16_BIT;
66 }
67 
out_set_format(struct audio_stream * stream,audio_format_t format)68 static int out_set_format(struct audio_stream *stream, audio_format_t format)
69 {
70     return 0;
71 }
72 
out_standby(struct audio_stream * stream)73 static int out_standby(struct audio_stream *stream)
74 {
75     return 0;
76 }
77 
out_dump(const struct audio_stream * stream,int fd)78 static int out_dump(const struct audio_stream *stream, int fd)
79 {
80     return 0;
81 }
82 
out_set_parameters(struct audio_stream * stream,const char * kvpairs)83 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
84 {
85     return 0;
86 }
87 
out_get_parameters(const struct audio_stream * stream,const char * keys)88 static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
89 {
90     return strdup("");
91 }
92 
out_get_latency(const struct audio_stream_out * stream)93 static uint32_t out_get_latency(const struct audio_stream_out *stream)
94 {
95     return 0;
96 }
97 
out_set_volume(struct audio_stream_out * stream,float left,float right)98 static int out_set_volume(struct audio_stream_out *stream, float left,
99                           float right)
100 {
101     return 0;
102 }
103 
out_write(struct audio_stream_out * stream,const void * buffer,size_t bytes)104 static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
105                          size_t bytes)
106 {
107     /* XXX: fake timing for audio output */
108     usleep(bytes * 1000000 / audio_stream_frame_size(&stream->common) /
109            out_get_sample_rate(&stream->common));
110     return bytes;
111 }
112 
out_get_render_position(const struct audio_stream_out * stream,uint32_t * dsp_frames)113 static int out_get_render_position(const struct audio_stream_out *stream,
114                                    uint32_t *dsp_frames)
115 {
116     return -EINVAL;
117 }
118 
out_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)119 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
120 {
121     return 0;
122 }
123 
out_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)124 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
125 {
126     return 0;
127 }
128 
out_get_next_write_timestamp(const struct audio_stream_out * stream,int64_t * timestamp)129 static int out_get_next_write_timestamp(const struct audio_stream_out *stream,
130                                         int64_t *timestamp)
131 {
132     return -EINVAL;
133 }
134 
135 /** audio_stream_in implementation **/
in_get_sample_rate(const struct audio_stream * stream)136 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
137 {
138     return 8000;
139 }
140 
in_set_sample_rate(struct audio_stream * stream,uint32_t rate)141 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
142 {
143     return 0;
144 }
145 
in_get_buffer_size(const struct audio_stream * stream)146 static size_t in_get_buffer_size(const struct audio_stream *stream)
147 {
148     return 320;
149 }
150 
in_get_channels(const struct audio_stream * stream)151 static uint32_t in_get_channels(const struct audio_stream *stream)
152 {
153     return AUDIO_CHANNEL_IN_MONO;
154 }
155 
in_get_format(const struct audio_stream * stream)156 static audio_format_t in_get_format(const struct audio_stream *stream)
157 {
158     return AUDIO_FORMAT_PCM_16_BIT;
159 }
160 
in_set_format(struct audio_stream * stream,audio_format_t format)161 static int in_set_format(struct audio_stream *stream, audio_format_t format)
162 {
163     return 0;
164 }
165 
in_standby(struct audio_stream * stream)166 static int in_standby(struct audio_stream *stream)
167 {
168     return 0;
169 }
170 
in_dump(const struct audio_stream * stream,int fd)171 static int in_dump(const struct audio_stream *stream, int fd)
172 {
173     return 0;
174 }
175 
in_set_parameters(struct audio_stream * stream,const char * kvpairs)176 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
177 {
178     return 0;
179 }
180 
in_get_parameters(const struct audio_stream * stream,const char * keys)181 static char * in_get_parameters(const struct audio_stream *stream,
182                                 const char *keys)
183 {
184     return strdup("");
185 }
186 
in_set_gain(struct audio_stream_in * stream,float gain)187 static int in_set_gain(struct audio_stream_in *stream, float gain)
188 {
189     return 0;
190 }
191 
in_read(struct audio_stream_in * stream,void * buffer,size_t bytes)192 static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
193                        size_t bytes)
194 {
195     /* XXX: fake timing for audio input */
196     usleep(bytes * 1000000 / audio_stream_frame_size(&stream->common) /
197            in_get_sample_rate(&stream->common));
198     return bytes;
199 }
200 
in_get_input_frames_lost(struct audio_stream_in * stream)201 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
202 {
203     return 0;
204 }
205 
in_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)206 static int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
207 {
208     return 0;
209 }
210 
in_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)211 static int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
212 {
213     return 0;
214 }
215 
adev_open_output_stream(struct audio_hw_device * dev,audio_io_handle_t handle,audio_devices_t devices,audio_output_flags_t flags,struct audio_config * config,struct audio_stream_out ** stream_out)216 static int adev_open_output_stream(struct audio_hw_device *dev,
217                                    audio_io_handle_t handle,
218                                    audio_devices_t devices,
219                                    audio_output_flags_t flags,
220                                    struct audio_config *config,
221                                    struct audio_stream_out **stream_out)
222 {
223     struct stub_audio_device *ladev = (struct stub_audio_device *)dev;
224     struct stub_stream_out *out;
225     int ret;
226 
227     out = (struct stub_stream_out *)calloc(1, sizeof(struct stub_stream_out));
228     if (!out)
229         return -ENOMEM;
230 
231     out->stream.common.get_sample_rate = out_get_sample_rate;
232     out->stream.common.set_sample_rate = out_set_sample_rate;
233     out->stream.common.get_buffer_size = out_get_buffer_size;
234     out->stream.common.get_channels = out_get_channels;
235     out->stream.common.get_format = out_get_format;
236     out->stream.common.set_format = out_set_format;
237     out->stream.common.standby = out_standby;
238     out->stream.common.dump = out_dump;
239     out->stream.common.set_parameters = out_set_parameters;
240     out->stream.common.get_parameters = out_get_parameters;
241     out->stream.common.add_audio_effect = out_add_audio_effect;
242     out->stream.common.remove_audio_effect = out_remove_audio_effect;
243     out->stream.get_latency = out_get_latency;
244     out->stream.set_volume = out_set_volume;
245     out->stream.write = out_write;
246     out->stream.get_render_position = out_get_render_position;
247     out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
248 
249     *stream_out = &out->stream;
250     return 0;
251 
252 err_open:
253     free(out);
254     *stream_out = NULL;
255     return ret;
256 }
257 
adev_close_output_stream(struct audio_hw_device * dev,struct audio_stream_out * stream)258 static void adev_close_output_stream(struct audio_hw_device *dev,
259                                      struct audio_stream_out *stream)
260 {
261     free(stream);
262 }
263 
adev_set_parameters(struct audio_hw_device * dev,const char * kvpairs)264 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
265 {
266     return -ENOSYS;
267 }
268 
adev_get_parameters(const struct audio_hw_device * dev,const char * keys)269 static char * adev_get_parameters(const struct audio_hw_device *dev,
270                                   const char *keys)
271 {
272     return NULL;
273 }
274 
adev_init_check(const struct audio_hw_device * dev)275 static int adev_init_check(const struct audio_hw_device *dev)
276 {
277     return 0;
278 }
279 
adev_set_voice_volume(struct audio_hw_device * dev,float volume)280 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
281 {
282     return -ENOSYS;
283 }
284 
adev_set_master_volume(struct audio_hw_device * dev,float volume)285 static int adev_set_master_volume(struct audio_hw_device *dev, float volume)
286 {
287     return -ENOSYS;
288 }
289 
adev_get_master_volume(struct audio_hw_device * dev,float * volume)290 static int adev_get_master_volume(struct audio_hw_device *dev,
291                                   float *volume)
292 {
293     return -ENOSYS;
294 }
295 
adev_set_mode(struct audio_hw_device * dev,audio_mode_t mode)296 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
297 {
298     return 0;
299 }
300 
adev_set_mic_mute(struct audio_hw_device * dev,bool state)301 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
302 {
303     return -ENOSYS;
304 }
305 
adev_get_mic_mute(const struct audio_hw_device * dev,bool * state)306 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
307 {
308     return -ENOSYS;
309 }
310 
adev_get_input_buffer_size(const struct audio_hw_device * dev,const struct audio_config * config)311 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev,
312                                          const struct audio_config *config)
313 {
314     return 320;
315 }
316 
adev_open_input_stream(struct audio_hw_device * dev,audio_io_handle_t handle,audio_devices_t devices,struct audio_config * config,struct audio_stream_in ** stream_in)317 static int adev_open_input_stream(struct audio_hw_device *dev,
318                                   audio_io_handle_t handle,
319                                   audio_devices_t devices,
320                                   struct audio_config *config,
321                                   struct audio_stream_in **stream_in)
322 {
323     struct stub_audio_device *ladev = (struct stub_audio_device *)dev;
324     struct stub_stream_in *in;
325     int ret;
326 
327     in = (struct stub_stream_in *)calloc(1, sizeof(struct stub_stream_in));
328     if (!in)
329         return -ENOMEM;
330 
331     in->stream.common.get_sample_rate = in_get_sample_rate;
332     in->stream.common.set_sample_rate = in_set_sample_rate;
333     in->stream.common.get_buffer_size = in_get_buffer_size;
334     in->stream.common.get_channels = in_get_channels;
335     in->stream.common.get_format = in_get_format;
336     in->stream.common.set_format = in_set_format;
337     in->stream.common.standby = in_standby;
338     in->stream.common.dump = in_dump;
339     in->stream.common.set_parameters = in_set_parameters;
340     in->stream.common.get_parameters = in_get_parameters;
341     in->stream.common.add_audio_effect = in_add_audio_effect;
342     in->stream.common.remove_audio_effect = in_remove_audio_effect;
343     in->stream.set_gain = in_set_gain;
344     in->stream.read = in_read;
345     in->stream.get_input_frames_lost = in_get_input_frames_lost;
346 
347     *stream_in = &in->stream;
348     return 0;
349 
350 err_open:
351     free(in);
352     *stream_in = NULL;
353     return ret;
354 }
355 
adev_close_input_stream(struct audio_hw_device * dev,struct audio_stream_in * in)356 static void adev_close_input_stream(struct audio_hw_device *dev,
357                                    struct audio_stream_in *in)
358 {
359     return;
360 }
361 
adev_dump(const audio_hw_device_t * device,int fd)362 static int adev_dump(const audio_hw_device_t *device, int fd)
363 {
364     return 0;
365 }
366 
adev_close(hw_device_t * device)367 static int adev_close(hw_device_t *device)
368 {
369     free(device);
370     return 0;
371 }
372 
adev_get_supported_devices(const struct audio_hw_device * dev)373 static uint32_t adev_get_supported_devices(const struct audio_hw_device *dev)
374 {
375     return (/* OUT */
376             AUDIO_DEVICE_OUT_EARPIECE |
377             AUDIO_DEVICE_OUT_SPEAKER |
378             AUDIO_DEVICE_OUT_WIRED_HEADSET |
379             AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
380             AUDIO_DEVICE_OUT_AUX_DIGITAL |
381             AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET |
382             AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET |
383             AUDIO_DEVICE_OUT_ALL_SCO |
384             AUDIO_DEVICE_OUT_DEFAULT |
385             /* IN */
386             AUDIO_DEVICE_IN_COMMUNICATION |
387             AUDIO_DEVICE_IN_AMBIENT |
388             AUDIO_DEVICE_IN_BUILTIN_MIC |
389             AUDIO_DEVICE_IN_WIRED_HEADSET |
390             AUDIO_DEVICE_IN_AUX_DIGITAL |
391             AUDIO_DEVICE_IN_BACK_MIC |
392             AUDIO_DEVICE_IN_ALL_SCO |
393             AUDIO_DEVICE_IN_DEFAULT);
394 }
395 
adev_open(const hw_module_t * module,const char * name,hw_device_t ** device)396 static int adev_open(const hw_module_t* module, const char* name,
397                      hw_device_t** device)
398 {
399     struct stub_audio_device *adev;
400     int ret;
401 
402     if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
403         return -EINVAL;
404 
405     adev = calloc(1, sizeof(struct stub_audio_device));
406     if (!adev)
407         return -ENOMEM;
408 
409     adev->device.common.tag = HARDWARE_DEVICE_TAG;
410     adev->device.common.version = AUDIO_DEVICE_API_VERSION_1_0;
411     adev->device.common.module = (struct hw_module_t *) module;
412     adev->device.common.close = adev_close;
413 
414     adev->device.get_supported_devices = adev_get_supported_devices;
415     adev->device.init_check = adev_init_check;
416     adev->device.set_voice_volume = adev_set_voice_volume;
417     adev->device.set_master_volume = adev_set_master_volume;
418     adev->device.get_master_volume = adev_get_master_volume;
419     adev->device.set_mode = adev_set_mode;
420     adev->device.set_mic_mute = adev_set_mic_mute;
421     adev->device.get_mic_mute = adev_get_mic_mute;
422     adev->device.set_parameters = adev_set_parameters;
423     adev->device.get_parameters = adev_get_parameters;
424     adev->device.get_input_buffer_size = adev_get_input_buffer_size;
425     adev->device.open_output_stream = adev_open_output_stream;
426     adev->device.close_output_stream = adev_close_output_stream;
427     adev->device.open_input_stream = adev_open_input_stream;
428     adev->device.close_input_stream = adev_close_input_stream;
429     adev->device.dump = adev_dump;
430 
431     *device = &adev->device.common;
432 
433     return 0;
434 }
435 
436 static struct hw_module_methods_t hal_module_methods = {
437     .open = adev_open,
438 };
439 
440 struct audio_module HAL_MODULE_INFO_SYM = {
441     .common = {
442         .tag = HARDWARE_MODULE_TAG,
443         .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
444         .hal_api_version = HARDWARE_HAL_API_VERSION,
445         .id = AUDIO_HARDWARE_MODULE_ID,
446         .name = "Default audio HW HAL",
447         .author = "The Android Open Source Project",
448         .methods = &hal_module_methods,
449     },
450 };
451