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

Commit 1cb04ffc authored by Mingming Yin's avatar Mingming Yin Committed by Steve Kondik
Browse files

audio: audio enhancement for playback and capture.

- Add playback and record support for EVRC, QCELP,
  WMA, AMRWBPLUS, WAV, AC3, and EC3.
- Add support for 5.1 channel recording.
- Add constants for call_state and vsid.
- Add definition for FM and proxy audio devices.

Change-Id: Ib6bba322d4c3bd920be4cb2ef52891de8b1ab568
Conflicts:
media/java/android/media/AudioRecord.java
media/java/android/media/AudioSystem.java
media/java/android/media/MediaRecorder.java
Conflicts:
media/java/android/media/AudioSystem.java
parent a778e303
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -25,6 +25,14 @@
#define ENCODING_PCM_FLOAT  4
#define ENCODING_AC3        5
#define ENCODING_E_AC3      6

#define ENCODING_AMR_NB     100
#define ENCODING_AMR_WB     101
#define ENCODING_EVRC       102
#define ENCODING_EVRC_B     103
#define ENCODING_EVRC_WB    104
#define ENCODING_EVRC_NW    105

#define ENCODING_INVALID    0
#define ENCODING_DEFAULT    1

@@ -46,6 +54,18 @@ static inline audio_format_t audioFormatToNative(int audioFormat)
        return AUDIO_FORMAT_AC3;
    case ENCODING_E_AC3:
        return AUDIO_FORMAT_E_AC3;
    case ENCODING_AMR_NB:
        return AUDIO_FORMAT_AMR_NB;
    case ENCODING_AMR_WB:
        return AUDIO_FORMAT_AMR_WB;
    case ENCODING_EVRC:
        return AUDIO_FORMAT_EVRC;
    case ENCODING_EVRC_B:
        return AUDIO_FORMAT_EVRCB;
    case ENCODING_EVRC_WB:
        return AUDIO_FORMAT_EVRCWB;
    case ENCODING_EVRC_NW:
        return AUDIO_FORMAT_EVRCNW;
    case ENCODING_DEFAULT:
        return AUDIO_FORMAT_DEFAULT;
    default:
@@ -66,6 +86,18 @@ static inline int audioFormatFromNative(audio_format_t nativeFormat)
        return ENCODING_AC3;
    case AUDIO_FORMAT_E_AC3:
        return ENCODING_E_AC3;
    case AUDIO_FORMAT_AMR_NB:
        return ENCODING_AMR_NB;
    case AUDIO_FORMAT_AMR_WB:
        return ENCODING_AMR_WB;
    case AUDIO_FORMAT_EVRC:
        return ENCODING_EVRC;
    case AUDIO_FORMAT_EVRCB:
        return ENCODING_EVRC_B;
    case AUDIO_FORMAT_EVRCWB:
        return ENCODING_EVRC_WB;
    case AUDIO_FORMAT_EVRCNW:
        return ENCODING_EVRC_NW;
    case AUDIO_FORMAT_DEFAULT:
        return ENCODING_DEFAULT;
    default:
