2017-02-28 10 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"というメッセージを受け取りました。だから私はなぜ問題が起きたのか分からない。

ありがとうございました!

参考:ウィンドウズメディアFoundationの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」クラスの静的メソッドで、いつでも呼び出すことができます。

関連する問題