audiopolicymanagertest-创建AudioPatch-Mix2Device

提要

audiopolicymanagertest.cpp 中,使用gtest框架。所以执行TEST_F()时,首先会调用AudioPolicyManagerTest::SetUp(),然后在执行TEST_F中的代码块,最后调用AudioPolicyManagerTest::TearDown()

AudioPolicyManagerTest::SetUp()

  1. 创建AudioPolicyManagerTestClient对象。
  2. 创建AudioPolicyTestManager对象。
  3. 设置AudioPolicyTestManager中的音频配置。
  4. 初始化AudioPolicyTestManager。

TEST_F代码块

  • 创建patch
  1. 获取当前patch数量,getActivePatchesCount()AudioPolicyManagerTestClient实现的私有方法,用来测试使用。
  2. 创建patch的source,audiopatch介绍:https://blog.csdn.net/yzhang8703/article/details/47660803
    代码如下:
    patch.num_sources = 1;
    {
       auto& src = patch.sources[0];
       src.role = AUDIO_PORT_ROLE_SOURCE;
       src.type = AUDIO_PORT_TYPE_MIX;
       src.id = mManager->getConfig().getAvailableInputDevices()[0]->getId();
       // Note: these are the parameters of the output device.
       src.sample_rate = 44100;
       src.format = AUDIO_FORMAT_PCM_16_BIT;
       src.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
    }
    
  3. 创建patch的sink,代码如下:
    patch.num_sinks = 1;
    {
       auto& sink = patch.sinks[0];
       sink.role = AUDIO_PORT_ROLE_SINK;
       sink.type = AUDIO_PORT_TYPE_DEVICE;
       sink.id = mManager->getConfig().getDefaultOutputDevice()->getId();
    }
    
  4. 创建audiopatch,并进行断言。
    ASSERT_EQ(NO_ERROR, mManager->createAudioPatch(&patch, &handle, uid));
    ASSERT_NE(AUDIO_PATCH_HANDLE_NONE, handle);
    ASSERT_EQ(patchCountBefore + 1, mClient->getActivePatchesCount());
    
  • 分析
    源端口的patch类型为AUDIO_PORT_TYPE_MIX,代表混音。源端口的设备为AvailableInputDevices,表示patch是听筒或者MIC等输入设备。目的端口的patch类型为AUDIO_PORT_TYPE_DEVICE,表示一个输出设备。因此,创建的audiopatch流向是从输入到输出设备的。
  • audiopatch的创建
  1. audiopatch创建会调用AudioPolicyManager::createAudioPatch方法。总结有以下步骤:
    1. 根据patch中的source.id在mOutputs中查找拥有patch handle的AudioInputDescriptor对象,本文中的对象是一个inputoutput设备。其中mId在open时被初始化。
    2. 遍历当前的patch中的sink,查找到对应的DeviceDescriptor对象,本文中的对象是一个output设备。依次检查当前的AudioInputDescriptor场景是否兼容sink中的DeviceDescriptor。将兼容的DeviceDescriptor添加到DeviceVector中。
    3. 使用新的DeviceDescriptor设备重新设置AudioInputDescriptor
  • setOutputDevice的流程
  1. 检查AudioInputDescriptor是否是复制,如果是,设置复制的AudioInputDescriptor,并返回静音时间。
  2. 通过AudioInputDescriptor支持的设备过滤当前sink中的设备,并保留当前设备。
  3. 静音检查。
  4. 通过相关设备获取patch参数。
  5. 调用audioflinger的交互类来创建audiopatch,本文中的交互类为AudioPolicyManagerTestClient,不涉及audioflinger。最后返回afPatchHandle句柄。
  6. 创建AudioPatch对象,并将AudioPatch句柄和实例添加到mAudioPatches中。设置当前AudioInputDescriptor的mPatchHandle。
  7. 调用 applyStreamVolumes(outputDesc, device, delayMs) 重新打开新的设备声音。

AudioPolicyManagerTest::TearDown()

  1. mManager.reset()
  2. mClient.reset()

你可能感兴趣的:(Android)