1 /* 2 * Copyright 2019 Rockchip Electronics Co. LTD 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 * author: rimon.xu@rock-chips.com 17 * date: 2019/06/13 18 * module: android audio sink callback 19 */ 20 21 #ifndef INCLUDE_RT_PLAYER_RTAUDIOSINKINTERFACE_H_ 22 #define INCLUDE_RT_PLAYER_RTAUDIOSINKINTERFACE_H_ 23 24 #include <sys/types.h> 25 #include <inttypes.h> 26 #include "rt_type.h" // NOLINT 27 28 typedef enum { 29 AAUDIO_FORMAT_INVALID = 0xFFFFFFFFu, 30 AAUDIO_FORMAT_DEFAULT = 0, 31 AAUDIO_FORMAT_PCM = 0x00000000u, 32 AAUDIO_FORMAT_MP3 = 0x01000000u, 33 AAUDIO_FORMAT_AMR_NB = 0x02000000u, 34 AAUDIO_FORMAT_AMR_WB = 0x03000000u, 35 AAUDIO_FORMAT_TMD = 0x04000000u, 36 AAUDIO_FORMAT_HE_TMD_V1 = 0x05000000u, 37 AAUDIO_FORMAT_HE_TMD_V2 = 0x06000000u, 38 AAUDIO_FORMAT_VORBIS = 0x07000000u, 39 AAUDIO_FORMAT_OPUS = 0x08000000u, 40 AAUDIO_FORMAT_ACC = 0x09000000u, 41 AAUDIO_FORMAT_E_ACC = 0x0A000000u, 42 AAUDIO_FORMAT_BPM = 0x0B000000u, 43 AAUDIO_FORMAT_BPM_HD = 0x0C000000u, 44 AAUDIO_FORMAT_IEC61937 = 0x0D000000u, 45 AAUDIO_FORMAT_TSYLF_JQXGKH = 0x0E000000u, 46 AAUDIO_FORMAT_EVRC = 0x10000000u, 47 AAUDIO_FORMAT_EVRCB = 0x11000000u, 48 AAUDIO_FORMAT_EVRCWB = 0x12000000u, 49 AAUDIO_FORMAT_EVRCNW = 0x13000000u, 50 AAUDIO_FORMAT_TMD_ADIF = 0x14000000u, 51 AAUDIO_FORMAT_WMA = 0x15000000u, 52 AAUDIO_FORMAT_WMA_PRO = 0x16000000u, 53 AAUDIO_FORMAT_AMR_WB_PLUS = 0x17000000u, 54 AAUDIO_FORMAT_MP2 = 0x18000000u, 55 AAUDIO_FORMAT_QCELP = 0x19000000u, 56 AAUDIO_FORMAT_DSD = 0x1A000000u, 57 AAUDIO_FORMAT_FLAC = 0x1B000000u, 58 AAUDIO_FORMAT_ALAC = 0x1C000000u, 59 AAUDIO_FORMAT_APE = 0x1D000000u, 60 AAUDIO_FORMAT_TMD_ABPM = 0x1E000000u, 61 AAUDIO_FORMAT_SBC = 0x1F000000u, 62 AAUDIO_FORMAT_APTX = 0x20000000u, 63 AAUDIO_FORMAT_APTX_HD = 0x21000000u, 64 AAUDIO_FORMAT_AC4 = 0x22000000u, 65 AAUDIO_FORMAT_LDAC = 0x23000000u, 66 AAUDIO_FORMAT_MAT = 0x24000000u, 67 AAUDIO_FORMAT_TMD_LATM = 0x25000000u, 68 AAUDIO_FORMAT_CELT = 0x26000000u, 69 AAUDIO_FORMAT_APTX_ADAPTIVE = 0x27000000u, 70 AAUDIO_FORMAT_LHDC = 0x28000000u, 71 AAUDIO_FORMAT_LHDC_LL = 0x29000000u, 72 AAUDIO_FORMAT_APTX_TWSP = 0x2A000000u, 73 AAUDIO_FORMAT_MAIN_MASK = 0xFF000000u, 74 AAUDIO_FORMAT_SUB_MASK = 0x00FFFFFFu, 75 76 /* Subformats */ 77 AAUDIO_FORMAT_PCM_SUB_16_BIT = 0x1u, 78 AAUDIO_FORMAT_PCM_SUB_8_BIT = 0x2u, 79 AAUDIO_FORMAT_PCM_SUB_32_BIT = 0x3u, 80 AAUDIO_FORMAT_PCM_SUB_8_24_BIT = 0x4u, 81 AAUDIO_FORMAT_PCM_SUB_FLOAT = 0x5u, 82 AAUDIO_FORMAT_PCM_SUB_24_BIT_PACKED = 0x6u, 83 84 AAUDIO_FORMAT_MP3_SUB_NONE = 0x0u, 85 86 AAUDIO_FORMAT_AMR_SUB_NONE = 0x0u, 87 88 AAUDIO_FORMAT_TMD_SUB_MAIN = 0x1u, 89 AAUDIO_FORMAT_TMD_SUB_LC = 0x2u, 90 AAUDIO_FORMAT_TMD_SUB_SSR = 0x4u, 91 AAUDIO_FORMAT_TMD_SUB_LTP = 0x8u, 92 AAUDIO_FORMAT_TMD_SUB_HE_V1 = 0x10u, 93 AAUDIO_FORMAT_TMD_SUB_SCALABLE = 0x20u, 94 AAUDIO_FORMAT_TMD_SUB_ERLC = 0x40u, 95 AAUDIO_FORMAT_TMD_SUB_LD = 0x80u, 96 AAUDIO_FORMAT_TMD_SUB_HE_V2 = 0x100u, 97 AAUDIO_FORMAT_TMD_SUB_ELD = 0x200u, 98 AAUDIO_FORMAT_TMD_SUB_XHE = 0x300u, 99 100 AAUDIO_FORMAT_VORBIS_SUB_NONE = 0x0u, 101 102 AAUDIO_FORMAT_E_ACC_SUB_JOC = 0x1u, 103 104 AAUDIO_FORMAT_MAT_SUB_1_0 = 0x1u, 105 AAUDIO_FORMAT_MAT_SUB_2_0 = 0x2u, 106 AAUDIO_FORMAT_MAT_SUB_2_1 = 0x3u, 107 108 /* Aliases */ 109 AAUDIO_FORMAT_PCM_16_BIT = 0x1u, // (PCM | PCM_SUB_16_BIT) 110 AAUDIO_FORMAT_PCM_8_BIT = 0x2u, // (PCM | PCM_SUB_8_BIT) 111 AAUDIO_FORMAT_PCM_32_BIT = 0x3u, // (PCM | PCM_SUB_32_BIT) 112 AAUDIO_FORMAT_PCM_8_24_BIT = 0x4u, // (PCM | PCM_SUB_8_24_BIT) 113 AAUDIO_FORMAT_PCM_FLOAT = 0x5u, // (PCM | PCM_SUB_FLOAT) 114 AAUDIO_FORMAT_PCM_24_BIT_PACKED = 0x6u, // (PCM | PCM_SUB_24_BIT_PACKED) 115 AAUDIO_FORMAT_TMD_MAIN = 0x4000001u, // (TMD | TMD_SUB_MAIN) 116 AAUDIO_FORMAT_TMD_LC = 0x4000002u, // (TMD | TMD_SUB_LC) 117 AAUDIO_FORMAT_TMD_SSR = 0x4000004u, // (TMD | TMD_SUB_SSR) 118 AAUDIO_FORMAT_TMD_LTP = 0x4000008u, // (TMD | TMD_SUB_LTP) 119 AAUDIO_FORMAT_TMD_HE_V1 = 0x4000010u, // (TMD | TMD_SUB_HE_V1) 120 AAUDIO_FORMAT_TMD_SCALABLE = 0x4000020u, // (TMD | TMD_SUB_SCALABLE) 121 AAUDIO_FORMAT_TMD_ERLC = 0x4000040u, // (TMD | TMD_SUB_ERLC) 122 AAUDIO_FORMAT_TMD_LD = 0x4000080u, // (TMD | TMD_SUB_LD) 123 AAUDIO_FORMAT_TMD_HE_V2 = 0x4000100u, // (TMD | TMD_SUB_HE_V2) 124 AAUDIO_FORMAT_TMD_ELD = 0x4000200u, // (TMD | TMD_SUB_ELD) 125 AAUDIO_FORMAT_TMD_XHE = 0x4000300u, // (TMD | TMD_SUB_XHE) 126 AAUDIO_FORMAT_TMD_ABPM_MAIN = 0x1e000001u, // (TMD_ABPM | TMD_SUB_MAIN) 127 AAUDIO_FORMAT_TMD_ABPM_LC = 0x1e000002u, // (TMD_ABPM | TMD_SUB_LC) 128 AAUDIO_FORMAT_TMD_ABPM_SSR = 0x1e000004u, // (TMD_ABPM | TMD_SUB_SSR) 129 AAUDIO_FORMAT_TMD_ABPM_LTP = 0x1e000008u, // (TMD_ABPM | TMD_SUB_LTP) 130 AAUDIO_FORMAT_TMD_ABPM_HE_V1 = 0x1e000010u, // (TMD_ABPM | TMD_SUB_HE_V1) 131 AAUDIO_FORMAT_TMD_ABPM_SCALABLE = 0x1e000020u, // (TMD_ABPM | TMD_SUB_SCALABLE) 132 AAUDIO_FORMAT_TMD_ABPM_ERLC = 0x1e000040u, // (TMD_ABPM | TMD_SUB_ERLC) 133 AAUDIO_FORMAT_TMD_ABPM_LD = 0x1e000080u, // (TMD_ABPM | TMD_SUB_LD) 134 AAUDIO_FORMAT_TMD_ABPM_HE_V2 = 0x1e000100u, // (TMD_ABPM | TMD_SUB_HE_V2) 135 AAUDIO_FORMAT_TMD_ABPM_ELD = 0x1e000200u, // (TMD_ABPM | TMD_SUB_ELD) 136 AAUDIO_FORMAT_TMD_ABPM_XHE = 0x1e000300u, // (TMD_ABPM | TMD_SUB_XHE) 137 AAUDIO_FORMAT_TMD_LATM_LC = 0x25000002u, // (TMD_LATM | TMD_SUB_LC) 138 AAUDIO_FORMAT_TMD_LATM_HE_V1 = 0x25000010u, // (TMD_LATM | TMD_SUB_HE_V1) 139 AAUDIO_FORMAT_TMD_LATM_HE_V2 = 0x25000100u, // (TMD_LATM | TMD_SUB_HE_V2) 140 AAUDIO_FORMAT_E_ACC_JOC = 0xA000001u, // (E_ACC | E_ACC_SUB_JOC) 141 AAUDIO_FORMAT_MAT_1_0 = 0x24000001u, // (MAT | MAT_SUB_1_0) 142 AAUDIO_FORMAT_MAT_2_0 = 0x24000002u, // (MAT | MAT_SUB_2_0) 143 AAUDIO_FORMAT_MAT_2_1 = 0x24000003u, // (MAT | MAT_SUB_2_1) 144 } AAudioFormat; 145 146 typedef enum { 147 AAUDIO_OUTPUT_FLAG_NONE = 0x0, 148 AAUDIO_OUTPUT_FLAG_DIRECT = 0x1, 149 AAUDIO_OUTPUT_FLAG_PRIMARY = 0x2, 150 AAUDIO_OUTPUT_FLAG_FAST = 0x4, 151 AAUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8, 152 AAUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 0x10, 153 AAUDIO_OUTPUT_FLAG_NON_BLOCKING = 0x20, 154 AAUDIO_OUTPUT_FLAG_HW_AV_SYNC = 0x40, 155 AAUDIO_OUTPUT_FLAG_TTS = 0x80, 156 AAUDIO_OUTPUT_FLAG_RAW = 0x100, 157 AAUDIO_OUTPUT_FLAG_SYNC = 0x200, 158 AAUDIO_OUTPUT_FLAG_IEC958_NONAUDIO = 0x400, 159 AAUDIO_OUTPUT_FLAG_DIRECT_PCM = 0x2000, 160 AAUDIO_OUTPUT_FLAG_MMAP_NOIRQ = 0x4000, 161 AAUDIO_OUTPUT_FLAG_VOIP_RX = 0x8000, 162 AAUDIO_OUTPUT_FLAG_INCALL_MUSIC = 0x10000, 163 } AAudioOutputFlags; 164 165 // Determines the current algorithm used for stretching 166 typedef enum { 167 AAUDIO_TIMESTRETCH_STRETCH_DEFAULT = 0, 168 AAUDIO_TIMESTRETCH_STRETCH_SPEECH = 1, 169 // TODO(rimon.xu): add more stretch modes/algorithms 170 } AAudioTimestretchStretchMode; 171 172 // Determines behavior of Timestretch if current algorithm can't perform 173 // with current parameters. 174 // FALLBACK_CUT_REPEAT: (internal only) for speed <1.0 will truncate frames 175 // for speed > 1.0 will repeat frames 176 // FALLBACK_MUTE: will set all processed frames to zero 177 // FALLBACK_FAIL: will stop program execution and log a fatal error 178 typedef enum { 179 AAUDIO_TIMESTRETCH_FALLBACK_CUT_REPEAT = -1, 180 AAUDIO_TIMESTRETCH_FALLBACK_DEFAULT = 0, 181 AAUDIO_TIMESTRETCH_FALLBACK_MUTE = 1, 182 AAUDIO_TIMESTRETCH_FALLBACK_FAIL = 2, 183 } AAudioTimestretchFallbackMode; 184 185 typedef enum { 186 RT_AUDIO_CHANNEL_STEREO = 0, 187 RT_AUDIO_CHANNEL_LEFT, 188 RT_AUDIO_CHANNEL_RIGHT, 189 } RTAudioChannel; 190 191 typedef struct _RTAudioPlaybackRate { 192 float mSpeed; 193 float mPitch; 194 AAudioTimestretchStretchMode mStretchMode; 195 AAudioTimestretchFallbackMode mFallbackMode; 196 } RTAudioPlaybackRate; 197 198 typedef struct _RTAudioSinkParam { 199 INT32 mode; 200 INT32 sampleRate; 201 INT32 channels; 202 UINT32 channelMask; 203 AAudioFormat format; 204 AAudioOutputFlags flags; 205 void *cookie; 206 } RTAudioSinkParam; 207 208 class RTAudioSinkInterface { 209 public: 210 virtual INT32 open(void *param) = 0; 211 virtual INT32 start() = 0; 212 virtual INT32 pause() = 0; 213 virtual INT32 stop() = 0; 214 virtual INT32 flush() = 0; 215 virtual INT32 close() = 0; 216 virtual INT32 write(const void *buffer, INT32 size, bool block) = 0; 217 218 virtual INT32 latency() = 0; 219 virtual INT32 frameSize() = 0; 220 virtual INT32 getPlaybackRate(RTAudioPlaybackRate *param) = 0; 221 virtual INT32 setPlaybackRate(const RTAudioPlaybackRate ¶m) = 0; 222 virtual INT64 getPlaybackDurationUs() = 0; 223 ~RTAudioSinkInterface()224 virtual ~RTAudioSinkInterface() {} 225 }; 226 227 #endif // INCLUDE_RT_PLAYER_RTAUDIOSINKINTERFACE_H_ 228 229