usecase
指的是 音頻應用場景,每個usecase都映射到一個特定的 PCM 設備。
在高通平台上,枚舉定義了很多usecase,可以參考查看以下內容:
代碼路徑:
\code\hardware\qcom\audio\hal\audio_hw.c //use_case_table
\code\hardware\qcom\audio\hal\audio_hw.h //enum Playback usecases num
Playback usecases
const char * const use_case_table[AUDIO_USECASE_MAX] = {
[USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = "deep-buffer-playback",
[USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = "low-latency-playback",
[USECASE_AUDIO_PLAYBACK_ULL] = "audio-ull-playback",
[USECASE_AUDIO_PLAYBACK_MULTI_CH] = "multi-channel-playback",
[USECASE_AUDIO_PLAYBACK_OFFLOAD] = "compress-offload-playback",
//Enabled for Direct_PCM
[USECASE_AUDIO_PLAYBACK_OFFLOAD2] = "compress-offload-playback2",
[USECASE_AUDIO_PLAYBACK_OFFLOAD3] = "compress-offload-playback3",
[USECASE_AUDIO_PLAYBACK_OFFLOAD4] = "compress-offload-playback4",
[USECASE_AUDIO_PLAYBACK_OFFLOAD5] = "compress-offload-playback5",
[USECASE_AUDIO_PLAYBACK_OFFLOAD6] = "compress-offload-playback6",
[USECASE_AUDIO_PLAYBACK_OFFLOAD7] = "compress-offload-playback7",
[USECASE_AUDIO_PLAYBACK_OFFLOAD8] = "compress-offload-playback8",
[USECASE_AUDIO_PLAYBACK_OFFLOAD9] = "compress-offload-playback9",
[USECASE_AUDIO_PLAYBACK_FM] = "play-fm",
[USECASE_AUDIO_PLAYBACK_MMAP] = "mmap-playback",
[USECASE_AUDIO_PLAYBACK_HIFI] = "hifi-playback",
......
Capture usecases
const char * const use_case_table[AUDIO_USECASE_MAX] = {
......
[USECASE_AUDIO_RECORD] = "audio-record",
[USECASE_AUDIO_RECORD_COMPRESS] = "audio-record-compress",
[USECASE_AUDIO_RECORD_COMPRESS2] = "audio-record-compress2",
[USECASE_AUDIO_RECORD_COMPRESS3] = "audio-record-compress3",
[USECASE_AUDIO_RECORD_COMPRESS4] = "audio-record-compress4",
[USECASE_AUDIO_RECORD_COMPRESS5] = "audio-record-compress5",
[USECASE_AUDIO_RECORD_COMPRESS6] = "audio-record-compress6",
[USECASE_AUDIO_RECORD_LOW_LATENCY] = "low-latency-record",
[USECASE_AUDIO_RECORD_FM_VIRTUAL] = "fm-virtual-record",
[USECASE_AUDIO_RECORD_MMAP] = "mmap-record",
[USECASE_AUDIO_RECORD_HIFI] = "hifi-record",
......
HFP Use case
const char * const use_case_table[AUDIO_USECASE_MAX] = {
......
[USECASE_AUDIO_HFP_SCO] = "hfp-sco",
[USECASE_AUDIO_HFP_SCO_WB] = "hfp-sco-wb",
......
Voice/call usecase
const char * const use_case_table[AUDIO_USECASE_MAX] = {
......
[USECASE_VOICE_CALL] = "voice-call",
[USECASE_VOICE2_CALL] = "voice2-call",
[USECASE_VOLTE_CALL] = "volte-call",
[USECASE_QCHAT_CALL] = "qchat-call",
[USECASE_VOWLAN_CALL] = "vowlan-call",
[USECASE_VOICEMMODE1_CALL] = "voicemmode1-call",
[USECASE_VOICEMMODE2_CALL] = "voicemmode2-call",
[USECASE_COMPRESS_VOIP_CALL] = "compress-voip-call",
[USECASE_INCALL_REC_UPLINK] = "incall-rec-uplink",
[USECASE_INCALL_REC_DOWNLINK] = "incall-rec-downlink",
[USECASE_INCALL_REC_UPLINK_AND_DOWNLINK] = "incall-rec-uplink-and-downlink",
[USECASE_INCALL_REC_UPLINK_COMPRESS] = "incall-rec-uplink-compress",
[USECASE_INCALL_REC_DOWNLINK_COMPRESS] = "incall-rec-downlink-compress",
[USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS] = "incall-rec-uplink-and-downlink-compress",
......
others
const char * const use_case_table[AUDIO_USECASE_MAX] = {
......
[USECASE_INCALL_MUSIC_UPLINK] = "incall_music_uplink",
[USECASE_INCALL_MUSIC_UPLINK2] = "incall_music_uplink2",
[USECASE_AUDIO_SPKR_CALIB_RX] = "spkr-rx-calib",
[USECASE_AUDIO_SPKR_CALIB_TX] = "spkr-vi-record",
[USECASE_AUDIO_PLAYBACK_AFE_PROXY] = "afe-proxy-playback",
[USECASE_AUDIO_RECORD_AFE_PROXY] = "afe-proxy-record",
[USECASE_AUDIO_PLAYBACK_SILENCE] = "silence-playback",
/* Transcode loopback cases */
[USECASE_AUDIO_TRANSCODE_LOOPBACK] = "audio-transcode-loopback",
[USECASE_AUDIO_PLAYBACK_VOIP] = "audio-playback-voip",
[USECASE_AUDIO_RECORD_VOIP] = "audio-record-voip",
/* For Interactive Audio Streams */
[USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM1] = "audio-interactive-stream1",
[USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM2] = "audio-interactive-stream2",
[USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM3] = "audio-interactive-stream3",
[USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM4] = "audio-interactive-stream4",
[USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM5] = "audio-interactive-stream5",
[USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM6] = "audio-interactive-stream6",
[USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM7] = "audio-interactive-stream7",
[USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM8] = "audio-interactive-stream8",
[USECASE_AUDIO_EC_REF_LOOPBACK] = "ec-ref-audio-capture",
[USECASE_AUDIO_A2DP_ABR_FEEDBACK] = "a2dp-abr-feedback"
palyback類
Deep buffer Playback
- 描述:音頻在AP中已處理為PCM 數據, 發送到ADSP, 最終經由ADSP輸出到 device上;
- 音頻軌道中的標志位:AUDIO_OUTPUT_FLAG_PRIMARY
- 應用主要的場景: 鈴聲、音頻/視頻流數據和等等。
- 數據格式:PCM
- 支持的聲道: 雙聲道
- 支持的采樣率: 44.1Kh, 48Khz
Low latency Playback
- 描述:如其名稱,針對低延時的播放場景; 和Deep buffer類似,音頻在AP中已處理為PCM 數據, 發送到ADSP,區別是它所分配的buffer更小些,並且在ADSP側只做很少或者基本不做處理,
- 音頻軌道中的標志位:AUDIO_OUTPUT_FLAG_FAST
- 應用主要的場景:一些對延遲要求較高的音頻,比如觸碰音和游戲音。
- 數據格式:PCM
- 支持的聲道: 雙聲道
- 支持的采樣率: 44.1Khz,48Khz
Offload playback
-
描述:音頻解碼部分的工作是在ADSP中完成,AP側只負責把音頻數據送到ADSP中,送出去后,AP側會進行休眠,ADSP中會分配一塊較大的buffer去處理此數據,在ADSP中進行解碼,音效的處理工作,在ADSP解碼器處理完數據之前,它會喚醒AP側去送下一包數據。
-
音頻軌道中的標志位:
AUDIO_OUTPUT_FLAG_DIRECT,
AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD,
AUDIO_OUTPUT_FLAG_NON_BLOCKING
-
應用主要的場景:音樂文件播放等;
-
數據格式:MP3, AC3, EAC3, AAC, FLAC, 24bit PCM, 16 bit PCM
-
支持的聲道:1, 2, 2,1, 4, 5, 5.1, 6, 7.1
Mutichannel Playback
- 描述:和Deep buffer playback類似,但是,它多應用於處理多聲道音頻數據,采樣的解碼器是Multichannel Decoder將多通道解碼器的 PCM 輸出發送到的播放模式在輸出設備上進行 aDSP、后處理和渲染
- 應用場景:播放AAC格式5.1聲道音源, 播放杜比AC3/eAC3格式音頻
- 音頻軌道中的標志位:AUDIO_OUTPUT_FLAG_DIRECT
- 支持的采樣率: 44.1KHZ, 48k
通過logcast 可以Debug 當前使用的usecase:
比如 播放一段音頻,從logcat 信息中 可以獲取到如下內容:
# logcat | grep usecase
02-11 15:37:09.177 700 645 D audio_hw_primary: start_output_stream: enter: stream(0xf5359000)usecase(4: compress-offload-playback2) devices(0x2)
02-11 15:37:09.178 700 645 I msm8916_platform: platform_check_and_set_codec_backend_cfg:becf: afe: bitwidth 16, samplerate 44100 channels 2, backend_idx 0 usecase = 4 device (speaker)
02-11 15:37:09.179 700 645 I msm8916_platform: platform_check_codec_backend_cfg:becf: afe: Codec selected backend: 0 current bit width: 16 sample rate: 44100 channels: 2 usecase 4 device (speaker)
02-11 15:37:09.179 700 645 D audio_hw_primary: check_usecases_codec_backend:becf: force routing 0
02-11 15:37:09.179 700 645 D audio_hw_primary: check_usecases_codec_backend:becf: (63) check_usecases curr device: speaker, usecase device: backends match 0
02-11 15:37:09.179 700 645 D audio_hw_primary: check_usecases_codec_backend:becf: check_usecases num.of Usecases to switch 0
02-11 15:37:09.187 700 645 I sound_trigger_platform: platform_stdev_check_and_update_concurrency: Received STREAM event, event type 3, usecase type -177593328
02-11 15:37:09.187 700 645 D audio_hw_utils: audio_extn_utils_send_app_type_cfg: usecase->out_snd_device speaker
02-11 15:37:21.529 700 611 D audio_hw_primary: out_standby: enter: stream (0xf5359000) usecase(4: compress-offload-playback2)
02-11 15:37:21.623 700 611 I sound_trigger_platform: platform_stdev_check_and_update_concurrency: Received STREAM event, event type 2, usecase type 0
可知當前使用的 usecase 是ompress-offload-playback2, 輸出到device是 speaker;