Home | History | Annotate | Download | only in hal
      1 /*
      2  * Copyright (C) 2013-2016 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 #ifndef QCOM_AUDIO_HW_H
     18 #define QCOM_AUDIO_HW_H
     19 
     20 #include <cutils/str_parms.h>
     21 #include <cutils/list.h>
     22 #include <hardware/audio.h>
     23 
     24 #include <tinyalsa/asoundlib.h>
     25 #include <tinycompress/tinycompress.h>
     26 
     27 #include <audio_route/audio_route.h>
     28 #include <audio_utils/ErrorLog.h>
     29 #include "voice.h"
     30 
     31 // dlopen() does not go through default library path search if there is a "/" in the library name.
     32 #ifdef __LP64__
     33 #define VISUALIZER_LIBRARY_PATH "/vendor/lib64/soundfx/libqcomvisualizer.so"
     34 #define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "/vendor/lib64/soundfx/libqcompostprocbundle.so"
     35 #else
     36 #define VISUALIZER_LIBRARY_PATH "/vendor/lib/soundfx/libqcomvisualizer.so"
     37 #define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "/vendor/lib/soundfx/libqcompostprocbundle.so"
     38 #endif
     39 #define ADM_LIBRARY_PATH "libadm.so"
     40 
     41 /* Flags used to initialize acdb_settings variable that goes to ACDB library */
     42 #define DMIC_FLAG       0x00000002
     43 #define TTY_MODE_OFF    0x00000010
     44 #define TTY_MODE_FULL   0x00000020
     45 #define TTY_MODE_VCO    0x00000040
     46 #define TTY_MODE_HCO    0x00000080
     47 #define TTY_MODE_CLEAR  0xFFFFFF0F
     48 
     49 #define ACDB_DEV_TYPE_OUT 1
     50 #define ACDB_DEV_TYPE_IN 2
     51 
     52 #define MAX_SUPPORTED_CHANNEL_MASKS 8
     53 #define MAX_SUPPORTED_FORMATS 15
     54 #define MAX_SUPPORTED_SAMPLE_RATES 7
     55 #define DEFAULT_HDMI_OUT_CHANNELS   2
     56 
     57 #define ERROR_LOG_ENTRIES 16
     58 
     59 /* Error types for the error log */
     60 enum {
     61     ERROR_CODE_STANDBY = 1,
     62     ERROR_CODE_WRITE,
     63     ERROR_CODE_READ,
     64 };
     65 
     66 typedef enum card_status_t {
     67     CARD_STATUS_OFFLINE,
     68     CARD_STATUS_ONLINE
     69 } card_status_t;
     70 
     71 /* These are the supported use cases by the hardware.
     72  * Each usecase is mapped to a specific PCM device.
     73  * Refer to pcm_device_table[].
     74  */
     75 enum {
     76     USECASE_INVALID = -1,
     77     /* Playback usecases */
     78     USECASE_AUDIO_PLAYBACK_DEEP_BUFFER = 0,
     79     USECASE_AUDIO_PLAYBACK_LOW_LATENCY,
     80     USECASE_AUDIO_PLAYBACK_HIFI,
     81     USECASE_AUDIO_PLAYBACK_OFFLOAD,
     82     USECASE_AUDIO_PLAYBACK_TTS,
     83     USECASE_AUDIO_PLAYBACK_ULL,
     84     USECASE_AUDIO_PLAYBACK_MMAP,
     85 
     86     /* HFP Use case*/
     87     USECASE_AUDIO_HFP_SCO,
     88     USECASE_AUDIO_HFP_SCO_WB,
     89 
     90     /* Capture usecases */
     91     USECASE_AUDIO_RECORD,
     92     USECASE_AUDIO_RECORD_LOW_LATENCY,
     93     USECASE_AUDIO_RECORD_MMAP,
     94     USECASE_AUDIO_RECORD_HIFI,
     95 
     96     /* Voice extension usecases
     97      *
     98      * Following usecase are specific to voice session names created by
     99      * MODEM and APPS on 8992/8994/8084/8974 platforms.
    100      */
    101     USECASE_VOICE_CALL,  /* Usecase setup for voice session on first subscription for DSDS/DSDA */
    102     USECASE_VOICE2_CALL, /* Usecase setup for voice session on second subscription for DSDS/DSDA */
    103     USECASE_VOLTE_CALL,  /* Usecase setup for VoLTE session on first subscription */
    104     USECASE_QCHAT_CALL,  /* Usecase setup for QCHAT session */
    105     USECASE_VOWLAN_CALL, /* Usecase setup for VoWLAN session */
    106 
    107     /*
    108      * Following usecase are specific to voice session names created by
    109      * MODEM and APPS on 8996 platforms.
    110      */
    111 
    112     USECASE_VOICEMMODE1_CALL, /* Usecase setup for Voice/VoLTE/VoWLAN sessions on first
    113                                * subscription for DSDS/DSDA
    114                                */
    115     USECASE_VOICEMMODE2_CALL, /* Usecase setup for voice/VoLTE/VoWLAN sessions on second
    116                                * subscription for DSDS/DSDA
    117                                */
    118 
    119     USECASE_INCALL_REC_UPLINK,
    120     USECASE_INCALL_REC_DOWNLINK,
    121     USECASE_INCALL_REC_UPLINK_AND_DOWNLINK,
    122 
    123     USECASE_AUDIO_SPKR_CALIB_RX,
    124     USECASE_AUDIO_SPKR_CALIB_TX,
    125 
    126     USECASE_AUDIO_PLAYBACK_AFE_PROXY,
    127     USECASE_AUDIO_RECORD_AFE_PROXY,
    128     USECASE_AUDIO_DSM_FEEDBACK,
    129 
    130     /* VOIP usecase*/
    131     USECASE_AUDIO_PLAYBACK_VOIP,
    132     USECASE_AUDIO_RECORD_VOIP,
    133 
    134     AUDIO_USECASE_MAX
    135 };
    136 
    137 const char * const use_case_table[AUDIO_USECASE_MAX];
    138 
    139 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
    140 
    141 /*
    142  * tinyAlsa library interprets period size as number of frames
    143  * one frame = channel_count * sizeof (pcm sample)
    144  * so if format = 16-bit PCM and channels = Stereo, frame size = 2 ch * 2 = 4 bytes
    145  * DEEP_BUFFER_OUTPUT_PERIOD_SIZE = 1024 means 1024 * 4 = 4096 bytes
    146  * We should take care of returning proper size when AudioFlinger queries for
    147  * the buffer size of an input/output stream
    148  */
    149 
    150 enum {
    151     OFFLOAD_CMD_EXIT,               /* exit compress offload thread loop*/
    152     OFFLOAD_CMD_DRAIN,              /* send a full drain request to DSP */
    153     OFFLOAD_CMD_PARTIAL_DRAIN,      /* send a partial drain request to DSP */
    154     OFFLOAD_CMD_WAIT_FOR_BUFFER,    /* wait for buffer released by DSP */
    155     OFFLOAD_CMD_ERROR,              /* offload playback hit some error */
    156 };
    157 
    158 enum {
    159     OFFLOAD_STATE_IDLE,
    160     OFFLOAD_STATE_PLAYING,
    161     OFFLOAD_STATE_PAUSED,
    162 };
    163 
    164 struct offload_cmd {
    165     struct listnode node;
    166     int cmd;
    167     int data[];
    168 };
    169 
    170 struct stream_app_type_cfg {
    171     int sample_rate;
    172     uint32_t bit_width; // unused
    173     const char *mode;
    174     int app_type;
    175     int gain[2];
    176 };
    177 
    178 struct stream_out {
    179     struct audio_stream_out stream;
    180     pthread_mutex_t lock; /* see note below on mutex acquisition order */
    181     pthread_mutex_t pre_lock; /* acquire before lock to avoid DOS by playback thread */
    182     pthread_cond_t  cond;
    183     struct pcm_config config;
    184     struct compr_config compr_config;
    185     struct pcm *pcm;
    186     struct compress *compr;
    187     int standby;
    188     int pcm_device_id;
    189     unsigned int sample_rate;
    190     audio_channel_mask_t channel_mask;
    191     audio_format_t format;
    192     audio_devices_t devices;
    193     audio_output_flags_t flags;
    194     audio_usecase_t usecase;
    195     /* Array of supported channel mask configurations. +1 so that the last entry is always 0 */
    196     audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1];
    197     audio_format_t supported_formats[MAX_SUPPORTED_FORMATS + 1];
    198     uint32_t supported_sample_rates[MAX_SUPPORTED_SAMPLE_RATES + 1];
    199     bool muted;
    200     uint64_t written; /* total frames written, not cleared when entering standby */
    201     audio_io_handle_t handle;
    202 
    203     int non_blocking;
    204     int playback_started;
    205     int offload_state;
    206     pthread_cond_t offload_cond;
    207     pthread_t offload_thread;
    208     struct listnode offload_cmd_list;
    209     bool offload_thread_blocked;
    210 
    211     stream_callback_t offload_callback;
    212     void *offload_cookie;
    213     struct compr_gapless_mdata gapless_mdata;
    214     int send_new_metadata;
    215     bool realtime;
    216     int af_period_multiplier;
    217     struct audio_device *dev;
    218     card_status_t card_status;
    219 
    220     error_log_t *error_log;
    221 
    222     struct stream_app_type_cfg app_type_cfg;
    223 };
    224 
    225 struct stream_in {
    226     struct audio_stream_in stream;
    227     pthread_mutex_t lock; /* see note below on mutex acquisition order */
    228     pthread_mutex_t pre_lock; /* acquire before lock to avoid DOS by capture thread */
    229     struct pcm_config config;
    230     struct pcm *pcm;
    231     int standby;
    232     int source;
    233     int pcm_device_id;
    234     audio_devices_t device;
    235     audio_channel_mask_t channel_mask;
    236     unsigned int sample_rate;
    237     audio_usecase_t usecase;
    238     bool enable_aec;
    239     bool enable_ns;
    240     int64_t frames_read; /* total frames read, not cleared when entering standby */
    241     int64_t frames_muted; /* total frames muted, not cleared when entering standby */
    242 
    243     audio_io_handle_t capture_handle;
    244     audio_input_flags_t flags;
    245     bool is_st_session;
    246     bool is_st_session_active;
    247     bool realtime;
    248     int af_period_multiplier;
    249     struct audio_device *dev;
    250     audio_format_t format;
    251     card_status_t card_status;
    252     int capture_started;
    253 
    254     struct stream_app_type_cfg app_type_cfg;
    255 
    256     /* Array of supported channel mask configurations.
    257        +1 so that the last entry is always 0 */
    258     audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1];
    259     audio_format_t supported_formats[MAX_SUPPORTED_FORMATS + 1];
    260     uint32_t supported_sample_rates[MAX_SUPPORTED_SAMPLE_RATES + 1];
    261 
    262     error_log_t *error_log;
    263 };
    264 
    265 typedef enum usecase_type_t {
    266     PCM_PLAYBACK,
    267     PCM_CAPTURE,
    268     VOICE_CALL,
    269     PCM_HFP_CALL,
    270     USECASE_TYPE_MAX
    271 } usecase_type_t;
    272 
    273 union stream_ptr {
    274     struct stream_in *in;
    275     struct stream_out *out;
    276 };
    277 
    278 struct audio_usecase {
    279     struct listnode list;
    280     audio_usecase_t id;
    281     usecase_type_t  type;
    282     audio_devices_t devices;
    283     snd_device_t out_snd_device;
    284     snd_device_t in_snd_device;
    285     union stream_ptr stream;
    286 };
    287 
    288 typedef void* (*adm_init_t)();
    289 typedef void (*adm_deinit_t)(void *);
    290 typedef void (*adm_register_output_stream_t)(void *, audio_io_handle_t, audio_output_flags_t);
    291 typedef void (*adm_register_input_stream_t)(void *, audio_io_handle_t, audio_input_flags_t);
    292 typedef void (*adm_deregister_stream_t)(void *, audio_io_handle_t);
    293 typedef void (*adm_request_focus_t)(void *, audio_io_handle_t);
    294 typedef void (*adm_abandon_focus_t)(void *, audio_io_handle_t);
    295 typedef void (*adm_set_config_t)(void *, audio_io_handle_t,
    296                                          struct pcm *,
    297                                          struct pcm_config *);
    298 typedef void (*adm_request_focus_v2_t)(void *, audio_io_handle_t, long);
    299 typedef bool (*adm_is_noirq_avail_t)(void *, int, int, int);
    300 typedef void (*adm_on_routing_change_t)(void *, audio_io_handle_t);
    301 
    302 struct audio_device {
    303     struct audio_hw_device device;
    304     pthread_mutex_t lock; /* see note below on mutex acquisition order */
    305     struct mixer *mixer;
    306     audio_mode_t mode;
    307     struct stream_in *active_input;
    308     struct stream_out *primary_output;
    309     struct stream_out *voice_tx_output;
    310     struct stream_out *current_call_output;
    311     bool bluetooth_nrec;
    312     bool screen_off;
    313     int *snd_dev_ref_cnt;
    314     struct listnode usecase_list;
    315     struct audio_route *audio_route;
    316     int acdb_settings;
    317     struct voice voice;
    318     unsigned int cur_hdmi_channels;
    319     bool bt_wb_speech_enabled;
    320     bool mic_muted;
    321     bool enable_voicerx;
    322     bool enable_hfp;
    323 
    324     int snd_card;
    325     void *platform;
    326     void *extspk;
    327 
    328     card_status_t card_status;
    329 
    330     void *visualizer_lib;
    331     int (*visualizer_start_output)(audio_io_handle_t, int);
    332     int (*visualizer_stop_output)(audio_io_handle_t, int);
    333 
    334     /* The pcm_params use_case_table is loaded by adev_verify_devices() upon
    335      * calling adev_open().
    336      *
    337      * If an entry is not NULL, it can be used to determine if extended precision
    338      * or other capabilities are present for the device corresponding to that usecase.
    339      */
    340     struct pcm_params *use_case_table[AUDIO_USECASE_MAX];
    341     void *offload_effects_lib;
    342     int (*offload_effects_start_output)(audio_io_handle_t, int);
    343     int (*offload_effects_stop_output)(audio_io_handle_t, int);
    344 
    345     void *adm_data;
    346     void *adm_lib;
    347     adm_init_t adm_init;
    348     adm_deinit_t adm_deinit;
    349     adm_register_input_stream_t adm_register_input_stream;
    350     adm_register_output_stream_t adm_register_output_stream;
    351     adm_deregister_stream_t adm_deregister_stream;
    352     adm_request_focus_t adm_request_focus;
    353     adm_abandon_focus_t adm_abandon_focus;
    354     adm_set_config_t adm_set_config;
    355     adm_request_focus_v2_t adm_request_focus_v2;
    356     adm_is_noirq_avail_t adm_is_noirq_avail;
    357     adm_on_routing_change_t adm_on_routing_change;
    358 
    359     /* logging */
    360     snd_device_t last_logged_snd_device[AUDIO_USECASE_MAX][2]; /* [out, in] */
    361 };
    362 
    363 int select_devices(struct audio_device *adev,
    364                    audio_usecase_t uc_id);
    365 
    366 int disable_audio_route(struct audio_device *adev,
    367                         struct audio_usecase *usecase);
    368 
    369 int disable_snd_device(struct audio_device *adev,
    370                        snd_device_t snd_device);
    371 
    372 int enable_snd_device(struct audio_device *adev,
    373                       snd_device_t snd_device);
    374 
    375 int enable_audio_route(struct audio_device *adev,
    376                        struct audio_usecase *usecase);
    377 
    378 struct audio_usecase *get_usecase_from_list(struct audio_device *adev,
    379                                             audio_usecase_t uc_id);
    380 
    381 #define LITERAL_TO_STRING(x) #x
    382 #define CHECK(condition) LOG_ALWAYS_FATAL_IF(!(condition), "%s",\
    383             __FILE__ ":" LITERAL_TO_STRING(__LINE__)\
    384             " ASSERT_FATAL(" #condition ") failed.")
    385 
    386 /*
    387  * NOTE: when multiple mutexes have to be acquired, always take the
    388  * stream_in or stream_out mutex first, followed by the audio_device mutex.
    389  */
    390 
    391 #endif // QCOM_AUDIO_HW_H
    392