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