+57 −1
Original line number Diff line number Diff line
@@ -48,6 +48,18 @@ public class AudioFormat {
    public static final int ENCODING_AC3 = 5;
    /** Audio data format: E-AC-3 compressed */
    public static final int ENCODING_E_AC3 = 6;
    /** @hide */
    public static final int ENCODING_AMRNB = 100;   // accessed by native code
    /** @hide */
    public static final int ENCODING_AMRWB = 101;   // accessed by native code
    /** @hide */
    public static final int ENCODING_EVRC = 102;    // accessed by native code
    /** @hide */
    public static final int ENCODING_EVRCB = 103;   // accessed by native code
    /** @hide */
    public static final int ENCODING_EVRCWB = 104;  // accessed by native code
    /** @hide */
    public static final int ENCODING_EVRCNW = 105;  // accessed by native code

    /** Invalid audio channel configuration */
    /** @deprecated use CHANNEL_INVALID instead  */
@@ -184,6 +196,11 @@ public class AudioFormat {
    public static final int CHANNEL_IN_STEREO = (CHANNEL_IN_LEFT | CHANNEL_IN_RIGHT);
    /** @hide */
    public static final int CHANNEL_IN_FRONT_BACK = CHANNEL_IN_FRONT | CHANNEL_IN_BACK;
    /** @hide */
    public static final int CHANNEL_IN_5POINT1 = (CHANNEL_IN_LEFT |
            CHANNEL_IN_RIGHT | CHANNEL_IN_FRONT | CHANNEL_IN_BACK |
            CHANNEL_IN_LEFT_PROCESSED | CHANNEL_IN_RIGHT_PROCESSED);

    // CHANNEL_IN_ALL is not yet defined; if added then it should match AUDIO_CHANNEL_IN_ALL

    /** @hide */
@@ -197,6 +214,15 @@ public class AudioFormat {
            return 2;
        case ENCODING_PCM_FLOAT:
            return 4;
        case ENCODING_AMRNB:
            return 32;
        case ENCODING_AMRWB:
            return 61;
        case ENCODING_EVRC:
        case ENCODING_EVRCB:
        case ENCODING_EVRCWB:
        case ENCODING_EVRCNW:
            return 23;
        case ENCODING_INVALID:
        default:
            throw new IllegalArgumentException("Bad audio format " + audioFormat);
@@ -212,6 +238,12 @@ public class AudioFormat {
        case ENCODING_PCM_FLOAT:
        case ENCODING_AC3:
        case ENCODING_E_AC3:
        case ENCODING_AMRNB:
        case ENCODING_AMRWB:
        case ENCODING_EVRC:
        case ENCODING_EVRCB:
        case ENCODING_EVRCWB:
        case ENCODING_EVRCNW:
            return true;
        default:
            return false;
@@ -229,6 +261,12 @@ public class AudioFormat {
            return true;
        case ENCODING_AC3:
        case ENCODING_E_AC3:
        case ENCODING_AMRNB:
        case ENCODING_AMRWB:
        case ENCODING_EVRC:
        case ENCODING_EVRCB:
        case ENCODING_EVRCWB:
        case ENCODING_EVRCNW:
            return false;
        case ENCODING_INVALID:
        default:
@@ -377,6 +415,12 @@ public class AudioFormat {
         *     {@link AudioFormat#ENCODING_PCM_FLOAT},
         *     {@link AudioFormat#ENCODING_AC3},
         *     {@link AudioFormat#ENCODING_E_AC3}.
         *     {@link AudioFormat#ENCODING_AMRNB}.
         *     {@link AudioFormat#ENCODING_AMRWB}.
         *     {@link AudioFormat#ENCODING_EVRC}.
         *     {@link AudioFormat#ENCODING_EVRCB}.
         *     {@link AudioFormat#ENCODING_EVRCWB}.
         *     {@link AudioFormat#ENCODING_EVRCNW}.
         * @return the same Builder instance.
         * @throws java.lang.IllegalArgumentException
         */
@@ -390,6 +434,12 @@ public class AudioFormat {
                case ENCODING_PCM_FLOAT:
                case ENCODING_AC3:
                case ENCODING_E_AC3:
                case ENCODING_AMRNB:
                case ENCODING_AMRWB:
                case ENCODING_EVRC:
                case ENCODING_EVRCB:
                case ENCODING_EVRCWB:
                case ENCODING_EVRCNW:
                    mEncoding = encoding;
                    break;
                case ENCODING_INVALID:
@@ -455,7 +505,13 @@ public class AudioFormat {
        ENCODING_PCM_16BIT,
        ENCODING_PCM_FLOAT,
        ENCODING_AC3,
        ENCODING_E_AC3
        ENCODING_E_AC3,
        ENCODING_AMRNB,
        ENCODING_AMRWB,
        ENCODING_EVRC,
        ENCODING_EVRCB,
        ENCODING_EVRCWB,
        ENCODING_EVRCNW
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface Encoding {}
+16 −1
Original line number Diff line number Diff line
@@ -392,6 +392,12 @@ public class AudioRecord
            break;
        case AudioFormat.ENCODING_PCM_16BIT:
        case AudioFormat.ENCODING_PCM_8BIT:
        case AudioFormat.ENCODING_AMRNB:
        case AudioFormat.ENCODING_AMRWB:
        case AudioFormat.ENCODING_EVRC:
        case AudioFormat.ENCODING_EVRCB:
        case AudioFormat.ENCODING_EVRCWB:
        case AudioFormat.ENCODING_EVRCNW:
            mAudioFormat = audioFormat;
            break;
        default:
@@ -557,6 +563,9 @@ public class AudioRecord
        case (AudioFormat.CHANNEL_IN_FRONT | AudioFormat.CHANNEL_IN_BACK):
            channelCount = 2;
            break;
        case AudioFormat.CHANNEL_IN_5POINT1:
            channelCount = 6;
            break;
        case AudioFormat.CHANNEL_INVALID:
        default:
            loge("getMinBufferSize(): Invalid channel configuration.");
@@ -564,7 +573,13 @@ public class AudioRecord
        }

        // PCM_8BIT is not supported at the moment
        if (audioFormat != AudioFormat.ENCODING_PCM_16BIT) {
        if (audioFormat != AudioFormat.ENCODING_PCM_16BIT
            && audioFormat != AudioFormat.ENCODING_AMRNB
            && audioFormat != AudioFormat.ENCODING_AMRWB
            && audioFormat != AudioFormat.ENCODING_EVRC
            && audioFormat != AudioFormat.ENCODING_EVRCB
            && audioFormat != AudioFormat.ENCODING_EVRCWB
            && audioFormat != AudioFormat.ENCODING_EVRCNW) {
            loge("getMinBufferSize(): Invalid audio format.");
            return ERROR_BAD_VALUE;
        }
+33 −0
Original line number Diff line number Diff line
@@ -92,6 +92,23 @@ public class AudioSystem
    public static final int NUM_MODES               = 4;


    /* Call states for Voice calls */
    /* @hide Call state for inactive call state. */
    public static final int CALL_INACTIVE           = 0x1;
    /* @hide Call state for active call state. */
    public static final int CALL_ACTIVE             = 0x2;
    /* @hide Call state for hold call state. */
    public static final int CALL_HOLD               = 0x3;
    /* @hide Call state for local hold call state. */
    public static final int CALL_LOCAL_HOLD         = 0x4;
    /* @hide Key for vsid used in setParameters */
    public static final String VSID_KEY             = "vsid";

    /* @hide Key for call_state used in setParameters */
    public static final String CALL_STATE_KEY       = "call_state";

    /* @hide Key for all_call_states used in getParameters */
    public static final String ALL_CALL_STATES_KEY  = "all_call_states";
    /* Routing bits for the former setRouting/getRouting API */
    /** @deprecated */
    @Deprecated public static final int ROUTE_EARPIECE          = (1 << 0);
@@ -257,6 +274,8 @@ public class AudioSystem
    public static final int DEVICE_OUT_SPDIF = 0x80000;
    public static final int DEVICE_OUT_FM = 0x100000;
    public static final int DEVICE_OUT_AUX_LINE = 0x200000;
    public static final int DEVICE_OUT_FM_TX = 0x1000000;
    public static final int DEVICE_OUT_PROXY = 0x2000000;

    public static final int DEVICE_OUT_DEFAULT = DEVICE_BIT_DEFAULT;

@@ -282,6 +301,8 @@ public class AudioSystem
                                              DEVICE_OUT_SPDIF |
                                              DEVICE_OUT_FM |
                                              DEVICE_OUT_AUX_LINE |
                                              DEVICE_OUT_FM_TX |
                                              DEVICE_OUT_PROXY |
                                              DEVICE_OUT_DEFAULT);
    public static final int DEVICE_OUT_ALL_A2DP = (DEVICE_OUT_BLUETOOTH_A2DP |
                                                   DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
@@ -320,6 +341,9 @@ public class AudioSystem
    public static final int DEVICE_IN_SPDIF = DEVICE_BIT_IN | 0x10000;
    public static final int DEVICE_IN_BLUETOOTH_A2DP = DEVICE_BIT_IN | 0x20000;
    public static final int DEVICE_IN_LOOPBACK = DEVICE_BIT_IN | 0x40000;
    public static final int DEVICE_IN_PROXY = DEVICE_BIT_IN | 0x100000;
    public static final int DEVICE_IN_FM_RX = DEVICE_BIT_IN | 0x200000;
    public static final int DEVICE_IN_FM_RX_A2DP = DEVICE_BIT_IN | 0x400000;
    public static final int DEVICE_IN_DEFAULT = DEVICE_BIT_IN | DEVICE_BIT_DEFAULT;

    public static final int DEVICE_IN_ALL = (DEVICE_IN_COMMUNICATION |
@@ -341,6 +365,9 @@ public class AudioSystem
                                             DEVICE_IN_SPDIF |
                                             DEVICE_IN_BLUETOOTH_A2DP |
                                             DEVICE_IN_LOOPBACK |
                                             DEVICE_IN_PROXY |
                                             DEVICE_IN_FM_RX |
                                             DEVICE_IN_FM_RX_A2DP |
                                             DEVICE_IN_DEFAULT);
    public static final int DEVICE_IN_ALL_SCO = DEVICE_IN_BLUETOOTH_SCO_HEADSET;
    public static final int DEVICE_IN_ALL_USB = (DEVICE_IN_USB_ACCESSORY |
@@ -374,6 +401,8 @@ public class AudioSystem
    public static final String DEVICE_OUT_SPDIF_NAME = "spdif";
    public static final String DEVICE_OUT_FM_NAME = "fm_transmitter";
    public static final String DEVICE_OUT_AUX_LINE_NAME = "aux_line";
    public static final String DEVICE_OUT_FM_TX_NAME = "fm_tx";
    public static final String DEVICE_OUT_PROXY_NAME = "proxy";

    public static String getOutputDeviceName(int device)
    {
@@ -422,6 +451,10 @@ public class AudioSystem
            return DEVICE_OUT_FM_NAME;
        case DEVICE_OUT_AUX_LINE:
            return DEVICE_OUT_AUX_LINE_NAME;
        case DEVICE_OUT_FM_TX:
            return DEVICE_OUT_FM_TX_NAME;
        case DEVICE_OUT_PROXY:
            return DEVICE_OUT_PROXY_NAME;
        case DEVICE_OUT_DEFAULT:
        default:
            return "";
+16 −1
Original line number Diff line number Diff line
@@ -46,6 +46,16 @@ public class MediaFile {
    private static final int FIRST_AUDIO_FILE_TYPE = FILE_TYPE_MP3;
    private static final int LAST_AUDIO_FILE_TYPE = FILE_TYPE_FLAC;

    // More audio file types
    public static final int FILE_TYPE_DTS   = 100;
    public static final int FILE_TYPE_3GPA  = 101;
    public static final int FILE_TYPE_AC3   = 102;
    public static final int FILE_TYPE_QCP   = 103;
    public static final int FILE_TYPE_PCM   = 104;
    public static final int FILE_TYPE_EC3   = 105;
    private static final int FIRST_AUDIO_FILE_TYPE_EXT = FILE_TYPE_DTS;
    private static final int LAST_AUDIO_FILE_TYPE_EXT = FILE_TYPE_EC3;

    // MIDI file types
    public static final int FILE_TYPE_MID     = 11;
    public static final int FILE_TYPE_SMF     = 12;
@@ -244,13 +254,18 @@ public class MediaFile {
        addFileType("MPG", FILE_TYPE_MP2PS, "video/mp2p");
        addFileType("MPEG", FILE_TYPE_MP2PS, "video/mp2p");
        addFileType("DIVX", FILE_TYPE_DIVX, "video/divx");
        addFileType("QCP", FILE_TYPE_QCP, "audio/qcelp");
        addFileType("AC3", FILE_TYPE_AC3, "audio/ac3");
        addFileType("EC3", FILE_TYPE_EC3, "audio/eac3");
    }

    public static boolean isAudioFileType(int fileType) {
        return ((fileType >= FIRST_AUDIO_FILE_TYPE &&
                fileType <= LAST_AUDIO_FILE_TYPE) ||
                (fileType >= FIRST_MIDI_FILE_TYPE &&
                fileType <= LAST_MIDI_FILE_TYPE));
                fileType <= LAST_MIDI_FILE_TYPE) ||
                (fileType >= FIRST_AUDIO_FILE_TYPE_EXT &&
                fileType <= LAST_AUDIO_FILE_TYPE_EXT));
    }

    public static boolean isVideoFileType(int fileType) {
Loading