Как я могу получить доступ к аудиоустройствам через API MMDevice? - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь управлять аудиопотоками с помощью программы, но у меня возникают проблемы даже при получении доступа к аудиоустройству. Как примечание: я новичок в C ++, и я изучил кодирование на Java, поэтому я новичок в идее указателей, а также в идеях HRESULT и других вещей для Windows. На этой странице написано, что я должен сначала перечислить аудио конечное устройство. Затем я провел еще несколько поисков, чтобы выяснить, как это сделать, и меня перевели на страницу Перечисление аудиоустройств . На этой странице мне сказали использовать MMDevice API . На этой странице показан этот код:

const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
hr = CoCreateInstance(
     CLSID_MMDeviceEnumerator, NULL,
     CLSCTX_ALL, IID_IMMDeviceEnumerator,
     (void**)&pEnumerator);

Я пытался использовать это и

(void**)&pEnumerator

не работал, поэтому я нашел другой код, который использовал

reinterpret_cast<>();

чтобы справиться с этой ошибкой. Но проблема, с которой я сталкиваюсь, заключается в том, что я не получаю указатель. Мой код ниже.

CoInitializeEx(NULL, COINIT_MULTITHREADED);

IMMDeviceEnumerator *pEnumerator;

const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);

//print CLSID to see if I get any ids
std::cout << CLSID_MMDeviceEnumerator.Data1 << "\n";
std::cout << CLSID_MMDeviceEnumerator.Data2 << "\n";
std::cout << CLSID_MMDeviceEnumerator.Data3 << "\n";
std::cout << CLSID_MMDeviceEnumerator.Data4 << "\n";

//temp variable to hold the result of the CoCreateInstance call
LPVOID *ppv = NULL;

HRESULT retrivedDeviceEnumerator = CoCreateInstance(
    CLSID_MMDeviceEnumerator,
    NULL,
    CLSCTX_ALL,
    IID_IMMDeviceEnumerator,
    ppv
);
//I'm sure there is a better way to print and end the line
//print mem location to see if I am getting a result
std::cout << ppv << "\n";
//cast the result to correct type
pEnumerator = (reinterpret_cast<IMMDeviceEnumerator*>(ppv));

Этот код печатает некоторые числа для строк CLSID, поэтому я думаю, что они получают правильные значения, но я получаю 00000000, когда печатаю указатель ppv.

1 Ответ

0 голосов
/ 04 июля 2018

Относительно хороший фрагмент кода оттуда :

CoInitialize(NULL);
IMMDeviceEnumerator *deviceEnumerator = NULL;
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, 
    __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);
IMMDevice *defaultDevice = NULL;
hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice);
...
...