audio_hw.h revision 2ccd7babcde54a8073945dec69660cb60e66a931
12dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/*
22dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Copyright (C) 2013 The Android Open Source Project
32dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda *
42dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Licensed under the Apache License, Version 2.0 (the "License");
52dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * you may not use this file except in compliance with the License.
62dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * You may obtain a copy of the License at
72dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda *
82dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda *      http://www.apache.org/licenses/LICENSE-2.0
92dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda *
102dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Unless required by applicable law or agreed to in writing, software
112dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * distributed under the License is distributed on an "AS IS" BASIS,
122dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * See the License for the specific language governing permissions and
142dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * limitations under the License.
152dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */
162dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
17b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#ifndef QCOM_AUDIO_HW_H
18b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define QCOM_AUDIO_HW_H
19b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
20b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <cutils/list.h>
212dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <hardware/audio.h>
222dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
232dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <tinyalsa/asoundlib.h>
244e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda#include <tinycompress/tinycompress.h>
252dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
262dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <audio_route/audio_route.h>
272dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
28b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Flags used to initialize acdb_settings variable that goes to ACDB library */
29b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define DMIC_FLAG       0x00000002
30b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_OFF    0x00000010
31b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_FULL   0x00000020
32b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_VCO    0x00000040
33b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_HCO    0x00000080
34b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_CLEAR  0xFFFFFF0F
35b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
362dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ACDB_DEV_TYPE_OUT 1
372dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ACDB_DEV_TYPE_IN 2
382dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
39b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define MAX_SUPPORTED_CHANNEL_MASKS 2
402dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
41b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef int snd_device_t;
422dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
432dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/* These are the supported use cases by the hardware.
442dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Each usecase is mapped to a specific PCM device.
452dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Refer to pcm_device_table[].
462dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */
472dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef enum {
482dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_INVALID = -1,
492dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Playback usecases */
502dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_DEEP_BUFFER = 0,
512dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_LOW_LATENCY,
522dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_MULTI_CH,
534e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_OFFLOAD,
542dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
552dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Capture usecases */
562dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_RECORD,
572dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_RECORD_LOW_LATENCY,
582dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
592dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_VOICE_CALL,
602dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    AUDIO_USECASE_MAX
612dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda} audio_usecase_t;
622dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
632dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
642dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
652dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/*
662dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * tinyAlsa library interprets period size as number of frames
672dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * one frame = channel_count * sizeof (pcm sample)
682dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * so if format = 16-bit PCM and channels = Stereo, frame size = 2 ch * 2 = 4 bytes
692dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * DEEP_BUFFER_OUTPUT_PERIOD_SIZE = 1024 means 1024 * 4 = 4096 bytes
702dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * We should take care of returning proper size when AudioFlinger queries for
712dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * the buffer size of an input/output stream
722dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */
732dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
744e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandaenum {
754e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_EXIT,               /* exit compress offload thread loop*/
764e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_DRAIN,              /* send a full drain request to DSP */
774e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_PARTIAL_DRAIN,      /* send a partial drain request to DSP */
784e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_WAIT_FOR_BUFFER,    /* wait for buffer released by DSP */
794e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda};
804e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
814e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandaenum {
824e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_STATE_IDLE,
834e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_STATE_PLAYING,
844e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_STATE_PAUSED,
854e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda};
864e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
874e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandastruct offload_cmd {
884e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct listnode node;
894e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int cmd;
904e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int data[];
914e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda};
924e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
932dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct stream_out {
942dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_stream_out stream;
95150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent    pthread_mutex_t lock; /* see note below on mutex acquisition order */
964e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    pthread_cond_t  cond;
972dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm_config config;
984e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct compr_config compr_config;
992dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *pcm;
1004e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct compress *compr;
1012dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int standby;
1022dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int pcm_device_id;
1034e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    unsigned int sample_rate;
1042dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t channel_mask;
1054e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    audio_format_t format;
1062dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_devices_t devices;
1072dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_output_flags_t flags;
1082dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t usecase;
1092dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Array of supported channel mask configurations. +1 so that the last entry is always 0 */
1102dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1];
111a9024defa11f6502ca55425a4803cd00441d51e7Eric Laurent    bool muted;
1122ccd7babcde54a8073945dec69660cb60e66a931Glenn Kasten    uint64_t written; /* total frames written, not cleared when entering standby */
1132dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1144e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int non_blocking;
1154e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int playback_started;
1164e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int offload_state;
1174e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    pthread_cond_t offload_cond;
1184e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    pthread_t offload_thread;
1194e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct listnode offload_cmd_list;
1204e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    bool offload_thread_blocked;
1214e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
1224e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    stream_callback_t offload_callback;
1234e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    void *offload_cookie;
1244e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
1252dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_device *dev;
1262dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1272dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1282dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct stream_in {
1292dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_stream_in stream;
130150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent    pthread_mutex_t lock; /* see note below on mutex acquisition order */
1312dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm_config config;
1322dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *pcm;
1332dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int standby;
1342dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int source;
1352dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int pcm_device_id;
1362dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int device;
1372dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t channel_mask;
1382dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t usecase;
139f70ffb40ca0c4e8cce15c77fd9edff7f2b6980deRavi Kumar Alamanda    bool enable_aec;
1402dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1412dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_device *dev;
1422dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1432dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1442dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef enum {
1452dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    PCM_PLAYBACK,
1462dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    PCM_CAPTURE,
1472dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    VOICE_CALL
1482dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda} usecase_type_t;
1492dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
150096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamandaunion stream_ptr {
151096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_in *in;
152096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_out *out;
153096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda};
154096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda
1552dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct audio_usecase {
1563b1816cd594eba53a9869d7b23af36daacf58fa1Ravi Kumar Alamanda    struct listnode list;
1572dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t id;
1582dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    usecase_type_t  type;
1592dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_devices_t devices;
16071c84b70ff7c428e35ac187ca4a234acac558240Ravi Kumar Alamanda    snd_device_t out_snd_device;
16171c84b70ff7c428e35ac187ca4a234acac558240Ravi Kumar Alamanda    snd_device_t in_snd_device;
162096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    union stream_ptr stream;
1632dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1642dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1652dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct audio_device {
1662dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_hw_device device;
167150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent    pthread_mutex_t lock; /* see note below on mutex acquisition order */
1682dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct mixer *mixer;
1692dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_mode_t mode;
1702dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_devices_t out_device;
171c8400637beb896d2f5d7ae980682cd2d072a9da3Eric Laurent    struct stream_in *active_input;
172096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_out *primary_output;
1732dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int in_call;
1742dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    float voice_volume;
1752dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool mic_mute;
1762dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int tty_mode;
1772dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool bluetooth_nrec;
1782dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool screen_off;
1792dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *voice_call_rx;
1802dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *voice_call_tx;
181b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int *snd_dev_ref_cnt;
1823b1816cd594eba53a9869d7b23af36daacf58fa1Ravi Kumar Alamanda    struct listnode usecase_list;
1832dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_route *audio_route;
1842dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int acdb_settings;
185c56336bfad4661796b749fc4db7de3a1e6aba06fJean-Michel Trivi    bool speaker_lr_swap;
1862dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
187b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    void *platform;
1882dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1892dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
190150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent/*
191150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent * NOTE: when multiple mutexes have to be acquired, always take the
192150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent * stream_in or stream_out mutex first, followed by the audio_device mutex.
193150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent */
194150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent
195b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#endif // QCOM_AUDIO_HW_H
196