// device is DEVICE_OUT_SPEAKER if we come from case STRATEGY_SONIFICATION or // STRATEGY_ENFORCED_AUDIBLE, AUDIO_DEVICE_NONE otherwise devices.add(devices2); // If hdmi system audio mode is on, remove speaker out of output list. if ((strategy == STRATEGY_MEDIA) && (getForceUse(AUDIO_POLICY_FORCE_FOR_HDMI_SYSTEM_AUDIO) == AUDIO_POLICY_FORCE_HDMI_SYSTEM_AUDIO_ENFORCED)) { devices.add(availableOutputDevices.getDevicesFromTypes(AUDIO_DEVICE_OUT_AUX_DIGITAL)); devices.add(availableOutputDevices.getDevicesFromTypes(AUDIO_DEVICE_OUT_HDMI_1)); devices.remove(devices.getDevicesFromType(AUDIO_DEVICE_OUT_SPEAKER)); }
时间: 2024-04-25 18:27:00 浏览: 133
这是 Android 系统中的音频管理代码,用于根据不同的音频场景(如铃声、媒体播放等)选择合适的音频输出设备。
首先,代码根据不同的场景(如铃声、强制播放等)来确定输出设备,如果是铃声或强制播放,则输出设备为扬声器(DEVICE_OUT_SPEAKER),否则为无设备(AUDIO_DEVICE_NONE)。
接下来,如果开启了 HDMI 系统音频模式,那么就从输出设备列表中移除扬声器输出设备,并添加 HDMI 输出设备(包括 AUX 数字音频和 HDMI 1)。
最后,代码返回选择好的音频设备列表。
相关问题
bool ringActiveLocally = outputs.isActiveLocally(toVolumeSource(AUDIO_STREAM_RING), 0); // - for STRATEGY_SONIFICATION and ringtone active: // if SPEAKER was selected, and SPEAKER_SAFE is available, use SPEAKER_SAFE instead // - for STRATEGY_SONIFICATION_RESPECTFUL: // if no media is playing on the device, check for mandatory use of "safe" speaker // when media would have played on speaker, and the safe speaker path is available if (strategy == STRATEGY_SONIFICATION || ringActiveLocally || (strategy == STRATEGY_SONIFICATION_RESPECTFUL && !mediaActiveLocally)) { devices.replaceDevicesByType( AUDIO_DEVICE_OUT_SPEAKER, availableOutputDevices.getDevicesFromType( AUDIO_DEVICE_OUT_SPEAKER_SAFE)); } } break; case STRATEGY_CALL_ASSISTANT: devices = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_TELEPHONY_TX); break; case STRATEGY_NONE: // Happens when internal strategies are processed ("rerouting", "patch"...) break; default: ALOGW("%s unknown strategy: %d", __func__, strategy); break;
这段代码是关于选择输出设备的具体实现。首先,代码会根据当前的策略类型(`strategy`)和铃声是否正在播放(`ringActiveLocally`),选择是否要使用“safe”扬声器。如果当前策略是`STRATEGY_SONIFICATION`或者铃声正在播放,那么会尝试使用“safe”扬声器来输出声音,这是为了避免铃声等声音过大,导致设备损坏。其次,如果当前策略是`STRATEGY_SONIFICATION_RESPECTFUL`,并且没有其他媒体正在播放,那么也会尝试使用“safe”扬声器来输出声音。最后,根据不同的策略类型,会选择不同的输出设备。如果当前策略是`STRATEGY_CALL_ASSISTANT`,则会选择电话扬声器(`AUDIO_DEVICE_OUT_TELEPHONY_TX`),如果是`STRATEGY_NONE`,则不需要进行任何操作。如果策略类型不是以上任何一种,则会输出一个警告信息。
if ((devices2.isEmpty()) && (strategy != STRATEGY_SONIFICATION)) { // no sonification on aux digital (e.g. HDMI) devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_AUX_DIGITAL); } //priority Wired > a2dp > hdmi > hdmi 1 > spdif > spdif 1 if ((devices2.isEmpty()) && (strategy != STRATEGY_SONIFICATION)) { devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_HDMI_1); } if ((devices2.isEmpty()) && (strategy != STRATEGY_SONIFICATION)) { devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_SPDIF); } if ((devices2.isEmpty()) && (strategy != STRATEGY_SONIFICATION)) { devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_SPDIF_1); } if ((devices2.isEmpty()) && (getForceUse(AUDIO_POLICY_FORCE_FOR_DOCK) == AUDIO_POLICY_FORCE_ANALOG_DOCK)) { devices2 = availableOutputDevices.getDevicesFromType( AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET); } if (devices2.isEmpty()) { devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_SPEAKER); }
这段代码是关于Android平台上的音频输出设备选择的代码。首先判断是否有可用的输出设备,并且当前的策略不是声音提示(sonification)。如果没有可用设备,则按照优先级选择不同类型的设备,包括有线耳机、蓝牙A2DP、HDMI、SPDIF、模拟音频接口等。如果强制使用音频扬声器的话,则使用音频扬声器作为输出设备。
阅读全文