Настройка формата аудиоустройства в Windows

245
05 мая 2017, 19:29

Я разрабатываю приложение для аудиоустройства, работающего по стандарту 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 бит). При этом, если тот же самый формат задать через Панель управления -> Звук -> Свойства, все звуки, аудиофайлы воспроизводятся успешно. Что я делаю не так, объясните, плиз!

READ ALSO
building a multi file project in sublime text [требует правки]

building a multi file project in sublime text [требует правки]

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

206
С++ | Помогите с кодом на С++

С++ | Помогите с кодом на С++

Приветствую, господаПомогите пожалуйста с "почти" готовыми кодами, которые нужно довести до ума

267
proxy vs decorator

proxy vs decorator

Доброго времени сутокВ своем вопросе рассматриваю паттерны прокси и декоратор исключительно в контексте языка c++

336
Выделение памяти под методы класса, если объектов более одного

Выделение памяти под методы класса, если объектов более одного

Есть некий класс, сlass A_class; у него есть свойство int b; и метод void action(); который содержит некий код

255