Home | History | Annotate | Download | only in audio
      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 
     43 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
     44 {
     45     return 44100;
     46 }
     47 
     48 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
     49 {
     50     return 0;
     51 }
     52 
     53 static size_t out_get_buffer_size(const struct audio_stream *stream)
     54 {
     55     return 4096;
     56 }
     57 
     58 static uint32_t out_get_channels(const struct audio_stream *stream)
     59 {
     60     return AUDIO_CHANNEL_OUT_STEREO;
     61 }
     62 
     63 static audio_format_t out_get_format(const struct audio_stream *stream)
     64 {
     65     return AUDIO_FORMAT_PCM_16_BIT;
     66 }
     67 
     68 static int out_set_format(struct audio_stream *stream, audio_format_t format)
     69 {
     70     return 0;
     71 }
     72 
     73 static int out_standby(struct audio_stream *stream)
     74 {
     75     return 0;
     76 }
     77 
     78 static int out_dump(const struct audio_stream *stream, int fd)
     79 {
     80     return 0;
     81 }
     82 
     83 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
     84 {
     85     return 0;
     86 }
     87 
     88 static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
     89 {
     90     return strdup("");
     91 }
     92 
     93 static uint32_t out_get_latency(const struct audio_stream_out *stream)
     94 {
     95     return 0;
     96 }
     97 
     98 static int out_set_volume(struct audio_stream_out *stream, float left,
     99                           float right)
    100 {
    101     return 0;
    102 }
    103 
    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 
    113 static int out_get_render_position(const struct audio_stream_out *stream,
    114                                    uint32_t *dsp_frames)
    115 {
    116     return -EINVAL;
    117 }
    118 
    119 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
    120 {
    121     return 0;
    122 }
    123 
    124 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
    125 {
    126     return 0;
    127 }
    128 
    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 **/
    136 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
    137 {
    138     return 8000;
    139 }
    140 
    141 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
    142 {
    143     return 0;
    144 }
    145 
    146 static size_t in_get_buffer_size(const struct audio_stream *stream)
    147 {
    148     return 320;
    149 }
    150 
    151 static uint32_t in_get_channels(const struct audio_stream *stream)
    152 {
    153     return AUDIO_CHANNEL_IN_MONO;
    154 }
    155 
    156 static audio_format_t in_get_format(const struct audio_stream *stream)
    157 {
    158     return AUDIO_FORMAT_PCM_16_BIT;
    159 }
    160 
    161 static int in_set_format(struct audio_stream *stream, audio_format_t format)
    162 {
    163     return 0;
    164 }
    165 
    166 static int in_standby(struct audio_stream *stream)
    167 {
    168     return 0;
    169 }
    170 
    171 static int in_dump(const struct audio_stream *stream, int fd)
    172 {
    173     return 0;
    174 }
    175 
    176 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
    177 {
    178     return 0;
    179 }
    180 
    181 static char * in_get_parameters(const struct audio_stream *stream,
    182                                 const char *keys)
    183 {
    184     return strdup("");
    185 }
    186 
    187 static int in_set_gain(struct audio_stream_in *stream, float gain)
    188 {
    189     return 0;
    190 }
    191 
    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 
    201 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
    202 {
    203     return 0;
    204 }
    205 
    206 static int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
    207 {
    208     return 0;
    209 }
    210 
    211 static int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
    212 {
    213     return 0;
    214 }
    215 
    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 
    258 static void adev_close_output_stream(struct audio_hw_device *dev,
    259                                      struct audio_stream_out *stream)
    260 {
    261     free(stream);
    262 }
    263 
    264 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
    265 {
    266     return -ENOSYS;
    267 }
    268 
    269 static char * adev_get_parameters(const struct audio_hw_device *dev,
    270                                   const char *keys)
    271 {
    272     return NULL;
    273 }
    274 
    275 static int adev_init_check(const struct audio_hw_device *dev)
    276 {
    277     return 0;
    278 }
    279 
    280 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
    281 {
    282     return -ENOSYS;
    283 }
    284 
    285 static int adev_set_master_volume(struct audio_hw_device *dev, float volume)
    286 {
    287     return -ENOSYS;
    288 }
    289 
    290 static int adev_get_master_volume(struct audio_hw_device *dev,
    291                                   float *volume)
    292 {
    293     return -ENOSYS;
    294 }
    295 
    296 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
    297 {
    298     return 0;
    299 }
    300 
    301 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
    302 {
    303     return -ENOSYS;
    304 }
    305 
    306 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
    307 {
    308     return -ENOSYS;
    309 }
    310 
    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 
    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 
    356 static void adev_close_input_stream(struct audio_hw_device *dev,
    357                                    struct audio_stream_in *in)
    358 {
    359     return;
    360 }
    361 
    362 static int adev_dump(const audio_hw_device_t *device, int fd)
    363 {
    364     return 0;
    365 }
    366 
    367 static int adev_close(hw_device_t *device)
    368 {
    369     free(device);
    370     return 0;
    371 }
    372 
    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 
    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