Я разрабатываю приложение для аудиоустройства, работающего по стандарту 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 бит). При этом, если тот же самый формат задать через Панель управления -> Звук -> Свойства, все звуки, аудиофайлы воспроизводятся успешно. Что я делаю не так, объясните, плиз!
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
When I'm building a project in sublime text using command shift b i getting only 2 options and both of them are about building single fileTherefore main file can see none of my headers
Приветствую, господаПомогите пожалуйста с "почти" готовыми кодами, которые нужно довести до ума
Доброго времени сутокВ своем вопросе рассматриваю паттерны прокси и декоратор исключительно в контексте языка c++
Есть некий класс, сlass A_class; у него есть свойство int b; и метод void action(); который содержит некий код