2014-09-18 27 views
1

현재 나의 주요 목표는 모든 로컬 컴퓨터의 Audio Endpoint Devices에 대한 자세한 정보를 얻는 것입니다. 이것이 오디오 주변 장치를 나타내는 객체입니다. 나는 어떤 논리에 기초하여 기록 할 장치를 선택할 수 있기를 원한다. (또는 결국 수동으로 그렇게 할 수있다.)Windows 오디오 끝점 API. 내 오디오 장치 이름 얻기

내가 지금까지 가지고있는 것이있다. 나는 C++에 익숙하지 않기 때문에 이러한 모든 추상 클래스를 다루는 것이 조금 까다 롭습니다. 따라서 코드 품질에 대해서도 자유롭게 의견을 말하십시오. http://msdn.microsoft.com/en-us/library/windows/desktop/dd371414(v=vs.85).aspx 이는 IMMDevice이 장치의 컬렉션을 포함 할 것으로 보인다 반면, 하나의 오디오 엔드 포인트 장치를 나타낼 것으로 예상되는 유형입니다 : 현재

//Create vector of IMMDevices 
UINT endpointCount = NULL; 
(*pCollection).GetCount(&endpointCount); 
std::vector<IMMDevice**> IMMDevicePP; //IMMDevice seems to contain all endpoint devices, so why have a collection here? 
for (UINT i = 0; i < (endpointCount); i++) 
{ 
IMMDevice* pp = NULL; 
(*pCollection).Item(i, &pp); 
IMMDevicePP.assign(1, &pp); 
} 

내 기술적 인 목표는이 인터페이스를 구현하는 객체를 얻는 것입니다. 그러나 IMMEndpoint에만 GetDataFlow라는 메서드가 포함되어 있으므로 도움이 될지 확실하지 않습니다. 다시 말하지만 오디오를 녹음하고 스트리밍 할 엔드 포인트 장치를 쉽게 선택하는 것이 목표입니다.

제안 사항? 잘못된 API를 사용하고 있습니까? 이 API는 실제로 오디오의 실제 스트리밍 및 샘플링에 좋은 명령을 가지고 있지만 원하는 장치를 사용하고 있는지 확인하는 방법에 대해서는 약간 분실되어 있습니다.

답변

1

는 장치에 대한 IPropertyStore 정보를 검색 할 수있는 필수입니다 말했다.이 문서에 따라 다음

PROPVARIANT propVari; 
HRESULT propVariResult = (*IMMDeviceProperties[i]).GetValue(key, &propVari); 

PROPERTYKEY key; 
HRESULT keyResult = (*IMMDeviceProperties[i]).GetAt(p, &key); 

:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb761471(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa380072(v=vs.85).aspx

을 마지막으로 큰 PROPVARIANT를 탐색 거기에서 당신은 같은 PROPVARIANT 객체를 추출 오디오 전자의 친숙한 이름을 얻기위한 구조 여기에 그림과 같이 ndpoint 장치는 단순히 PROPVARIANT 구조의 pwszVal 멤버에 액세스 :

http://msdn.microsoft.com/en-us/library/windows/desktop/dd316594(v=vs.85).aspx

모든 권리 문서를 찾는 것에 대해!

3

WASAPI를 사용하면 올바른 API를 사용하기 위해 필요한 것을 수행 할 수 있습니다. 그래도 IMMDevice는 오디오 장치 모음을 나타내는 IMMDeviceCollection이라고 오인됩니다. IMMDevice는 단일 오디오 장치를 나타냅니다. "장치"로, WASAPI는 오디오 카드를 의미하지는 않습니다. 오히려 그러한 카드의 단일 입출력을 의미합니다. 예를 들어 아날로그 입/출력 + 디지털 출력이있는 오디오 카드는 각각 자신의 IMMEndpoint가있는 3 개의 IMM 장치로 표시됩니다. 나는 당신이 뭘했는지 확실하지 않지만 IMMDevice가 필요한 모든 것을 제공 할 것 같습니다. 기본적으로, 당신이 그런 짓을 할 것이다 :

  • , 렌더링 캡처 또는 둘 모두를 지정
  • 통화 EnumAudioEndpoints가 IMMDeviceCollection
  • 에 열거하는 IMMDeviceEnumerator
  • IMMDeviceCollection
  • 에서 개별 IMMDevice 인스턴스를 가져옵니다 만들기 장치 이름과 설명은 OpenPropertyStore ( http://msdn.microsoft.com/en-us/library/windows/desktop/dd370812%28v=vs.85%29.aspx)를 사용하여 IMMDevice에서 쿼리 할 수 ​​있습니다. 지원되는 추가 장치 세부 정보는 http://msdn.microsoft.com/en-us/library/windows/desktop/dd370794%28v=vs.85%29.aspx에서 확인할 수 있습니다.
  • IMMDeviceCollection에서 가져온 IMMDevice 인스턴스도 IMMEndpoint의 인스턴스가되며 QueryInterface를 사용하여이 둘 사이를 전환 할 수 있습니다. 그러나, 당신이 지적한대로, 이것은 당신이 렌더링 또는 캡처 장치에 손을 가지고있는 경우에만 알려줄 것입니다. EnumAudioEndpoints에서 원하는 것을 직접 물어 보는 것이 훨씬 쉽습니다.
  • 코드 품질 정보 : (* x) .f() 인 경우 x-> f()를 사용하십시오. 기술적으로 똑같지 만 -> 연산자는 객체 포인터를 통해 함수를 호출하는 일반적인 방법입니다.
  • vector :: assign을 사용하지 마십시오. 각 호출에서 전체 벡터의 내용을 바꿉니다. 따라서 사용 가능한 장치의 수에 관계없이 크기 1의 모음으로 끝납니다. 대신에 push_back을 사용하십시오. Sjoerd로 IMMDevices을 열거 한 후
+0

저는 각 IMMDEVICE에 대해 유형을 'PROPVARIANT'로 좁혔습니다. 그러나 이제는이 거대한 구조를 탐색하여 내 장치에 유용한 것을 찾는 방법을 모르겠습니다. 이 문서는 다음과 같습니다. http://msdn.microsoft.com/en-us/library/windows/desktop/aa380072(v=vs.85).aspx PROPVARIANT의 모든 구성원의 의미에 대해 나에게 계몽 할 수 있습니까? ? – gordlonious