2017-02-28 5 views
1

Microsoft MSDN에서 제공하는 자습서를 사용하여 오디오 장치를 열거했습니다.Windows Media Foundation 오디오 장치 열거

여기에 열거 코드 :

HRESULT CreateAudioDeviceSource(IMFMediaSource **ppSource) 
{ 
    *ppSource = NULL; 

    IMFMediaSource *pSource = NULL; 
    IMFAttributes *pAttributes = NULL; 
    IMFActivate **ppDevices = NULL; 

    // Create an attribute store to specify the enumeration parameters. 
    HRESULT hr = MFCreateAttributes(&pAttributes, 1); 
    if (FAILED(hr)) 
    { 
     goto done; 
    } 

    // Source type: audio capture devices 
    hr = pAttributes->SetGUID(
     MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, 
     MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID 
     ); 
    if (FAILED(hr)) 
    { 
     goto done; 
    } 

    // Enumerate devices. 
    UINT32 count; 
    hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count); 

    std::cout << count; 



    if (FAILED(hr)) 
    { 
     std::cout << "Enum Failed"; 
     goto done; 
    } 

    if (count == 0) 
    { 
     std::cout << "empty"; 
     hr = E_FAIL; 
     goto done; 
    } 

    // Create the media source object. 
    hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(&pSource)); 
    if (FAILED(hr)) 
    { 
     goto done; 
    } 


    *ppSource = pSource; 
    (*ppSource)->AddRef(); 

done: 
    SafeRelease(&pAttributes); 

    for (DWORD i = 0; i < count; i++) 
    { 
     SafeRelease(&ppDevices[i]); 
    } 
    CoTaskMemFree(ppDevices); 
    SafeRelease(&pSource); 
    return hr; 
} 

그러나 나는 장치를 열거하는 함수를 호출하지 못했습니다. 메시지 "Enum Failed"가 나타납니다. 그래서 나는 왜 그 문제가 일어 났는지 모른다.

정말 고마워요!

참조 : 윈도우 미디어 재단 https://msdn.microsoft.com/en-us/library/dd317912(v=vs.85).aspx

+1

이 튜토리얼 조각을 ['MFStartup'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms702238) 및'MFShutdown' 호출로 둘러 쌀 필요가 있다고 가정합니다. 실패를보고하면 'hr'코드의 값도 포함시켜야합니다. –

+0

나는 귀하의 조언을 시도합니다. 정말 고맙습니다. – bcuzit

답변

1

샘플 코드는 오디오 장치를 열거 장치 캡처 struct

struct CaptureDeviceParam 
{ 
    /// <summary> 
    /// The array of devices. 
    /// </summary> 
    IMFActivate **ppDevices; 
    /// <summary> 
    /// Device count. 
    /// </summary> 
    UINT32  count; 
    /// <summary> 
    /// Device selection. 
    /// </summary> 
    UINT32  selection; 
}; 

그리고 enum 장치 방법.

 /// <summary> 
     /// Get the audio capture devices. 
     /// </summary> 
     /// <param name="param">The capture device param.</param> 
     void MediaCapture::GetAudioCaptureDevices(CaptureDeviceParam *param) 
     { 
      HRESULT hr = S_OK; 
      IMFAttributes *pAttributes = NULL; 

      // Initialize an attribute store to specify enumeration parameters. 
      hr = MFCreateAttributes(&pAttributes, 1); 

      // Ask for source type = audio capture devices 
      if (SUCCEEDED(hr)) 
      { 
       // Set the device attribute. 
       hr = pAttributes->SetGUID(
        MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, 
        MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID 
       ); 
      } 

      // Enumerate devices. 
      if (SUCCEEDED(hr)) 
      { 
       // Enumerate the device list. 
       hr = MFEnumDeviceSources(pAttributes, &(*param).ppDevices, &(*param).count); 
      } 

      // Safe release. 
      SafeRelease(&pAttributes); 
     } 

GetAudioCaptureDevices은 'MediaCapture'클래스의 정적 메서드이며 언제든지 호출 할 수 있습니다.