SoundCards.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "SoundCards.h"
  2. /* 初始化数据,获取声卡信息 */
  3. bool SoundCardManager::InitData()
  4. {
  5. /* 获取可用的声卡列表 */
  6. // if(AudioDevice::getAudioDevices(m_listAudioDevice))
  7. if(AudioDevice::getPCMAudioDevice(m_listAudioDeviceDesc))
  8. {
  9. SPDLOG_INFO("成功获取到声卡设备信息");
  10. } else
  11. {
  12. SPDLOG_ERROR("获取声卡设备信息失败");
  13. }
  14. /* 将PCM通道根据已知的规则分类 */
  15. classifyPCMChannels();
  16. /* 打印声卡列表 */
  17. // printAudioDevices();
  18. printAudioDeviceDesc(m_mapSoundCardInfo);
  19. // /* 获取并打印另一种声卡信息 */
  20. // std::list<AudioDeviceDesc_t> pcmDevices;
  21. // if(getPCMAudioDevice(pcmDevices))
  22. // {
  23. // SPDLOG_INFO("成功获取到PCM设备信息");
  24. // printAudioDeviceDesc(pcmDevices);
  25. // } else
  26. // {
  27. // SPDLOG_ERROR("获取PCM设备信息失败");
  28. // }
  29. return true;
  30. }
  31. /* 打印声卡列表 */
  32. // void SoundCardManager::printAudioDevices()
  33. // {
  34. // SPDLOG_INFO("声卡列表: ");
  35. // for(const auto& device : m_listAudioDevice)
  36. // {
  37. // SPDLOG_INFO(" 声卡编号: {}, ID: {}, 名称: {}, 驱动: {}",
  38. // device.CardNumber, device.CardID, device.CardName, device.CardDriver);
  39. // SPDLOG_INFO(" 长名称: {}, 混音器名称: {}, 组件信息: {}",
  40. // device.CardLongName, device.CardMixername, device.CardComponents);
  41. // for(const auto& pcmDevice : device.PCMDevices)
  42. // {
  43. // SPDLOG_INFO(" PCM设备编号: {}, 子设备编号: {}, PCM ID: {}, 名称: {}, 子设备名称: {}",
  44. // pcmDevice.PCMDevice, pcmDevice.SubDevice, pcmDevice.CardNumber,
  45. // pcmDevice.PCMID, pcmDevice.PCMName, pcmDevice.PCMSubName);
  46. // }
  47. // }
  48. // }
  49. /* 打印声卡描述列表 */
  50. void SoundCardManager::printAudioDeviceDesc(const std::map<std::string, SoundCardPCMInfo_t>& mapSoundCard)
  51. {
  52. SPDLOG_INFO("----------------------------------------------------------------------------");
  53. for(const auto& device : mapSoundCard)
  54. {
  55. SPDLOG_INFO("声卡名称: {}", device.first);
  56. for(const auto& pcm : device.second.listPCM)
  57. {
  58. SPDLOG_INFO(" PCM设备名称: {}, 设备描述: {}", pcm.strPCMName, pcm.strPCMDesc);
  59. }
  60. SPDLOG_INFO("----------------------------------------------------------------------------");
  61. }
  62. }
  63. /* 将PCM通道分类 */
  64. void SoundCardManager::classifyPCMChannels()
  65. {
  66. std::list<AudioDeviceDesc_t> listPCM = m_listAudioDeviceDesc;
  67. /* 获取Dante声卡的PCM通道信息 */
  68. getDanteSoundCardInfo(listPCM);
  69. /* 分类其他pcm通道 */
  70. classifyRemainingPCMChannels(listPCM);
  71. }
  72. /* 取出dante声卡的PCM通道信息
  73. dante声卡通过设备描述信息识别区分录音通道 */
  74. void SoundCardManager::getDanteSoundCardInfo(std::list<AudioDeviceDesc_t>& listPCM)
  75. {
  76. SoundCardPCMInfo_t scPCMInfo;
  77. scPCMInfo.strSoundCardName = SC_AlpDANTE;
  78. for(auto it = listPCM.begin(); it != listPCM.end(); )
  79. {
  80. const auto& device = *it;
  81. if(device.DeviceDesc.find(SC_AlpDANTE) != std::string::npos)
  82. {
  83. /* 通过描述信息中的“ in” 区分是输入还是输出通道 */
  84. if(device.DeviceDesc.find(" in") != std::string::npos)
  85. {
  86. SPDLOG_DEBUG("Dante声卡输入通道: {}, IOID: {}, 描述: {}",
  87. device.DeviceName, device.IOID, device.DeviceDesc);
  88. OnePCMChannelInfo_t pcm;
  89. pcm.strPCMName = device.DeviceName;
  90. pcm.strPCMDesc = device.DeviceDesc;
  91. pcm.strIO = device.IOID;
  92. scPCMInfo.listPCM.push_back(pcm);
  93. }
  94. else if(device.DeviceDesc.find(" out") != std::string::npos)
  95. {
  96. SPDLOG_DEBUG("Dante声卡输出通道: {}, IOID: {}, 描述: {}",
  97. device.DeviceName, device.IOID, device.DeviceDesc);
  98. } else
  99. {
  100. SPDLOG_DEBUG("Dante声卡未知通道类型: {}, IOID: {}, 描述: {}",
  101. device.DeviceName, device.IOID, device.DeviceDesc);
  102. }
  103. /* 去掉这个pcm信息 */
  104. it = listPCM.erase(it);
  105. } else
  106. {
  107. ++it;
  108. }
  109. }
  110. m_mapSoundCardInfo[scPCMInfo.strSoundCardName] = scPCMInfo;
  111. }
  112. /* 将剩余的PCM通道信息分类
  113. 剩余的通道都放入到systemOther中 */
  114. void SoundCardManager::classifyRemainingPCMChannels(std::list<AudioDeviceDesc_t>& listPCM)
  115. {
  116. SoundCardPCMInfo_t scPCMInfo;
  117. scPCMInfo.strSoundCardName = SC_System;
  118. for(const auto& device : listPCM)
  119. {
  120. OnePCMChannelInfo_t pcm;
  121. pcm.strPCMName = device.DeviceName;
  122. pcm.strPCMDesc = device.DeviceDesc;
  123. pcm.strIO = device.IOID;
  124. scPCMInfo.listPCM.push_back(pcm);
  125. }
  126. m_mapSoundCardInfo[scPCMInfo.strSoundCardName] = scPCMInfo;
  127. }