setDeviceConnectionState 详细过程

AudioPolicyManagerALSA.cpp


status_t AudioPolicyManager::setDeviceConnectionState(audio_devices_t device,
                                                  AudioSystem::device_connection_state state,
                                                  const char *device_address)

1.参数说明

audio_devices_t :要连接的设备号 常见 AUDIO_DEVICE_OUT_SPEAKER  = 0x2  AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8

AudioSystem::device_connection_state:

    enum device_connection_state {
        DEVICE_STATE_UNAVAILABLE,    
        DEVICE_STATE_AVAILABLE,
        NUM_DEVICE_STATES
    };
DEVICE_STATE_UNAVAILABLE = 0;

DEVICE_STATE_AVAILABLE = 1

const char *device_address:usb 蓝牙 使用

2.流程:

2.1 一次只能连接一个设备

2.2 分为输入输出设备

   2.2.1 输出设备

       2.2.1.1  checkOutputsForDevice(device, state, outputs) != NO_ERROR: 找出所有支持device的output . 本例子中output是2和3。

      2.2.1.2  mpClientInterface->setParameters(0, String8(WIREDACCESSORY_TYPE_HEADPHONE));    --->AudioFlinger::setParameters

           --->dev->set_parameters(dev, keyValuePairs.string()); 

                                     疑问会调用两次,但是第二次没有调用AudioHardwareALSA::setParameters   

           --->alsa_sound/audio_hw_hal.cpp" :  static int adev_set_parameters

           ---->AudioHardwareALSA::setParameters    设置 mDevSettingsFlag |= WIRED_ACCESSORY_HEADPHONE;

            mDevSettingsFlag 标志在ALSADevice.cpp中会判断这个标志。 

        一共有两个设备:

                    2433 I(  269:  269) loadHwModule() Loaded primary audio interface from QCOM Audio HW HAL (audio) handle 1

                    3015 I(  269:  269) loadHwModule() Loaded r_submix audio interface from Wifi Display audio HAL (audio) handle 4    

        这个两设备有不同的set_parameters实现。主要是自己还是没有理解代码的用意,很容易跑偏。

         hardware/libhardware/modules/audio_remote_submix/audio_hw.cpp

         static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
         {
             return -ENOSYS;
         }
         r_submix什么都没有做。
       

        

                              

     2.2.1.3  AudioPolicyManagerBase::checkOutputForAllStrategies();----------> checkOutputForStrategy();

                   功能是策略对应的output是否有变化。本例中没有变化。


       2.2.1.4  updateDevicesAndOutputs();每一种策略都选出一种设备,存到mDeviceForStrategy。

                   ------>mDeviceForStrategy[i] = getDeviceForStrategy((routing_strategy)i, false /*fromCache*/);

       2.2.1.5  getNewDevice(mOutputs.keyAt(i), true /*fromCache*/)  根据策略优先级别,选择策略。

                 -----> AudioPolicyManager::getDeviceForStrategy() 根据策略,选择设备

      2.2.1.5  setOutputDevice 调用两次.第一次:参数output=2 device=8 第二次:参数output=3 device=0

                 ------> alsa_sound/ALSADevice.cpp            void ALSADevice::switchDevice

                                          

                         

          2.2.2 输入设备   

             







你可能感兴趣的:(setDeviceConnectionState 详细过程)