比如说.Android平台接入新设备(3.5mm耳机插入,或者蓝牙耳机连接)之后
status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t device,
audio_policy_dev_state_t state,
const char *device_address,
const char *device_name)
{
//从mHwModules中取出连入的设备描述
sp<DeviceDescriptor> devDesc =
mHwModules.getDeviceDescriptor(device, device_address, device_name);
...
switch (state)
{
// handle output device connection
case AUDIO_POLICY_DEVICE_STATE_AVAILABLE: {
checkOutputsForDevice(devDesc, state, outputs, devDesc->mAddress)
}
...
}
有新的设备(外设)接入的时候,我们需要去为Device做checkOutputs
status_t AudioPolicyManager::checkOutputsForDevice(const sp<DeviceDescriptor>& devDesc,
audio_policy_dev_state_t state,
SortedVector<audio_io_handle_t>& outputs,
const String8& address)
{
...
if (state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE) {
...
//先列举出已经打开的能routed到这个device的outputs
//然后查找能routed到此device的output profiles.
//如果需要的话给匹配的profiles打开outputs(已经打开过就啥也不干).
audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
status_t status = mpClientInterface->openOutput(profile->getModuleHandle(),
&output,
&config,
&desc->mDevice,
address,
&desc->mLatency,
desc->mFlags);
...
//不懂具体干嘛的
updateAudioProfiles(device, output, profile->getAudioProfiles());
else if (((desc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) == 0) &&
hasPrimaryOutput()) {
//没有AUDIO_OUTPUT_FLAG_DIRECT标记,而且
//mPrimaryOutput有值
...
// 为新output和primary output打开一个duplicating output thread
duplicatedOutput =
mpClientInterface->openDuplicateOutput(output,
mPrimaryOutput->mIoHandle);
if (duplicatedOutput != AUDIO_IO_HANDLE_NONE) {
//打开成功了
sp<SwAudioOutputDescriptor> dupOutputDesc