添加音频管理
This commit is contained in:
parent
86aa9f9905
commit
92bcf845bc
7
WinDevice/Audio/AudioEnum.h
Normal file
7
WinDevice/Audio/AudioEnum.h
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
enum AudioDeviceType
|
||||||
|
{
|
||||||
|
Render,
|
||||||
|
Capture
|
||||||
|
};
|
110
WinDevice/Audio/AudioManager.cpp
Normal file
110
WinDevice/Audio/AudioManager.cpp
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "AudioManager.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
AudioManager::AudioManager()
|
||||||
|
{
|
||||||
|
// 创建设备枚举器
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioManager::~AudioManager()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT AudioManager::Init()
|
||||||
|
{
|
||||||
|
HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), reinterpret_cast<void**>(&pEnumerator));
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
std::cerr << "Error: CoCreateInstance failed with hr = " << hr << std::endl;
|
||||||
|
}
|
||||||
|
hr = _UpdateDeviceList(eCapture);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
std::cerr << "Error: Update Capture Device failed with hr = " << hr << std::endl;
|
||||||
|
}
|
||||||
|
hr = _UpdateDeviceList(eRender);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
std::cerr << "Error: Update Render Device failed with hr = " << hr << std::endl;
|
||||||
|
}
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT AudioManager::Uninit()
|
||||||
|
{
|
||||||
|
pEnumerator = nullptr;
|
||||||
|
pCaptureCollection = nullptr;
|
||||||
|
pRenderCollection = nullptr;
|
||||||
|
pDefaultCaptureEndpoint = nullptr;
|
||||||
|
pDefaultRenderEndpoint = nullptr;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMMDeviceCollection* AudioManager::GetDeviceList(EDataFlow flow)
|
||||||
|
{
|
||||||
|
if (flow == eCapture)
|
||||||
|
{
|
||||||
|
UINT count;
|
||||||
|
pCaptureCollection->GetCount(&count);
|
||||||
|
if (count == 0)
|
||||||
|
{
|
||||||
|
_UpdateDeviceList(eCapture);
|
||||||
|
}
|
||||||
|
return pCaptureCollection;
|
||||||
|
}
|
||||||
|
if (flow == eRender)
|
||||||
|
{
|
||||||
|
UINT count;
|
||||||
|
pRenderCollection->GetCount(&count);
|
||||||
|
if (count == 0)
|
||||||
|
{
|
||||||
|
_UpdateDeviceList(eRender);
|
||||||
|
}
|
||||||
|
return pRenderCollection;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMMDevice* AudioManager::GetDefaultDevice(EDataFlow flow)
|
||||||
|
{
|
||||||
|
if (flow == eCapture)
|
||||||
|
{
|
||||||
|
return pDefaultCaptureEndpoint;
|
||||||
|
}
|
||||||
|
if (flow == eRender)
|
||||||
|
{
|
||||||
|
return pDefaultRenderEndpoint;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT AudioManager::_UpdateDeviceList(EDataFlow flow)
|
||||||
|
{
|
||||||
|
HRESULT hr = S_OK;
|
||||||
|
if (flow == eCapture)
|
||||||
|
{
|
||||||
|
hr = pEnumerator->EnumAudioEndpoints(eCapture, DEVICE_STATE_ACTIVE, &pCaptureCollection);
|
||||||
|
}
|
||||||
|
if (flow == eRender)
|
||||||
|
{
|
||||||
|
hr = pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pRenderCollection);
|
||||||
|
}
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT AudioManager::_UpdateDefaultDevice(EDataFlow flow)
|
||||||
|
{
|
||||||
|
HRESULT hr = S_OK;
|
||||||
|
if (flow == eCapture)
|
||||||
|
{
|
||||||
|
hr = pEnumerator->GetDefaultAudioEndpoint(eCapture, eConsole, &pDefaultCaptureEndpoint);
|
||||||
|
}
|
||||||
|
if (flow == eRender)
|
||||||
|
{
|
||||||
|
hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDefaultRenderEndpoint);
|
||||||
|
}
|
||||||
|
return hr;
|
||||||
|
}
|
26
WinDevice/Audio/AudioManager.h
Normal file
26
WinDevice/Audio/AudioManager.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Mmdeviceapi.h>
|
||||||
|
|
||||||
|
class AudioManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AudioManager();
|
||||||
|
~AudioManager();
|
||||||
|
|
||||||
|
HRESULT Init();
|
||||||
|
HRESULT Uninit();
|
||||||
|
|
||||||
|
IMMDeviceCollection* GetDeviceList(EDataFlow flow);
|
||||||
|
IMMDevice* GetDefaultDevice(EDataFlow flow);
|
||||||
|
|
||||||
|
private:
|
||||||
|
IMMDeviceEnumerator* pEnumerator = NULL;
|
||||||
|
IMMDeviceCollection* pRenderCollection = NULL;
|
||||||
|
IMMDeviceCollection* pCaptureCollection = NULL;
|
||||||
|
IMMDevice* pDefaultRenderEndpoint = NULL;
|
||||||
|
IMMDevice* pDefaultCaptureEndpoint = NULL;
|
||||||
|
|
||||||
|
HRESULT _UpdateDeviceList(EDataFlow flow);
|
||||||
|
HRESULT _UpdateDefaultDevice(EDataFlow flow);
|
||||||
|
};
|
41
WinDevice/Utils/SysInfoUtil.cpp
Normal file
41
WinDevice/Utils/SysInfoUtil.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#include <stdafx.h>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <iphlpapi.h>
|
||||||
|
|
||||||
|
#include "SysInfoUtil.h"
|
||||||
|
|
||||||
|
void SysInfoUtil::GetMacByGetAdaptersInfo(char* outMAC) const
|
||||||
|
{
|
||||||
|
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
|
||||||
|
PIP_ADAPTER_INFO pAdapter = NULL;
|
||||||
|
PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
|
||||||
|
|
||||||
|
// Make an initial call to GetAdaptersInfo to get the necessary size into the ulOutBufLen variable
|
||||||
|
if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
free(pAdapterInfo);
|
||||||
|
pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
//char MACAddress[32];
|
||||||
|
if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == NO_ERROR)
|
||||||
|
{
|
||||||
|
pAdapter = pAdapterInfo;
|
||||||
|
while (pAdapter)
|
||||||
|
{
|
||||||
|
if (pAdapter->AddressLength == 6 && pAdapter->Type == MIB_IF_TYPE_ETHERNET)
|
||||||
|
{
|
||||||
|
sprintf_s(outMAC, 18, "%02X-%02X-%02X-%02X-%02X-%02X",
|
||||||
|
int(pAdapter->Address[0]),
|
||||||
|
int(pAdapter->Address[1]),
|
||||||
|
int(pAdapter->Address[2]),
|
||||||
|
int(pAdapter->Address[3]),
|
||||||
|
int(pAdapter->Address[4]),
|
||||||
|
int(pAdapter->Address[5]));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pAdapter = pAdapter->Next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(pAdapterInfo);
|
||||||
|
}
|
9
WinDevice/Utils/SysInfoUtil.h
Normal file
9
WinDevice/Utils/SysInfoUtil.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#pragma comment(lib, "IPHLPAPI.lib")
|
||||||
|
|
||||||
|
class SysInfoUtil
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void GetMacByGetAdaptersInfo(char* outMAC) const;
|
||||||
|
};
|
@ -1,11 +1,26 @@
|
|||||||
// WinDevice.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
|
// WinDevice.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "Utils/SysInfoUtil.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
std::cout << "Hello World!\n";
|
SysInfoUtil util;
|
||||||
|
char mac[18];
|
||||||
|
|
||||||
|
// 测量函数调用的耗时
|
||||||
|
auto start = chrono::high_resolution_clock::now();
|
||||||
|
util.GetMacByGetAdaptersInfo(mac);
|
||||||
|
auto end = chrono::high_resolution_clock::now();
|
||||||
|
auto duration = chrono::duration_cast<chrono::milliseconds>(end - start);
|
||||||
|
cout << "Function call duration: " << duration.count() << " ms" << endl;
|
||||||
|
|
||||||
|
// 输出日志信息
|
||||||
|
cout << "MAC address: " << mac << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
|
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
|
||||||
|
@ -88,6 +88,7 @@
|
|||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<AdditionalIncludeDirectories>.;</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -102,6 +103,7 @@
|
|||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<AdditionalIncludeDirectories>.;</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -116,6 +118,7 @@
|
|||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<AdditionalIncludeDirectories>.;</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -130,6 +133,7 @@
|
|||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<AdditionalIncludeDirectories>.;</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -139,8 +143,16 @@
|
|||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="Audio\AudioManager.cpp" />
|
||||||
|
<ClCompile Include="Utils\SysInfoUtil.cpp" />
|
||||||
<ClCompile Include="WinDevice.cpp" />
|
<ClCompile Include="WinDevice.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="Audio\AudioEnum.h" />
|
||||||
|
<ClInclude Include="Audio\AudioManager.h" />
|
||||||
|
<ClInclude Include="stdafx.h" />
|
||||||
|
<ClInclude Include="Utils\SysInfoUtil.h" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
8
WinDevice/stdafx.h
Normal file
8
WinDevice/stdafx.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winerror.h>
|
||||||
|
#include <shlwapi.h>
|
||||||
|
#include <Psapi.h>
|
||||||
|
#include <Shellapi.h>
|
Loading…
Reference in New Issue
Block a user