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;