Как узнать текущую частоту воспроизведения звука в Windows?

Я использую Windows waveOut API (также известный как MME или Multimedia Extension) mmsystem.h. Некоторые программы изменяют частоту дискретизации воспроизведения звука (например, с 44,1 кГц до 48 кГц), и моей программе было бы очень полезно определить текущую частоту дискретизации воспроизведения, поэтому она может предупредить пользователей о том, что Windows будет пересчитывать выходные данные программы.

Согласно этой документации http://msdn.microsoft.com/en-us/library/aa909811.aspx, waveOutGetPlaybackRate возвращает% пересэмплирования, который устройство выполняет в данный момент (например, устройство воспроизводит звук на 44,1, а программа воспроизводит звук на 44,1, поэтому возвращается 1,0). Мне любопытно, есть ли способ получить абсолютную частоту дискретизации устройства, а не что-то относительное. В Windows Vista / 7/8 вы можете вручную найти это значение, перейдя в:
Панель управления> Звук> Воспроизведение, щелкните правой кнопкой мыши устройство воспроизведения по умолчанию, выберите «Свойства» и перейдите на вкладку «Дополнительно». Поэтому я пытаюсь найти это значение «формата по умолчанию», находящееся здесь, запрашивая ОС.

Рассматриваемая программа написана на языке Pascal, однако я обычно использую ссылки на C / C ++.

2

Решение

    //#include <iostream>
//#include <initguid.h>
//#include <Mmdeviceapi.h>

int main() {
HRESULT hr;
IMMDevice * pDevice = NULL;
IMMDeviceEnumerator * pEnumerator = NULL;
IPropertyStore* store = nullptr;
PWAVEFORMATEX deviceFormatProperties;
PROPVARIANT prop;

CoInitialize(NULL);

// get the device enumerator
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (LPVOID *)&pEnumerator);

// get default audio endpoint
hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);

hr = pDevice->OpenPropertyStore(STGM_READ, &store);
if (FAILED(hr)) {
std::cout << "OpenPropertyStore failed!" << std::endl;
}

hr = store->GetValue(PKEY_AudioEngine_DeviceFormat, &prop);
if (FAILED(hr)) {
std::cout << "GetValue failed!" << std::endl;
}

deviceFormatProperties = (PWAVEFORMATEX)prop.blob.pBlobData;
std::cout << "Channels    = " << deviceFormatProperties->nChannels << std::endl;
std::cout << "Sample rate = " << deviceFormatProperties->nSamplesPerSec << std::endl;
std::cout << "Bit depth   = " << deviceFormatProperties->wBitsPerSample << std::endl;

system("pause");
return 0;
}
3

Другие решения


По вопросам рекламы [email protected]