Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8413e2b1 authored by Mingming Yin's avatar Mingming Yin Committed by Gerrit Code Review
Browse files

audio: add QCOM supported audio devices

- Add ANC headset, FM, and proxy devices

Change-Id: Ib7b7495ed69ca3ab072c5512e9286da8d3538682
(cherry picked from commit fd629294bcaaa2cb70befc631f7596439d6cbe70)

audio: add support for QCOM audio formats

- Add support for EVRC, QCELP, and WMA formats

Change-Id: Id5f7845ff7bc609e947f93d8647ad3f3e57babfb
(cherry picked from commit 8b3476f14882afa74e9c3b778d9ccbd97ee329f0)

audio: add QCOM supported audio channels

Change-Id: Id29cb6949e137be8fb71d8d45e8e12bc47795f40
(cherry picked from commit 2fe37a40228c97e6f3b0575d94d4ec50b4dde1d6)

system/core: Add Qcom specific audio flags

- Support for Tunnel Mode Playback
- Reserve the LPA and VOIP_RX flags

Change-Id: Ifcbeb2a28feb86b030f48010a8a4e9cda8629e5b

Add ifdefs for QCOM enhanced features

Change-Id: Idefa831ecb4fdb881c990ba02ab4ab0ab7871986
parent 9b1ad4ad
Loading
Loading
Loading
Loading
+114 −3
Original line number Diff line number Diff line
/*
 * Copyright (C) 2011 The Android Open Source Project
 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -141,6 +142,22 @@ typedef enum {
    AUDIO_FORMAT_HE_AAC_V1           = 0x05000000UL,
    AUDIO_FORMAT_HE_AAC_V2           = 0x06000000UL,
    AUDIO_FORMAT_VORBIS              = 0x07000000UL,
#ifdef QCOM_HARDWARE
    AUDIO_FORMAT_EVRC                = 0x08000000UL,
    AUDIO_FORMAT_QCELP               = 0x09000000UL,
    AUDIO_FORMAT_AC3                 = 0x0a000000UL,
    AUDIO_FORMAT_AC3_PLUS            = 0x0b000000UL,
    AUDIO_FORMAT_DTS                 = 0x0c000000UL,
    AUDIO_FORMAT_WMA                 = 0x0d000000UL,
    AUDIO_FORMAT_WMA_PRO             = 0x0e000000UL,
    AUDIO_FORMAT_AAC_ADIF            = 0x0f000000UL,
    AUDIO_FORMAT_EVRCB               = 0x10000000UL,
    AUDIO_FORMAT_EVRCWB              = 0x11000000UL,
    AUDIO_FORMAT_EAC3                = 0x12000000UL,
    AUDIO_FORMAT_DTS_LBR             = 0x13000000UL,
    AUDIO_FORMAT_AMR_WB_PLUS         = 0x14000000UL,
    AUDIO_FORMAT_MP2                 = 0x15000000UL,
#endif
    AUDIO_FORMAT_MAIN_MASK           = 0xFF000000UL,
    AUDIO_FORMAT_SUB_MASK            = 0x00FFFFFFUL,

@@ -179,6 +196,11 @@ enum {
    AUDIO_CHANNEL_OUT_MONO     = AUDIO_CHANNEL_OUT_FRONT_LEFT,
    AUDIO_CHANNEL_OUT_STEREO   = (AUDIO_CHANNEL_OUT_FRONT_LEFT |
                                  AUDIO_CHANNEL_OUT_FRONT_RIGHT),
#ifdef QCOM_HARDWARE
    AUDIO_CHANNEL_OUT_2POINT1  = (AUDIO_CHANNEL_OUT_FRONT_LEFT |
                                  AUDIO_CHANNEL_OUT_FRONT_RIGHT |
                                  AUDIO_CHANNEL_OUT_FRONT_CENTER),
#endif
    AUDIO_CHANNEL_OUT_QUAD     = (AUDIO_CHANNEL_OUT_FRONT_LEFT |
                                  AUDIO_CHANNEL_OUT_FRONT_RIGHT |
                                  AUDIO_CHANNEL_OUT_BACK_LEFT |
@@ -187,12 +209,25 @@ enum {
                                  AUDIO_CHANNEL_OUT_FRONT_RIGHT |
                                  AUDIO_CHANNEL_OUT_FRONT_CENTER |
                                  AUDIO_CHANNEL_OUT_BACK_CENTER),
#ifdef QCOM_HARDWARE
    AUDIO_CHANNEL_OUT_PENTA =    (AUDIO_CHANNEL_OUT_QUAD |
                                  AUDIO_CHANNEL_OUT_FRONT_CENTER),
#endif
    AUDIO_CHANNEL_OUT_5POINT1  = (AUDIO_CHANNEL_OUT_FRONT_LEFT |
                                  AUDIO_CHANNEL_OUT_FRONT_RIGHT |
                                  AUDIO_CHANNEL_OUT_FRONT_CENTER |
                                  AUDIO_CHANNEL_OUT_LOW_FREQUENCY |
                                  AUDIO_CHANNEL_OUT_BACK_LEFT |
                                  AUDIO_CHANNEL_OUT_BACK_RIGHT),
#ifdef QCOM_HARDWARE
    AUDIO_CHANNEL_OUT_6POINT1  = (AUDIO_CHANNEL_OUT_FRONT_LEFT |
                                  AUDIO_CHANNEL_OUT_FRONT_RIGHT |
                                  AUDIO_CHANNEL_OUT_FRONT_CENTER |
                                  AUDIO_CHANNEL_OUT_LOW_FREQUENCY |
                                  AUDIO_CHANNEL_OUT_BACK_LEFT |
                                  AUDIO_CHANNEL_OUT_BACK_RIGHT |
                                  AUDIO_CHANNEL_OUT_BACK_CENTER),
#endif
    // matches the correct AudioFormat.CHANNEL_OUT_7POINT1_SURROUND definition for 7.1
    AUDIO_CHANNEL_OUT_7POINT1  = (AUDIO_CHANNEL_OUT_FRONT_LEFT |
                                  AUDIO_CHANNEL_OUT_FRONT_RIGHT |
@@ -236,9 +271,28 @@ enum {
    AUDIO_CHANNEL_IN_Z_AXIS          = 0x2000,
    AUDIO_CHANNEL_IN_VOICE_UPLINK    = 0x4000,
    AUDIO_CHANNEL_IN_VOICE_DNLINK    = 0x8000,
#ifdef QCOM_HARDWARE
    AUDIO_CHANNEL_IN_FRONT_LEFT      = 0x10000,
    AUDIO_CHANNEL_IN_FRONT_RIGHT     = 0x20000,
    AUDIO_CHANNEL_IN_FRONT_CENTER    = 0x40000,
    AUDIO_CHANNEL_IN_LOW_FREQUENCY   = 0x80000,
    AUDIO_CHANNEL_IN_BACK_LEFT       = 0x100000,
    AUDIO_CHANNEL_IN_BACK_RIGHT      = 0x200000,
#endif

    AUDIO_CHANNEL_IN_MONO   = AUDIO_CHANNEL_IN_FRONT,
    AUDIO_CHANNEL_IN_STEREO = (AUDIO_CHANNEL_IN_LEFT | AUDIO_CHANNEL_IN_RIGHT),
#ifdef QCOM_HARDWARE
    AUDIO_CHANNEL_IN_5POINT1 = (AUDIO_CHANNEL_IN_FRONT_LEFT |
                               AUDIO_CHANNEL_IN_FRONT_RIGHT |
                               AUDIO_CHANNEL_IN_FRONT_CENTER |
                               AUDIO_CHANNEL_IN_LOW_FREQUENCY |
                               AUDIO_CHANNEL_IN_BACK_LEFT |
                               AUDIO_CHANNEL_IN_BACK_RIGHT),
    AUDIO_CHANNEL_IN_VOICE_UPLINK_MONO = (AUDIO_CHANNEL_IN_VOICE_UPLINK | AUDIO_CHANNEL_IN_MONO),
    AUDIO_CHANNEL_IN_VOICE_DNLINK_MONO = (AUDIO_CHANNEL_IN_VOICE_DNLINK | AUDIO_CHANNEL_IN_MONO),
    AUDIO_CHANNEL_IN_VOICE_CALL_MONO   = (AUDIO_CHANNEL_IN_VOICE_UPLINK_MONO | AUDIO_CHANNEL_IN_VOICE_DNLINK_MONO),
#endif
    AUDIO_CHANNEL_IN_ALL    = (AUDIO_CHANNEL_IN_LEFT |
                               AUDIO_CHANNEL_IN_RIGHT |
                               AUDIO_CHANNEL_IN_FRONT |
@@ -251,8 +305,11 @@ enum {
                               AUDIO_CHANNEL_IN_X_AXIS |
                               AUDIO_CHANNEL_IN_Y_AXIS |
                               AUDIO_CHANNEL_IN_Z_AXIS |
#ifdef QCOM_HARDWARE
                               AUDIO_CHANNEL_IN_5POINT1 |
#endif
                               AUDIO_CHANNEL_IN_VOICE_UPLINK |
                               AUDIO_CHANNEL_IN_VOICE_DNLINK),
                               AUDIO_CHANNEL_IN_VOICE_DNLINK)
};

typedef uint32_t audio_channel_mask_t;
@@ -304,6 +361,13 @@ enum {
    AUDIO_DEVICE_OUT_USB_ACCESSORY             = 0x2000,
    AUDIO_DEVICE_OUT_USB_DEVICE                = 0x4000,
    AUDIO_DEVICE_OUT_REMOTE_SUBMIX             = 0x8000,
#ifdef QCOM_HARDWARE
    AUDIO_DEVICE_OUT_ANC_HEADSET               = 0x10000,
    AUDIO_DEVICE_OUT_ANC_HEADPHONE             = 0x20000,
    AUDIO_DEVICE_OUT_PROXY                     = 0x40000,
    AUDIO_DEVICE_OUT_FM                        = 0x80000,
    AUDIO_DEVICE_OUT_FM_TX                     = 0x100000,
#endif
    AUDIO_DEVICE_OUT_DEFAULT                   = AUDIO_DEVICE_BIT_DEFAULT,
    AUDIO_DEVICE_OUT_ALL      = (AUDIO_DEVICE_OUT_EARPIECE |
                                 AUDIO_DEVICE_OUT_SPEAKER |
@@ -321,6 +385,13 @@ enum {
                                 AUDIO_DEVICE_OUT_USB_ACCESSORY |
                                 AUDIO_DEVICE_OUT_USB_DEVICE |
                                 AUDIO_DEVICE_OUT_REMOTE_SUBMIX |
#ifdef QCOM_HARDWARE
                                 AUDIO_DEVICE_OUT_ANC_HEADSET |
                                 AUDIO_DEVICE_OUT_ANC_HEADPHONE |
                                 AUDIO_DEVICE_OUT_PROXY |
                                 AUDIO_DEVICE_OUT_FM |
                                 AUDIO_DEVICE_OUT_FM_TX |
#endif
                                 AUDIO_DEVICE_OUT_DEFAULT),
    AUDIO_DEVICE_OUT_ALL_A2DP = (AUDIO_DEVICE_OUT_BLUETOOTH_A2DP |
                                 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
@@ -361,6 +432,10 @@ enum {
    AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET     = AUDIO_DEVICE_BIT_IN | 0x400,
    AUDIO_DEVICE_IN_USB_ACCESSORY         = AUDIO_DEVICE_BIT_IN | 0x800,
    AUDIO_DEVICE_IN_USB_DEVICE            = AUDIO_DEVICE_BIT_IN | 0x1000,
    AUDIO_DEVICE_IN_ANC_HEADSET           = AUDIO_DEVICE_BIT_IN | 0x2000,
    AUDIO_DEVICE_IN_PROXY                 = AUDIO_DEVICE_BIT_IN | 0x4000,
    AUDIO_DEVICE_IN_FM_RX                 = AUDIO_DEVICE_BIT_IN | 0x8000,
    AUDIO_DEVICE_IN_FM_RX_A2DP            = AUDIO_DEVICE_BIT_IN | 0x10000,
    AUDIO_DEVICE_IN_DEFAULT               = AUDIO_DEVICE_BIT_IN | AUDIO_DEVICE_BIT_DEFAULT,
#endif

@@ -377,6 +452,10 @@ enum {
                               AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET |
                               AUDIO_DEVICE_IN_USB_ACCESSORY |
                               AUDIO_DEVICE_IN_USB_DEVICE |
                               AUDIO_DEVICE_IN_ANC_HEADSET |
                               AUDIO_DEVICE_IN_FM_RX |
                               AUDIO_DEVICE_IN_FM_RX_A2DP |
                               AUDIO_DEVICE_IN_PROXY |
                               AUDIO_DEVICE_IN_DEFAULT),
    AUDIO_DEVICE_IN_ALL_SCO = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET,
};
@@ -403,7 +482,15 @@ typedef enum {
                                        // controls related to voice calls.
    AUDIO_OUTPUT_FLAG_FAST = 0x4,       // output supports "fast tracks",
                                        // defined elsewhere
    AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8 // use deep audio buffers
    AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8,// use deep audio buffers
#ifdef QCOM_HARDWARE
    //Qualcomm Flags
    AUDIO_OUTPUT_FLAG_LPA = 0x1000,      // use LPA
    AUDIO_OUTPUT_FLAG_TUNNEL = 0x2000,   // use Tunnel
    AUDIO_OUTPUT_FLAG_VOIP_RX = 0x4000   // use this flag in combination with DIRECT to
                                         // indicate HAL to activate EC & NS
                                         // path for VOIP calls
#endif
} audio_output_flags_t;

static inline bool audio_is_output_device(audio_devices_t device)
@@ -513,7 +600,7 @@ static inline audio_channel_mask_t audio_channel_out_mask_from_count(uint32_t ch
    }
}

/* Similar to above, but for input.  Currently handles only mono and stereo. */
/* Similar to above, but for input.  Currently handles mono and stereo and 5.1 input. */
static inline audio_channel_mask_t audio_channel_in_mask_from_count(uint32_t channel_count)
{
    switch (channel_count) {
@@ -521,6 +608,10 @@ static inline audio_channel_mask_t audio_channel_in_mask_from_count(uint32_t cha
        return AUDIO_CHANNEL_IN_MONO;
    case 2:
        return AUDIO_CHANNEL_IN_STEREO;
#ifdef QCOM_HARDWARE
    case 6:
        return AUDIO_CHANNEL_IN_5POINT1;
#endif
    default:
        return 0;
    }
@@ -541,6 +632,21 @@ static inline bool audio_is_valid_format(audio_format_t format)
    case AUDIO_FORMAT_HE_AAC_V1:
    case AUDIO_FORMAT_HE_AAC_V2:
    case AUDIO_FORMAT_VORBIS:
#ifdef QCOM_HARDWARE
    case AUDIO_FORMAT_QCELP:
    case AUDIO_FORMAT_EVRC:
    case AUDIO_FORMAT_EVRCB:
    case AUDIO_FORMAT_EVRCWB:
    case AUDIO_FORMAT_AC3:
    case AUDIO_FORMAT_EAC3:
    case AUDIO_FORMAT_AAC_ADIF:
    case AUDIO_FORMAT_WMA:
    case AUDIO_FORMAT_WMA_PRO:
    case AUDIO_FORMAT_DTS:
    case AUDIO_FORMAT_DTS_LBR:
    case AUDIO_FORMAT_AMR_WB_PLUS:
    case AUDIO_FORMAT_MP2:
#endif
        return true;
    default:
        return false;
@@ -567,6 +673,11 @@ static inline size_t audio_bytes_per_sample(audio_format_t format)
    case AUDIO_FORMAT_PCM_8_BIT:
        size = sizeof(uint8_t);
        break;
#ifdef QCOM_HARDWARE
    case AUDIO_FORMAT_AMR_WB:
        size = 61;
        break;
#endif
    default:
        break;
    }