Я разрабатываю приложение для аудиоустройства, работающего по стандарту usb audio. Одной из задач является выбор формата воспроизведения: количество бит, частота дискретизации. Для задания формата, используя Windows Core Audio API, я написал следующий c++ код:
bool CPropPage::SetMode(int freq, int bits)
{
static const int channels = 2;
PROPVARIANT varName;
IMMDevice* pDev = NULL;
IPropertyStore *pProps = NULL;
bool result = false;
if (!m_pEnumerator)
return false;
HRESULT hr = m_pEnumerator->GetDevice(m_devguid.c_str(), &pDev);
if (hr != S_OK)
return false;
hr = pDev->OpenPropertyStore(STGM_WRITE, &pProps);
if (hr != S_OK)
goto exit;
PropVariantInit(&varName);
varName.vt = VT_BLOB;
varName.blob.cbSize = sizeof(WAVEFORMATEXTENSIBLE);
int alignment = channels * bits / 8;
WAVEFORMATEXTENSIBLE format = {
{
WAVE_FORMAT_EXTENSIBLE,
channels,
freq,
freq * alignment,
alignment,
bits,
(sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX))
},
{bits},
SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT,
KSDATAFORMAT_SUBTYPE_PCM
};
varName.blob.pBlobData = (BYTE*)&format;
LogEntry("SetMode:%d %d\n", freq, bits);
hr = pProps->SetValue(
PKEY_AudioEngine_DeviceFormat, varName);
if (hr != S_OK)
goto exit;
LogEntry("SetMode ok\n");
LogAudioEngineFormat(pDev, &format.Format);
result = true;
exit:
if (pDev) pDev->Release();
if (pProps) pProps->Release();
return result;
}
По сути, работа функции сводится к заданию свойства PKEY_AudioEngine_DeviceFormat объекта IMMDevice.
Примечание. m_pEnumerator - указатель на объект COM-класса IMMDeviceEnumerator. m_devguid - GUID устройства.
Результат работы функции: формат задается, и это видно в Панель управления -> Звук -> Свойства. Однако при этом невозможно воспроизвести ни один звук. Windows Media Player сообщает, что данный формат не поддерживается. (Задаваемый формат: 44100 Гц, 2 канала, 16 бит). При этом, если тот же самый формат задать через Панель управления -> Звук -> Свойства, все звуки, аудиофайлы воспроизводятся успешно. Что я делаю не так, объясните, плиз!
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники