Проблемы с использованием Windows Core Audio API - PullRequest
0 голосов
/ 28 августа 2011

Я пытался заставить работать программу, использующую аудио API Windows. Конечным результатом будет программа, которая проверяет изменения громкости в другом аудио процессе. Я посмотрел на некоторые примеры на сайте Microsoft и у меня недостаточно внимания к тому, что я должен делать. Однако, когда я пытаюсь реализовать это, я получаю некоторые ошибки. Я начинаю с того, что пытаюсь получить список, ну, на самом деле, просто подсчет в минуту всех запущенных аудио процессов. Код, который я использую, основан на коде на сайте Windows, однако я получаю ошибки, когда пытаюсь его собрать. Два основных из них:

  1. 'IAudioSessionManager2': GUID не связан с этим объектом
  2. использование неопределенного типа 'IAudioSessionManager2'

Существует также аналогичный для 2-го, но относится к 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);
}

1 Ответ

0 голосов
/ 01 сентября 2011

У вас версия 6.0. Вам нужно будет загрузить и установить Windows SDK версии 7.1 . IAudioSessionManager2 доступен только в Windows 7.

...