#include "SoundCards.h" /* 初始化数据,获取声卡信息 */ bool SoundCardManager::InitData() { /* 获取可用的声卡列表 */ // if(AudioDevice::getAudioDevices(m_listAudioDevice)) if(AudioDevice::getPCMAudioDevice(m_listAudioDeviceDesc)) { SPDLOG_INFO("成功获取到声卡设备信息"); } else { SPDLOG_ERROR("获取声卡设备信息失败"); } /* 将PCM通道根据已知的规则分类 */ classifyPCMChannels(); /* 打印声卡列表 */ // printAudioDevices(); printAudioDeviceDesc(m_mapSoundCardInfo); // /* 获取并打印另一种声卡信息 */ // std::list pcmDevices; // if(getPCMAudioDevice(pcmDevices)) // { // SPDLOG_INFO("成功获取到PCM设备信息"); // printAudioDeviceDesc(pcmDevices); // } else // { // SPDLOG_ERROR("获取PCM设备信息失败"); // } return true; } /* 打印声卡列表 */ // void SoundCardManager::printAudioDevices() // { // SPDLOG_INFO("声卡列表: "); // for(const auto& device : m_listAudioDevice) // { // SPDLOG_INFO(" 声卡编号: {}, ID: {}, 名称: {}, 驱动: {}", // device.CardNumber, device.CardID, device.CardName, device.CardDriver); // SPDLOG_INFO(" 长名称: {}, 混音器名称: {}, 组件信息: {}", // device.CardLongName, device.CardMixername, device.CardComponents); // for(const auto& pcmDevice : device.PCMDevices) // { // SPDLOG_INFO(" PCM设备编号: {}, 子设备编号: {}, PCM ID: {}, 名称: {}, 子设备名称: {}", // pcmDevice.PCMDevice, pcmDevice.SubDevice, pcmDevice.CardNumber, // pcmDevice.PCMID, pcmDevice.PCMName, pcmDevice.PCMSubName); // } // } // } /* 打印声卡描述列表 */ void SoundCardManager::printAudioDeviceDesc(const std::map& mapSoundCard) { SPDLOG_INFO("----------------------------------------------------------------------------"); for(const auto& device : mapSoundCard) { SPDLOG_INFO("声卡名称: {}", device.first); for(const auto& pcm : device.second.listPCM) { SPDLOG_INFO(" PCM设备名称: {}, 设备描述: {}", pcm.strPCMName, pcm.strPCMDesc); } SPDLOG_INFO("----------------------------------------------------------------------------"); } } /* 将PCM通道分类 */ void SoundCardManager::classifyPCMChannels() { std::list listPCM = m_listAudioDeviceDesc; /* 获取Dante声卡的PCM通道信息 */ getDanteSoundCardInfo(listPCM); /* 分类其他pcm通道 */ classifyRemainingPCMChannels(listPCM); } /* 取出dante声卡的PCM通道信息 dante声卡通过设备描述信息识别区分录音通道 */ void SoundCardManager::getDanteSoundCardInfo(std::list& listPCM) { SoundCardPCMInfo_t scPCMInfo; scPCMInfo.strSoundCardName = SC_AlpDANTE; for(auto it = listPCM.begin(); it != listPCM.end(); ) { const auto& device = *it; if(device.DeviceDesc.find(SC_AlpDANTE) != std::string::npos) { /* 通过描述信息中的“ in” 区分是输入还是输出通道 */ if(device.DeviceDesc.find(" in") != std::string::npos) { SPDLOG_DEBUG("Dante声卡输入通道: {}, IOID: {}, 描述: {}", device.DeviceName, device.IOID, device.DeviceDesc); OnePCMChannelInfo_t pcm; pcm.strPCMName = device.DeviceName; pcm.strPCMDesc = device.DeviceDesc; pcm.strIO = device.IOID; scPCMInfo.listPCM.push_back(pcm); } else if(device.DeviceDesc.find(" out") != std::string::npos) { SPDLOG_DEBUG("Dante声卡输出通道: {}, IOID: {}, 描述: {}", device.DeviceName, device.IOID, device.DeviceDesc); } else { SPDLOG_DEBUG("Dante声卡未知通道类型: {}, IOID: {}, 描述: {}", device.DeviceName, device.IOID, device.DeviceDesc); } /* 去掉这个pcm信息 */ it = listPCM.erase(it); } else { ++it; } } m_mapSoundCardInfo[scPCMInfo.strSoundCardName] = scPCMInfo; } /* 将剩余的PCM通道信息分类 剩余的通道都放入到systemOther中 */ void SoundCardManager::classifyRemainingPCMChannels(std::list& listPCM) { SoundCardPCMInfo_t scPCMInfo; scPCMInfo.strSoundCardName = SC_System; for(const auto& device : listPCM) { OnePCMChannelInfo_t pcm; pcm.strPCMName = device.DeviceName; pcm.strPCMDesc = device.DeviceDesc; pcm.strIO = device.IOID; scPCMInfo.listPCM.push_back(pcm); } m_mapSoundCardInfo[scPCMInfo.strSoundCardName] = scPCMInfo; }