• 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 <malloc.h>
22 #include <pthread.h>
23 #include <stdint.h>
24 #include <sys/time.h>
25 
26 #include <cutils/log.h>
27 
28 #include <hardware/hardware.h>
29 #include <system/audio.h>
30 #include <hardware/audio.h>
31 
32 struct stub_audio_device {
33     struct audio_hw_device device;
34 };
35 
36 struct stub_stream_out {
37     struct audio_stream_out stream;
38 };
39 
40 struct stub_stream_in {
41     struct audio_stream_in stream;
42 };
43 
out_get_sample_rate(const struct audio_stream * stream)44 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
45 {
46     return 44100;
47 }
48 
out_set_sample_rate(struct audio_stream * stream,uint32_t rate)49 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
50 {
51     ALOGV("out_set_sample_rate: %d", 0);
52     return -ENOSYS;
53 }
54 
out_get_buffer_size(const struct audio_stream * stream)55 static size_t out_get_buffer_size(const struct audio_stream *stream)
56 {
57     ALOGV("out_get_buffer_size: %d", 4096);
58     return 4096;
59 }
60 
out_get_channels(const struct audio_stream * stream)61 static audio_channel_mask_t out_get_channels(const struct audio_stream *stream)
62 {
63     ALOGV("out_get_channels");
64     return AUDIO_CHANNEL_OUT_STEREO;
65 }
66 
out_get_format(const struct audio_stream * stream)67 static audio_format_t out_get_format(const struct audio_stream *stream)
68 {
69     ALOGV("out_get_format");
70     return AUDIO_FORMAT_PCM_16_BIT;
71 }
72 
out_set_format(struct audio_stream * stream,audio_format_t format)73 static int out_set_format(struct audio_stream *stream, audio_format_t format)
74 {
75     ALOGV("out_set_format: %d",format);
76     return -ENOSYS;
77 }
78 
out_standby(struct audio_stream * stream)79 static int out_standby(struct audio_stream *stream)
80 {
81     ALOGV("out_standby");
82 
83     return 0;
84 }
85 
out_dump(const struct audio_stream * stream,int fd)86 static int out_dump(const struct audio_stream *stream, int fd)
87 {
88     ALOGV("out_dump");
89     return 0;
90 }
91 
out_set_parameters(struct audio_stream * stream,const char * kvpairs)92 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
93 {
94     ALOGV("out_set_parameters");
95     return 0;
96 }
97 
out_get_parameters(const struct audio_stream * stream,const char * keys)98 static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
99 {
100     ALOGV("out_get_parameters");
101     return strdup("");
102 }
103 
out_get_latency(const struct audio_stream_out * stream)104 static uint32_t out_get_latency(const struct audio_stream_out *stream)
105 {
106     ALOGV("out_get_latency");
107     return 0;
108 }
109 
out_set_volume(struct audio_stream_out * stream,float left,float right)110 static int out_set_volume(struct audio_stream_out *stream, float left,
111                           float right)
112 {
113     ALOGV("out_set_volume: Left:%f Right:%f", left, right);
114     return 0;
115 }
116 
out_write(struct audio_stream_out * stream,const void * buffer,size_t bytes)117 static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
118                          size_t bytes)
119 {
120     ALOGV("out_write: bytes: %d", bytes);
121     /* XXX: fake timing for audio output */
122     usleep((int64_t)bytes * 1000000 / audio_stream_out_frame_size(stream) /
123            out_get_sample_rate(&stream->common));
124     return bytes;
125 }
126 
out_get_render_position(const struct audio_stream_out * stream,uint32_t * dsp_frames)127 static int out_get_render_position(const struct audio_stream_out *stream,
128                                    uint32_t *dsp_frames)
129 {
130     *dsp_frames = 0;
131     ALOGV("out_get_render_position: dsp_frames: %p", dsp_frames);
132     return -EINVAL;
133 }
134 
out_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)135 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
136 {
137     ALOGV("out_add_audio_effect: %p", effect);
138     return 0;
139 }
140 
out_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)141 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
142 {
143     ALOGV("out_remove_audio_effect: %p", effect);
144     return 0;
145 }
146 
out_get_next_write_timestamp(const struct audio_stream_out * stream,int64_t * timestamp)147 static int out_get_next_write_timestamp(const struct audio_stream_out *stream,
148                                         int64_t *timestamp)
149 {
150     *timestamp = 0;
151     ALOGV("out_get_next_write_timestamp: %ld", (long int)(*timestamp));
152     return -EINVAL;
153 }
154 
155 /** audio_stream_in implementation **/
in_get_sample_rate(const struct audio_stream * stream)156 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
157 {
158     ALOGV("in_get_sample_rate");
159     return 8000;
160 }
161 
in_set_sample_rate(struct audio_stream * stream,uint32_t rate)162 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
163 {
164     ALOGV("in_set_sample_rate: %d", rate);
165     return -ENOSYS;
166 }
167 
in_get_buffer_size(const struct audio_stream * stream)168 static size_t in_get_buffer_size(const struct audio_stream *stream)
169 {
170     ALOGV("in_get_buffer_size: %d", 320);
171     return 320;
172 }
173 
in_get_channels(const struct audio_stream * stream)174 static audio_channel_mask_t in_get_channels(const struct audio_stream *stream)
175 {
176     ALOGV("in_get_channels: %d", AUDIO_CHANNEL_IN_MONO);
177     return AUDIO_CHANNEL_IN_MONO;
178 }
179 
in_get_format(const struct audio_stream * stream)180 static audio_format_t in_get_format(const struct audio_stream *stream)
181 {
182     return AUDIO_FORMAT_PCM_16_BIT;
183 }
184 
in_set_format(struct audio_stream * stream,audio_format_t format)185 static int in_set_format(struct audio_stream *stream, audio_format_t format)
186 {
187     return -ENOSYS;
188 }
189 
in_standby(struct audio_stream * stream)190 static int in_standby(struct audio_stream *stream)
191 {
192     return 0;
193 }
194 
in_dump(const struct audio_stream * stream,int fd)195 static int in_dump(const struct audio_stream *stream, int fd)
196 {
197     return 0;
198 }
199 
in_set_parameters(struct audio_stream * stream,const char * kvpairs)200 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
201 {
202     return 0;
203 }
204 
in_get_parameters(const struct audio_stream * stream,const char * keys)205 static char * in_get_parameters(const struct audio_stream *stream,
206                                 const char *keys)
207 {
208     return strdup("");
209 }
210 
in_set_gain(struct audio_stream_in * stream,float gain)211 static int in_set_gain(struct audio_stream_in *stream, float gain)
212 {
213     return 0;
214 }
215 
in_read(struct audio_stream_in * stream,void * buffer,size_t bytes)216 static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
217                        size_t bytes)
218 {
219     ALOGV("in_read: bytes %d", bytes);
220     /* XXX: fake timing for audio input */
221     usleep((int64_t)bytes * 1000000 / audio_stream_in_frame_size(stream) /
222            in_get_sample_rate(&stream->common));
223     memset(buffer, 0, bytes);
224     return bytes;
225 }
226 
in_get_input_frames_lost(struct audio_stream_in * stream)227 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
228 {
229     return 0;
230 }
231 
in_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)232 static int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
233 {
234     return 0;
235 }
236 
in_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)237 static int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
238 {
239     return 0;
240 }
241 
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,const char * address __unused)242 static int adev_open_output_stream(struct audio_hw_device *dev,
243                                    audio_io_handle_t handle,
244                                    audio_devices_t devices,
245                                    audio_output_flags_t flags,
246                                    struct audio_config *config,
247                                    struct audio_stream_out **stream_out,
248                                    const char *address __unused)
249 {
250     ALOGV("adev_open_output_stream...");
251 
252     struct stub_audio_device *ladev = (struct stub_audio_device *)dev;
253     struct stub_stream_out *out;
254     int ret;
255 
256     out = (struct stub_stream_out *)calloc(1, sizeof(struct stub_stream_out));
257     if (!out)
258         return -ENOMEM;
259 
260     out->stream.common.get_sample_rate = out_get_sample_rate;
261     out->stream.common.set_sample_rate = out_set_sample_rate;
262     out->stream.common.get_buffer_size = out_get_buffer_size;
263     out->stream.common.get_channels = out_get_channels;
264     out->stream.common.get_format = out_get_format;
265     out->stream.common.set_format = out_set_format;
266     out->stream.common.standby = out_standby;
267     out->stream.common.dump = out_dump;
268     out->stream.common.set_parameters = out_set_parameters;
269     out->stream.common.get_parameters = out_get_parameters;
270     out->stream.common.add_audio_effect = out_add_audio_effect;
271     out->stream.common.remove_audio_effect = out_remove_audio_effect;
272     out->stream.get_latency = out_get_latency;
273     out->stream.set_volume = out_set_volume;
274     out->stream.write = out_write;
275     out->stream.get_render_position = out_get_render_position;
276     out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
277 
278     *stream_out = &out->stream;
279     return 0;
280 
281 err_open:
282     free(out);
283     *stream_out = NULL;
284     return ret;
285 }
286 
adev_close_output_stream(struct audio_hw_device * dev,struct audio_stream_out * stream)287 static void adev_close_output_stream(struct audio_hw_device *dev,
288                                      struct audio_stream_out *stream)
289 {
290     ALOGV("adev_close_output_stream...");
291     free(stream);
292 }
293 
adev_set_parameters(struct audio_hw_device * dev,const char * kvpairs)294 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
295 {
296     ALOGV("adev_set_parameters");
297     return -ENOSYS;
298 }
299 
adev_get_parameters(const struct audio_hw_device * dev,const char * keys)300 static char * adev_get_parameters(const struct audio_hw_device *dev,
301                                   const char *keys)
302 {
303     ALOGV("adev_get_parameters");
304     return strdup("");
305 }
306 
adev_init_check(const struct audio_hw_device * dev)307 static int adev_init_check(const struct audio_hw_device *dev)
308 {
309     ALOGV("adev_init_check");
310     return 0;
311 }
312 
adev_set_voice_volume(struct audio_hw_device * dev,float volume)313 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
314 {
315     ALOGV("adev_set_voice_volume: %f", volume);
316     return -ENOSYS;
317 }
318 
adev_set_master_volume(struct audio_hw_device * dev,float volume)319 static int adev_set_master_volume(struct audio_hw_device *dev, float volume)
320 {
321     ALOGV("adev_set_master_volume: %f", volume);
322     return -ENOSYS;
323 }
324 
adev_get_master_volume(struct audio_hw_device * dev,float * volume)325 static int adev_get_master_volume(struct audio_hw_device *dev, float *volume)
326 {
327     ALOGV("adev_get_master_volume: %f", *volume);
328     return -ENOSYS;
329 }
330 
adev_set_master_mute(struct audio_hw_device * dev,bool muted)331 static int adev_set_master_mute(struct audio_hw_device *dev, bool muted)
332 {
333     ALOGV("adev_set_master_mute: %d", muted);
334     return -ENOSYS;
335 }
336 
adev_get_master_mute(struct audio_hw_device * dev,bool * muted)337 static int adev_get_master_mute(struct audio_hw_device *dev, bool *muted)
338 {
339     ALOGV("adev_get_master_mute: %d", *muted);
340     return -ENOSYS;
341 }
342 
adev_set_mode(struct audio_hw_device * dev,audio_mode_t mode)343 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
344 {
345     ALOGV("adev_set_mode: %d", mode);
346     return 0;
347 }
348 
adev_set_mic_mute(struct audio_hw_device * dev,bool state)349 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
350 {
351     ALOGV("adev_set_mic_mute: %d",state);
352     return -ENOSYS;
353 }
354 
adev_get_mic_mute(const struct audio_hw_device * dev,bool * state)355 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
356 {
357     ALOGV("adev_get_mic_mute");
358     return -ENOSYS;
359 }
360 
adev_get_input_buffer_size(const struct audio_hw_device * dev,const struct audio_config * config)361 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev,
362                                          const struct audio_config *config)
363 {
364     ALOGV("adev_get_input_buffer_size: %d", 320);
365     return 320;
366 }
367 
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,audio_input_flags_t flags __unused,const char * address __unused,audio_source_t source __unused)368 static int adev_open_input_stream(struct audio_hw_device *dev,
369                                   audio_io_handle_t handle,
370                                   audio_devices_t devices,
371                                   struct audio_config *config,
372                                   struct audio_stream_in **stream_in,
373                                   audio_input_flags_t flags __unused,
374                                   const char *address __unused,
375                                   audio_source_t source __unused)
376 {
377     ALOGV("adev_open_input_stream...");
378 
379     struct stub_audio_device *ladev = (struct stub_audio_device *)dev;
380     struct stub_stream_in *in;
381     int ret;
382 
383     in = (struct stub_stream_in *)calloc(1, sizeof(struct stub_stream_in));
384     if (!in)
385         return -ENOMEM;
386 
387     in->stream.common.get_sample_rate = in_get_sample_rate;
388     in->stream.common.set_sample_rate = in_set_sample_rate;
389     in->stream.common.get_buffer_size = in_get_buffer_size;
390     in->stream.common.get_channels = in_get_channels;
391     in->stream.common.get_format = in_get_format;
392     in->stream.common.set_format = in_set_format;
393     in->stream.common.standby = in_standby;
394     in->stream.common.dump = in_dump;
395     in->stream.common.set_parameters = in_set_parameters;
396     in->stream.common.get_parameters = in_get_parameters;
397     in->stream.common.add_audio_effect = in_add_audio_effect;
398     in->stream.common.remove_audio_effect = in_remove_audio_effect;
399     in->stream.set_gain = in_set_gain;
400     in->stream.read = in_read;
401     in->stream.get_input_frames_lost = in_get_input_frames_lost;
402 
403     *stream_in = &in->stream;
404     return 0;
405 
406 err_open:
407     free(in);
408     *stream_in = NULL;
409     return ret;
410 }
411 
adev_close_input_stream(struct audio_hw_device * dev,struct audio_stream_in * in)412 static void adev_close_input_stream(struct audio_hw_device *dev,
413                                    struct audio_stream_in *in)
414 {
415     ALOGV("adev_close_input_stream...");
416     return;
417 }
418 
adev_dump(const audio_hw_device_t * device,int fd)419 static int adev_dump(const audio_hw_device_t *device, int fd)
420 {
421     ALOGV("adev_dump");
422     return 0;
423 }
424 
adev_close(hw_device_t * device)425 static int adev_close(hw_device_t *device)
426 {
427     ALOGV("adev_close");
428     free(device);
429     return 0;
430 }
431 
adev_open(const hw_module_t * module,const char * name,hw_device_t ** device)432 static int adev_open(const hw_module_t* module, const char* name,
433                      hw_device_t** device)
434 {
435     ALOGV("adev_open: %s", name);
436 
437     struct stub_audio_device *adev;
438     int ret;
439 
440     if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
441         return -EINVAL;
442 
443     adev = calloc(1, sizeof(struct stub_audio_device));
444     if (!adev)
445         return -ENOMEM;
446 
447     adev->device.common.tag = HARDWARE_DEVICE_TAG;
448     adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
449     adev->device.common.module = (struct hw_module_t *) module;
450     adev->device.common.close = adev_close;
451 
452     adev->device.init_check = adev_init_check;
453     adev->device.set_voice_volume = adev_set_voice_volume;
454     adev->device.set_master_volume = adev_set_master_volume;
455     adev->device.get_master_volume = adev_get_master_volume;
456     adev->device.set_master_mute = adev_set_master_mute;
457     adev->device.get_master_mute = adev_get_master_mute;
458     adev->device.set_mode = adev_set_mode;
459     adev->device.set_mic_mute = adev_set_mic_mute;
460     adev->device.get_mic_mute = adev_get_mic_mute;
461     adev->device.set_parameters = adev_set_parameters;
462     adev->device.get_parameters = adev_get_parameters;
463     adev->device.get_input_buffer_size = adev_get_input_buffer_size;
464     adev->device.open_output_stream = adev_open_output_stream;
465     adev->device.close_output_stream = adev_close_output_stream;
466     adev->device.open_input_stream = adev_open_input_stream;
467     adev->device.close_input_stream = adev_close_input_stream;
468     adev->device.dump = adev_dump;
469 
470     *device = &adev->device.common;
471 
472     return 0;
473 }
474 
475 static struct hw_module_methods_t hal_module_methods = {
476     .open = adev_open,
477 };
478 
479 struct audio_module HAL_MODULE_INFO_SYM = {
480     .common = {
481         .tag = HARDWARE_MODULE_TAG,
482         .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
483         .hal_api_version = HARDWARE_HAL_API_VERSION,
484         .id = AUDIO_HARDWARE_MODULE_ID,
485         .name = "Default audio HW HAL",
486         .author = "The Android Open Source Project",
487         .methods = &hal_module_methods,
488     },
489 };
490