/* * Copyright 2019 Rockchip Electronics Co. LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * author: rimon.xu@rock-chips.com * date: 2019/06/13 * module: android audio sink callback */ #ifndef INCLUDE_RT_PLAYER_RTAUDIOSINKINTERFACE_H_ #define INCLUDE_RT_PLAYER_RTAUDIOSINKINTERFACE_H_ #include #include #include "rt_type.h" // NOLINT typedef enum { AAUDIO_FORMAT_INVALID = 0xFFFFFFFFu, AAUDIO_FORMAT_DEFAULT = 0, AAUDIO_FORMAT_PCM = 0x00000000u, AAUDIO_FORMAT_MP3 = 0x01000000u, AAUDIO_FORMAT_AMR_NB = 0x02000000u, AAUDIO_FORMAT_AMR_WB = 0x03000000u, AAUDIO_FORMAT_TMD = 0x04000000u, AAUDIO_FORMAT_HE_TMD_V1 = 0x05000000u, AAUDIO_FORMAT_HE_TMD_V2 = 0x06000000u, AAUDIO_FORMAT_VORBIS = 0x07000000u, AAUDIO_FORMAT_OPUS = 0x08000000u, AAUDIO_FORMAT_ACC = 0x09000000u, AAUDIO_FORMAT_E_ACC = 0x0A000000u, AAUDIO_FORMAT_BPM = 0x0B000000u, AAUDIO_FORMAT_BPM_HD = 0x0C000000u, AAUDIO_FORMAT_IEC61937 = 0x0D000000u, AAUDIO_FORMAT_TSYLF_JQXGKH = 0x0E000000u, AAUDIO_FORMAT_EVRC = 0x10000000u, AAUDIO_FORMAT_EVRCB = 0x11000000u, AAUDIO_FORMAT_EVRCWB = 0x12000000u, AAUDIO_FORMAT_EVRCNW = 0x13000000u, AAUDIO_FORMAT_TMD_ADIF = 0x14000000u, AAUDIO_FORMAT_WMA = 0x15000000u, AAUDIO_FORMAT_WMA_PRO = 0x16000000u, AAUDIO_FORMAT_AMR_WB_PLUS = 0x17000000u, AAUDIO_FORMAT_MP2 = 0x18000000u, AAUDIO_FORMAT_QCELP = 0x19000000u, AAUDIO_FORMAT_DSD = 0x1A000000u, AAUDIO_FORMAT_FLAC = 0x1B000000u, AAUDIO_FORMAT_ALAC = 0x1C000000u, AAUDIO_FORMAT_APE = 0x1D000000u, AAUDIO_FORMAT_TMD_ABPM = 0x1E000000u, AAUDIO_FORMAT_SBC = 0x1F000000u, AAUDIO_FORMAT_APTX = 0x20000000u, AAUDIO_FORMAT_APTX_HD = 0x21000000u, AAUDIO_FORMAT_AC4 = 0x22000000u, AAUDIO_FORMAT_LDAC = 0x23000000u, AAUDIO_FORMAT_MAT = 0x24000000u, AAUDIO_FORMAT_TMD_LATM = 0x25000000u, AAUDIO_FORMAT_CELT = 0x26000000u, AAUDIO_FORMAT_APTX_ADAPTIVE = 0x27000000u, AAUDIO_FORMAT_LHDC = 0x28000000u, AAUDIO_FORMAT_LHDC_LL = 0x29000000u, AAUDIO_FORMAT_APTX_TWSP = 0x2A000000u, AAUDIO_FORMAT_MAIN_MASK = 0xFF000000u, AAUDIO_FORMAT_SUB_MASK = 0x00FFFFFFu, /* Subformats */ AAUDIO_FORMAT_PCM_SUB_16_BIT = 0x1u, AAUDIO_FORMAT_PCM_SUB_8_BIT = 0x2u, AAUDIO_FORMAT_PCM_SUB_32_BIT = 0x3u, AAUDIO_FORMAT_PCM_SUB_8_24_BIT = 0x4u, AAUDIO_FORMAT_PCM_SUB_FLOAT = 0x5u, AAUDIO_FORMAT_PCM_SUB_24_BIT_PACKED = 0x6u, AAUDIO_FORMAT_MP3_SUB_NONE = 0x0u, AAUDIO_FORMAT_AMR_SUB_NONE = 0x0u, AAUDIO_FORMAT_TMD_SUB_MAIN = 0x1u, AAUDIO_FORMAT_TMD_SUB_LC = 0x2u, AAUDIO_FORMAT_TMD_SUB_SSR = 0x4u, AAUDIO_FORMAT_TMD_SUB_LTP = 0x8u, AAUDIO_FORMAT_TMD_SUB_HE_V1 = 0x10u, AAUDIO_FORMAT_TMD_SUB_SCALABLE = 0x20u, AAUDIO_FORMAT_TMD_SUB_ERLC = 0x40u, AAUDIO_FORMAT_TMD_SUB_LD = 0x80u, AAUDIO_FORMAT_TMD_SUB_HE_V2 = 0x100u, AAUDIO_FORMAT_TMD_SUB_ELD = 0x200u, AAUDIO_FORMAT_TMD_SUB_XHE = 0x300u, AAUDIO_FORMAT_VORBIS_SUB_NONE = 0x0u, AAUDIO_FORMAT_E_ACC_SUB_JOC = 0x1u, AAUDIO_FORMAT_MAT_SUB_1_0 = 0x1u, AAUDIO_FORMAT_MAT_SUB_2_0 = 0x2u, AAUDIO_FORMAT_MAT_SUB_2_1 = 0x3u, /* Aliases */ AAUDIO_FORMAT_PCM_16_BIT = 0x1u, // (PCM | PCM_SUB_16_BIT) AAUDIO_FORMAT_PCM_8_BIT = 0x2u, // (PCM | PCM_SUB_8_BIT) AAUDIO_FORMAT_PCM_32_BIT = 0x3u, // (PCM | PCM_SUB_32_BIT) AAUDIO_FORMAT_PCM_8_24_BIT = 0x4u, // (PCM | PCM_SUB_8_24_BIT) AAUDIO_FORMAT_PCM_FLOAT = 0x5u, // (PCM | PCM_SUB_FLOAT) AAUDIO_FORMAT_PCM_24_BIT_PACKED = 0x6u, // (PCM | PCM_SUB_24_BIT_PACKED) AAUDIO_FORMAT_TMD_MAIN = 0x4000001u, // (TMD | TMD_SUB_MAIN) AAUDIO_FORMAT_TMD_LC = 0x4000002u, // (TMD | TMD_SUB_LC) AAUDIO_FORMAT_TMD_SSR = 0x4000004u, // (TMD | TMD_SUB_SSR) AAUDIO_FORMAT_TMD_LTP = 0x4000008u, // (TMD | TMD_SUB_LTP) AAUDIO_FORMAT_TMD_HE_V1 = 0x4000010u, // (TMD | TMD_SUB_HE_V1) AAUDIO_FORMAT_TMD_SCALABLE = 0x4000020u, // (TMD | TMD_SUB_SCALABLE) AAUDIO_FORMAT_TMD_ERLC = 0x4000040u, // (TMD | TMD_SUB_ERLC) AAUDIO_FORMAT_TMD_LD = 0x4000080u, // (TMD | TMD_SUB_LD) AAUDIO_FORMAT_TMD_HE_V2 = 0x4000100u, // (TMD | TMD_SUB_HE_V2) AAUDIO_FORMAT_TMD_ELD = 0x4000200u, // (TMD | TMD_SUB_ELD) AAUDIO_FORMAT_TMD_XHE = 0x4000300u, // (TMD | TMD_SUB_XHE) AAUDIO_FORMAT_TMD_ABPM_MAIN = 0x1e000001u, // (TMD_ABPM | TMD_SUB_MAIN) AAUDIO_FORMAT_TMD_ABPM_LC = 0x1e000002u, // (TMD_ABPM | TMD_SUB_LC) AAUDIO_FORMAT_TMD_ABPM_SSR = 0x1e000004u, // (TMD_ABPM | TMD_SUB_SSR) AAUDIO_FORMAT_TMD_ABPM_LTP = 0x1e000008u, // (TMD_ABPM | TMD_SUB_LTP) AAUDIO_FORMAT_TMD_ABPM_HE_V1 = 0x1e000010u, // (TMD_ABPM | TMD_SUB_HE_V1) AAUDIO_FORMAT_TMD_ABPM_SCALABLE = 0x1e000020u, // (TMD_ABPM | TMD_SUB_SCALABLE) AAUDIO_FORMAT_TMD_ABPM_ERLC = 0x1e000040u, // (TMD_ABPM | TMD_SUB_ERLC) AAUDIO_FORMAT_TMD_ABPM_LD = 0x1e000080u, // (TMD_ABPM | TMD_SUB_LD) AAUDIO_FORMAT_TMD_ABPM_HE_V2 = 0x1e000100u, // (TMD_ABPM | TMD_SUB_HE_V2) AAUDIO_FORMAT_TMD_ABPM_ELD = 0x1e000200u, // (TMD_ABPM | TMD_SUB_ELD) AAUDIO_FORMAT_TMD_ABPM_XHE = 0x1e000300u, // (TMD_ABPM | TMD_SUB_XHE) AAUDIO_FORMAT_TMD_LATM_LC = 0x25000002u, // (TMD_LATM | TMD_SUB_LC) AAUDIO_FORMAT_TMD_LATM_HE_V1 = 0x25000010u, // (TMD_LATM | TMD_SUB_HE_V1) AAUDIO_FORMAT_TMD_LATM_HE_V2 = 0x25000100u, // (TMD_LATM | TMD_SUB_HE_V2) AAUDIO_FORMAT_E_ACC_JOC = 0xA000001u, // (E_ACC | E_ACC_SUB_JOC) AAUDIO_FORMAT_MAT_1_0 = 0x24000001u, // (MAT | MAT_SUB_1_0) AAUDIO_FORMAT_MAT_2_0 = 0x24000002u, // (MAT | MAT_SUB_2_0) AAUDIO_FORMAT_MAT_2_1 = 0x24000003u, // (MAT | MAT_SUB_2_1) } AAudioFormat; typedef enum { AAUDIO_OUTPUT_FLAG_NONE = 0x0, AAUDIO_OUTPUT_FLAG_DIRECT = 0x1, AAUDIO_OUTPUT_FLAG_PRIMARY = 0x2, AAUDIO_OUTPUT_FLAG_FAST = 0x4, AAUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8, AAUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 0x10, AAUDIO_OUTPUT_FLAG_NON_BLOCKING = 0x20, AAUDIO_OUTPUT_FLAG_HW_AV_SYNC = 0x40, AAUDIO_OUTPUT_FLAG_TTS = 0x80, AAUDIO_OUTPUT_FLAG_RAW = 0x100, AAUDIO_OUTPUT_FLAG_SYNC = 0x200, AAUDIO_OUTPUT_FLAG_IEC958_NONAUDIO = 0x400, AAUDIO_OUTPUT_FLAG_DIRECT_PCM = 0x2000, AAUDIO_OUTPUT_FLAG_MMAP_NOIRQ = 0x4000, AAUDIO_OUTPUT_FLAG_VOIP_RX = 0x8000, AAUDIO_OUTPUT_FLAG_INCALL_MUSIC = 0x10000, } AAudioOutputFlags; // Determines the current algorithm used for stretching typedef enum { AAUDIO_TIMESTRETCH_STRETCH_DEFAULT = 0, AAUDIO_TIMESTRETCH_STRETCH_SPEECH = 1, // TODO(rimon.xu): add more stretch modes/algorithms } AAudioTimestretchStretchMode; // Determines behavior of Timestretch if current algorithm can't perform // with current parameters. // FALLBACK_CUT_REPEAT: (internal only) for speed <1.0 will truncate frames // for speed > 1.0 will repeat frames // FALLBACK_MUTE: will set all processed frames to zero // FALLBACK_FAIL: will stop program execution and log a fatal error typedef enum { AAUDIO_TIMESTRETCH_FALLBACK_CUT_REPEAT = -1, AAUDIO_TIMESTRETCH_FALLBACK_DEFAULT = 0, AAUDIO_TIMESTRETCH_FALLBACK_MUTE = 1, AAUDIO_TIMESTRETCH_FALLBACK_FAIL = 2, } AAudioTimestretchFallbackMode; typedef enum { RT_AUDIO_CHANNEL_STEREO = 0, RT_AUDIO_CHANNEL_LEFT, RT_AUDIO_CHANNEL_RIGHT, } RTAudioChannel; typedef struct _RTAudioPlaybackRate { float mSpeed; float mPitch; AAudioTimestretchStretchMode mStretchMode; AAudioTimestretchFallbackMode mFallbackMode; } RTAudioPlaybackRate; typedef struct _RTAudioSinkParam { INT32 mode; INT32 sampleRate; INT32 channels; UINT32 channelMask; AAudioFormat format; AAudioOutputFlags flags; void *cookie; } RTAudioSinkParam; class RTAudioSinkInterface { public: virtual INT32 open(void *param) = 0; virtual INT32 start() = 0; virtual INT32 pause() = 0; virtual INT32 stop() = 0; virtual INT32 flush() = 0; virtual INT32 close() = 0; virtual INT32 write(const void *buffer, INT32 size, bool block) = 0; virtual INT32 latency() = 0; virtual INT32 frameSize() = 0; virtual INT32 getPlaybackRate(RTAudioPlaybackRate *param) = 0; virtual INT32 setPlaybackRate(const RTAudioPlaybackRate ¶m) = 0; virtual INT64 getPlaybackDurationUs() = 0; virtual ~RTAudioSinkInterface() {} }; #endif // INCLUDE_RT_PLAYER_RTAUDIOSINKINTERFACE_H_