【问题标题】:What's wrong with this GetDefaultAudioEndpoint program?这个 GetDefaultAudioEndpoint 程序有什么问题?
【发布时间】:2012-03-19 13:58:24
【问题描述】:

这是一个使用该函数的非常简单的程序:

#include <windows.h>
#include <tchar.h>
#include <atlstr.h>
#include <mmdeviceapi.h>
#include <devicetopology.h>
#include <functiondiscoverykeys.h>

#include <iostream>

using namespace std;

int main()
{
    HRESULT hr;
    CComPtr<IMMDeviceEnumerator> pMMDeviceEnumerator;
    pMMDeviceEnumerator->GetDefaultAudioEndpoint(eCapture, eMultimedia, 0);
    //cout << hr;
    return 0;
}

当我尝试运行它时,我收到以下错误:

Debug Assertion Failed!

Program: ...
File: c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcomcli.h
Line: 154

Expression: p!=0

这有什么问题?我现在正在尝试学习如何使用此功能。谢谢!


编辑:

我已将程序更改为:

//#include <windows.h>
//#include <tchar.h>

#include <atlstr.h>
#include <mmdeviceapi.h>
//#include <devicetopology.h>
//#include <functiondiscoverykeys.h>

#include <iostream>

using namespace std;

// helper class to CoInitialize/CoUninitialize
class CCoInitialize {
private:
    HRESULT m_hr;
public:
    CCoInitialize(PVOID pReserved, HRESULT &hr)
        : m_hr(E_UNEXPECTED) { hr = m_hr = CoInitialize(pReserved); }
    ~CCoInitialize() { if (SUCCEEDED(m_hr)) { CoUninitialize(); } }
};

int main()
{


    CComPtr<IMMDeviceEnumerator> pMMDeviceEnumerator;
HRESULT hr = pMMDeviceEnumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator));
if (FAILED(hr)) {
    cout << "failed" << endl;
    return __LINE__;
    }

CCoInitialize ci(NULL, hr);
pMMDeviceEnumerator->GetDefaultAudioEndpoint(eCapture, eMultimedia, 0);
//cout << hr;
return 0;
}

当我运行它时,我得到“失败”的输出。发生了什么事?


编辑:

好的,现在我已经对代码进行了足够多的更改,使其能够一直运行而不会出现任何故障。即,

HRESULT hr = S_OK;  
cout << hr;
// initialize COM
CCoInitialize ci(NULL, hr);
if (FAILED(hr)) {
    cout << "failed1" << endl;
    return __LINE__;
}
cout << hr;
// get enumerator
CComPtr<IMMDeviceEnumerator> pMMDeviceEnumerator;
hr = pMMDeviceEnumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator));
if (FAILED(hr)) {
    cout << "failed2" << endl;
    return __LINE__;
}
cout << hr;
// get default render/capture endpoints
CComPtr<IMMDevice> pRenderEndpoint;
hr = pMMDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pRenderEndpoint);
if (FAILED(hr)) {
    cout << "failed3" << endl;
    return __LINE__;
}

cout << hr;
return 0;

我之前在此示例中遇到的一些问题(请参阅答案中的 cmets)仅通过删除一些代码即可解决。但是当我运行 main() 函数的这个新主体时,我得到了输出“0000”,这意味着 cout 并没有真正调出任何菜单,所以我有点不知所措。谢谢!

【问题讨论】:

    标签: c++ visual-c++ audio visual-studio-2005 wasapi


    【解决方案1】:

    pMMDeviceEnumerator 变量持有一个指针,即NULL。当您尝试在此指针上调用接口方法时,-&gt; 运算符会检查此空值并发出断言失败。

    Windows SDK 示例展示了如何使用此函数和 API,请在以下位置查看它们:\Samples\multimedia\audio,例如osd 示例。

    此示例是一个基于 Win32 的应用程序,它演示了使用 Vista API 来监视默认音频输出设备和 其当前的音量设置。该示例是用 C++ 编写的。

    OSD在早期版本的 Windows 上运行,包括 Windows XP、Windows 2000、Windows Me 和 Windows 98。

    UPD:main 中的内容需要到达 GetDefaultAudioEndpoint API 调用 - Sample: find out if your default audio playback and audio capture devices are on the same hardware

    【讨论】:

    • 我没有那个文件夹。是否只有几行代码可以快速更改以使其工作?
    • 检查一下:blogs.msdn.com/b/matthew_van_eerde/archive/2008/06/13/… 这是一个小代码 sn-p,它包含您想要的 GetDefaultAudioEndpoint 调用上方的 main 中的所有内容。
    • 不幸的是,在尝试构建他的项目时,我在 atlbase.h 中遇到错误。 'CLSID_StdGlobalInterfaceTable' : 未声明的标识符 c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlbase.h 2782
    • 看看他在用pMMDeviceEnumerator做什么,尤其是CoInitializeCoCreateInstance电话。
    • hr 表示方法调用成功。您的 pRenderEndpoint 包含一个指针,您可以通过该指针继续实际枚举。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多