1.new devices的查看
log中的new devices 要看Audio-baes.h 在安卓9.0上是可以看 //OUT_AUX_DIGITAL的。这个主要是看当前播放音频的设备是什么。位置在
例如 new devices 0x2 其实就是speaker在播放声音。
enum {
AUDIO_DEVICE_NONE = 0u, // 0x0
AUDIO_DEVICE_BIT_IN = 2147483648u, // 0x80000000
AUDIO_DEVICE_BIT_DEFAULT = 1073741824u, // 0x40000000
AUDIO_DEVICE_OUT_EARPIECE = 1u, // 0x1
AUDIO_DEVICE_OUT_SPEAKER = 2u, // 0x2
AUDIO_DEVICE_OUT_WIRED_HEADSET = 4u, // 0x4
AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 8u, // 0x8
AUDIO_DEVICE_OUT_BLUETOOTH_SCO = 16u, // 0x10
AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 32u, // 0x20
AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 64u, // 0x40
AUDIO_DEVICE_OUT_BLUETOOTH_A2DP = 128u, // 0x80
AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 256u, // 0x100
AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 512u, // 0x200
AUDIO_DEVICE_OUT_AUX_DIGITAL = 1024u, // 0x400
AUDIO_DEVICE_OUT_HDMI = 1024u, // OUT_AUX_DIGITAL
AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET = 2048u, // 0x800
AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET = 4096u, // 0x1000
AUDIO_DEVICE_OUT_USB_ACCESSORY = 8192u, // 0x2000
AUDIO_DEVICE_OUT_USB_DEVICE = 16384u, // 0x4000
AUDIO_DEVICE_OUT_REMOTE_SUBMIX = 32768u, // 0x8000
AUDIO_DEVICE_OUT_TELEPHONY_TX = 65536u, // 0x10000
AUDIO_DEVICE_OUT_LINE = 131072u, // 0x20000
AUDIO_DEVICE_OUT_HDMI_ARC = 262144u, // 0x40000
AUDIO_DEVICE_OUT_SPDIF = 524288u, // 0x80000
AUDIO_DEVICE_OUT_FM = 1048576u, // 0x100000
AUDIO_DEVICE_OUT_AUX_LINE = 2097152u, // 0x200000
AUDIO_DEVICE_OUT_SPEAKER_SAFE = 4194304u, // 0x400000
AUDIO_DEVICE_OUT_IP = 8388608u, // 0x800000
AUDIO_DEVICE_OUT_BUS = 16777216u, // 0x1000000
AUDIO_DEVICE_OUT_PROXY = 33554432u, // 0x2000000
AUDIO_DEVICE_OUT_USB_HEADSET = 67108864u, // 0x4000000
AUDIO_DEVICE_OUT_DEFAULT = 1073741824u, // BIT_DEFAULT
AUDIO_DEVICE_OUT_ALL = 1207959551u, // (((((((((((((((((((((((((((OUT_EARPIECE | OUT_SPEAKER) | OUT_WIRED_HEADSET) | OUT_WIRED_HEADPHONE) | OUT_BLUETOOTH_SCO) | OUT_BLUETOOTH_SCO_HEADSET) | OUT_BLUETOOTH_SCO_CARKIT) | OUT_BLUETOOTH_A2DP) | OUT_BLUETOOTH_A2DP_HEADPHONES) | OUT_BLUETOOTH_A2DP_SPEAKER) | OUT_HDMI) | OUT_ANLG_DOCK_HEADSET) | OUT_DGTL_DOCK_HEADSET) | OUT_USB_ACCESSORY) | OUT_USB_DEVICE) | OUT_REMOTE_SUBMIX) | OUT_TELEPHONY_TX) | OUT_LINE) | OUT_HDMI_ARC) | OUT_SPDIF) | OUT_FM) | OUT_AUX_LINE) | OUT_SPEAKER_SAFE) | OUT_IP) | OUT_BUS) | OUT_PROXY) | OUT_USB_HEADSET) | OUT_DEFAULT)
AUDIO_DEVICE_OUT_ALL_A2DP = 896u, // ((OUT_BLUETOOTH_A2DP | OUT_BLUETOOTH_A2DP_HEADPHONES) | OUT_BLUETOOTH_A2DP_SPEAKER)
AUDIO_DEVICE_OUT_ALL_SCO = 112u, // ((OUT_BLUETOOTH_SCO | OUT_BLUETOOTH_SCO_HEADSET) | OUT_BLUETOOTH_SCO_CARKIT)
AUDIO_DEVICE_OUT_ALL_USB = 67133440u, // ((OUT_USB_ACCESSORY | OUT_USB_DEVICE) | OUT_USB_HEADSET)
AUDIO_DEVICE_IN_COMMUNICATION = 2147483649u, // (BIT_IN | 0x1)
AUDIO_DEVICE_IN_AMBIENT = 2147483650u, // (BIT_IN | 0x2)
AUDIO_DEVICE_IN_BUILTIN_MIC = 2147483652u, // (BIT_IN | 0x4)
AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET = 2147483656u, // (BIT_IN | 0x8)
AUDIO_DEVICE_IN_WIRED_HEADSET = 2147483664u, // (BIT_IN | 0x10)
AUDIO_DEVICE_IN_AUX_DIGITAL = 2147483680u, // (BIT_IN | 0x20)
AUDIO_DEVICE_IN_HDMI = 2147483680u, // IN_AUX_DIGITAL
AUDIO_DEVICE_IN_VOICE_CALL = 2147483712u, // (BIT_IN | 0x40)
AUDIO_DEVICE_IN_TELEPHONY_RX = 2147483712u, // IN_VOICE_CALL
AUDIO_DEVICE_IN_BACK_MIC = 2147483776u, // (BIT_IN | 0x80)
AUDIO_DEVICE_IN_REMOTE_SUBMIX = 2147483904u, // (BIT_IN | 0x100)
AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET = 2147484160u, // (BIT_IN | 0x200)
AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET = 2147484672u, // (BIT_IN | 0x400)
AUDIO_DEVICE_IN_USB_ACCESSORY = 2147485696u, // (BIT_IN | 0x800)
AUDIO_DEVICE_IN_USB_DEVICE = 2147487744u, // (BIT_IN | 0x1000)
AUDIO_DEVICE_IN_FM_TUNER = 2147491840u, // (BIT_IN | 0x2000)
AUDIO_DEVICE_IN_TV_TUNER = 2147500032u, // (BIT_IN | 0x4000)
AUDIO_DEVICE_IN_LINE = 2147516416u, // (BIT_IN | 0x8000)
AUDIO_DEVICE_IN_SPDIF = 2147549184u, // (BIT_IN | 0x10000)
AUDIO_DEVICE_IN_BLUETOOTH_A2DP = 2147614720u, // (BIT_IN | 0x20000)
AUDIO_DEVICE_IN_LOOPBACK = 2147745792u, // (BIT_IN | 0x40000)
AUDIO_DEVICE_IN_IP = 2148007936u, // (BIT_IN | 0x80000)
AUDIO_DEVICE_IN_BUS = 2148532224u, // (BIT_IN | 0x100000)
AUDIO_DEVICE_IN_PROXY = 2164260864u, // (BIT_IN | 0x1000000)
AUDIO_DEVICE_IN_USB_HEADSET = 2181038080u, // (BIT_IN | 0x2000000)
AUDIO_DEVICE_IN_DEFAULT = 3221225472u, // (BIT_IN | BIT_DEFAULT)
AUDIO_DEVICE_IN_ALL = 3273654271u, // (((((((((((((((((((((((IN_COMMUNICATION | IN_AMBIENT) | IN_BUILTIN_MIC) | IN_BLUETOOTH_SCO_HEADSET) | IN_WIRED_HEADSET) | IN_HDMI) | IN_TELEPHONY_RX) | IN_BACK_MIC) | IN_REMOTE_SUBMIX) | IN_ANLG_DOCK_HEADSET) | IN_DGTL_DOCK_HEADSET) | IN_USB_ACCESSORY) | IN_USB_DEVICE) | IN_FM_TUNER) | IN_TV_TUNER) | IN_LINE) | IN_SPDIF) | IN_BLUETOOTH_A2DP) | IN_LOOPBACK) | IN_IP) | IN_BUS) | IN_PROXY) | IN_USB_HEADSET) | IN_DEFAULT)
AUDIO_DEVICE_IN_ALL_SCO = 2147483656u, // IN_BLUETOOTH_SCO_HEADSET
AUDIO_DEVICE_IN_ALL_USB = 2181044224u, // ((IN_USB_ACCESSORY | IN_USB_DEVICE) | IN_USB_HEADSET)
};
2. stream type 也在Audio-baes.h中有定义。
typedef enum {
AUDIO_STREAM_DEFAULT = -1, // (-1)
AUDIO_STREAM_MIN = 0,
AUDIO_STREAM_VOICE_CALL = 0,
AUDIO_STREAM_SYSTEM = 1,
AUDIO_STREAM_RING = 2,
AUDIO_STREAM_MUSIC = 3,
AUDIO_STREAM_ALARM = 4,
AUDIO_STREAM_NOTIFICATION = 5,
AUDIO_STREAM_BLUETOOTH_SCO = 6,
AUDIO_STREAM_ENFORCED_AUDIBLE = 7,
AUDIO_STREAM_DTMF = 8,
AUDIO_STREAM_TTS = 9,
AUDIO_STREAM_ACCESSIBILITY = 10,
AUDIO_STREAM_REROUTING = 11,
AUDIO_STREAM_PATCH = 12,
AUDIO_STREAM_PUBLIC_CNT = 11, // (ACCESSIBILITY + 1)
AUDIO_STREAM_FOR_POLICY_CNT = 12, // PATCH
AUDIO_STREAM_CNT = 13, // (PATCH + 1)
} audio_stream_type_t;
3.Audio Framework
- Ringtone/RingtoneManager: 提供播放来电铃声、通知音、闹钟铃声的接口;设置默认铃声的接口
- AudioManager/AudioService: 提供调节音量、设置声音通路、响铃模式的接口
- MediaSession: 提供远程控制音乐播放器的接口;处理耳机按键的接口
- AudioTrack/MediaPlayer: 提供播放声音的接口
- AudioRecord/MediaRecorder: 提供录音的接口
4. 音量大小问题的debug
(1) AudioService.java
把文件前面的 LOGD、DEBUG_MODE、DEBUG_AP、DEBUG_VOL都直接赋值为true;
必要时,把setIndex()里面,把mStreamType 和 device 以及 index 都打印出来。 这样可以查清当前index map里面每一个streamtype和device所对应的index的变化情况;
getDeviceForStream()也需要打印出streamtype 和device。
打出类似这样的log:
24950 10-24 08:58:24.808423 963 3018 D AudioService: Mits getDeviceForStream: stream2 device:2
24952 10-24 08:58:24.810269 963 3018 D AudioService: Mits setIndex IndexMap mStreamType= 2 device:2,index:100
(2) AudioPolicyManager.cpp
将ALOGV 打开, 即去掉前面的 //
//#define LOG_NDEBUG 0
这个文件关键API是: setStreamVolumeIndex(), 这个里面的log一定要打出来,因为它是当前系统用到audiotrack进行mix的音量。
log的样子:
25004 10-24 08:58:24.909459 519 5008 V APM_AudioPolicyManager: setStreamVolumeIndex() stream 8, device 00000008, index 10
5.蓝牙耳机log
图片来自mtk
1), 耳机插入的log:
15632 12-20 09:38:31.613 689 689 D AudioManager: setWiredDeviceConnectionState: type = 8, state = 1, address, name =
15633 12-20 09:38:31.613 689 689 I AudioService: setWiredDeviceConnectionState(1 nm: addr:)
15640 12-20 09:38:31.623 485 3851 D APM_AudioPolicyManager: setDeviceConnectionStateInt() device: 0x8, state 1, address name //device 08表示插入的耳机,蓝牙耳机等,state:1是插入或蓝牙连接,0是拔出或蓝牙断开
2), 蓝牙连接的log:
19551 12-15 04:47:13.349797 1028 1028 I AudioService: setBtScoActiveDevice: null -> 88:C6:26:DA:71:D6
19560 12-15 04:47:13.363570 626 3572 D APM_AudioPolicyManager: setDeviceConnectionStateInt() device: 0x10, state 1, address 88:C6:26:DA:71:D6 name Jaybird X3