Я пытался заставить работать программу, использующую аудио API Windows.
Конечным результатом будет программа, которая проверяет изменения громкости в другом аудио процессе.
Я посмотрел на некоторые примеры на сайте Microsoft и у меня недостаточно внимания к тому, что я должен делать.
Однако, когда я пытаюсь реализовать это, я получаю некоторые ошибки. Я начинаю с того, что пытаюсь получить список, ну, на самом деле, просто подсчет в минуту всех запущенных аудио процессов.
Код, который я использую, основан на коде на сайте Windows, однако я получаю ошибки, когда пытаюсь его собрать. Два основных из них:
- 'IAudioSessionManager2': GUID не связан с этим объектом
- использование неопределенного типа '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);
}