【问题标题】:Problems using Windows Core Audio APIs使用 Windows 核心音频 API 的问题
【发布时间】:2011-08-28 18:25:15
【问题描述】:

我一直在尝试让一个使用 Windows 音频 API 的程序正常工作。 最终结果将是一个检查其他音频过程中音量变化的程序。 我查看了 Microsoft 网站上的一些示例,并且对我应该做的事情有所了解。 但是,当我尝试实现这一点时,我会遇到一些错误。我首先尝试获取所有正在运行的音频进程的列表,实际上只是每分钟的计数。 我使用的代码基于 Windows 站点上的代码,但是当我尝试构建它时出现错误。主要有两个:

  1. 'IAudioSessionManager2':没有 GUID 与此对象关联
  2. 使用未定义类型“IAudioSessionManager2”

第二个也有类似的,但与 IAudioSessionEnumerator 相关。

我对 C++ 编程很陌生,更习惯于 Java,所以我认为这只是与头文件或其他东西有关的一些愚蠢的小错误,我在下面包含了 .h 代码和 .cpp 代码. 如果有人能帮助我,将不胜感激。

GetProcess.h

#ifndef GETPROCESS_H
#define GETPROCESS_H
#define SAFE_RELEASE(p) { if ( (p) ) { (p)->Release(); (p) = 0; } }

#include<Audiopolicy.h>
#include<Mmdeviceapi.h>
#include <stdio.h>
#include <iostream>

using namespace std; 
struct IAudioSessionManager2;
struct IAudioSessionEnumerator;
struct IAudioSessionControl;
struct IMMDevice;
struct IMMDeviceEnumerator;

ref class GetProcess
{
public:
    GetProcess();
};
#endif

GetProcess.cpp

#include "StdAfx.h"
#include "GetProcess.h"
#include<Audiopolicy.h>
#include<Mmdeviceapi.h>
#include <stdio.h>
#include <iostream>
#include <windows.h>


GetProcess::GetProcess()
{
    IMMDeviceEnumerator* deviceEnumerator = NULL;
    IMMDevice* device = NULL;
    IAudioSessionManager2* sessionManager = NULL;
    IAudioSessionEnumerator* sessionEnumerator = NULL;
    IAudioSessionControl* session = NULL;


    int numberOfProcesses = 0;
    int numberOfActiveProcesses = 0;

    AudioSessionState state;

    //create device enumerator
    CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&deviceEnumerator);
    // get default device
    deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &device);

    // activate session manager
    device->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**)&sessionManager);
    //// make enum
    sessionManager->GetSessionEnumerator(&sessionEnumerator);
    sessionEnumerator ->GetCount(&numberOfProcesses);
    for (int i = 0; i < numberOfProcesses; i++)
    {
        sessionEnumerator->GetSession(i, &session);
        session->GetState(&state);
        if (state == 1)
        {
            numberOfActiveProcesses++;
        }
        SAFE_RELEASE(session);
    }

    //CLEANUP

    SAFE_RELEASE(deviceEnumerator);
    SAFE_RELEASE(device);
    SAFE_RELEASE(sessionEnumerator);
    SAFE_RELEASE(sessionManager);
}

【问题讨论】:

  • 您使用的是什么版本的 Windows SDK?如果您不知道,请提及 Visual Studio 版本。
  • 我不确定我使用的是哪个版本的 SDK,但我使用的是 Visual Studio 2008 版本 3.5 SP1

标签: windows core-audio


【解决方案1】:

您的版本为 6.0。您需要下载并安装Windows SDK version 7.1。 IAudioSessionManager2 仅适用于 Windows 7。

【讨论】:

  • 谢谢汉斯,整理好了。我知道我做错了会很愚蠢。
猜你喜欢
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
相关资源
最近更新 更多