Нахождение текущего уровня громкости выходного сигнала динамика в Windows - PullRequest
1 голос
/ 20 февраля 2020

EDITED: я пытаюсь написать своего рода аудио-визуализатор, и мне нужно получить текущую громкость звука, передаваемого в динамики. Мне нужна реальная громкость звука, а не только основная громкость устройства. Я пытался сделать это, используя this , но я не уверен, как это реализовать. Вызвав метод IAudioCaptureClient :: GetBuffer () , я не знаю, как использовать полученный пакет данных, чтобы найти то, что мне нужно. Аудио 2 канала, 32 бита на семпл. Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 20 февраля 2020

Начиная с Windows 7, существующие API были улучшены, и были добавлены новые API для поддержки нового сценария ios. API управления потоками и сеансами были улучшены, так что теперь приложение может перечислять и получать расширенный контроль над аудио сеансом. Используя новые API-интерфейсы, приложение может реализовывать пользовательские функции ослабления потока. Новые API, относящиеся к устройствам, предоставляют доступ к свойствам драйверов устройств конечных точек.

См .: API Core Audio

Вот простая демонстрационная версия для справки:

#include <Windows.h>
#include <stdio.h>
#include <mmeapi.h>
#include <mmdeviceapi.h> 
#include <endpointvolume.h>
#include <audioclient.h>

#pragma comment(lib,"Winmm.lib")

bool GetVolumeLevel()
{
    HRESULT hr;
    IMMDeviceEnumerator* pDeviceEnumerator = 0;
    IMMDevice* pDevice = 0;
    IAudioEndpointVolume* pAudioEndpointVolume = 0;

    try {
        hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pDeviceEnumerator);
        if (FAILED(hr)) throw "CoCreateInstance";
        hr = pDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);
        if (FAILED(hr)) throw "GetDefaultAudioEndpoint";
        hr = pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&pAudioEndpointVolume);
        if (FAILED(hr)) throw "pDevice->Active";

        float fVolume;

        hr = pAudioEndpointVolume->GetMasterVolumeLevelScalar(&fVolume);
        printf("%lf", fVolume);
        if (FAILED(hr)) throw "SetMasterVolumeLevelScalar";

        pAudioEndpointVolume->Release();
        pDevice->Release();
        pDeviceEnumerator->Release();
            return true;
    }
    catch (...) {
        if (pAudioEndpointVolume) pAudioEndpointVolume->Release();
        if (pDevice) pDevice->Release();
        if (pDeviceEnumerator) pDeviceEnumerator->Release();
        throw;
    }
    return false;
}

int main()
{
    CoInitialize(0);
    try {
        GetVolumeLevel();

    }
    catch (...) {
        //err handle..
    }
    CoUninitialize();

    getchar();
    return 0;
}

Он вернется к уровню громкости текущего динамика.

Вы можете сосредоточиться на этом API: IAudioEndpointVolume :: GetMasterVolumeLevelScal

Метод GetMasterVolumeLevelScalar возвращает уровень мастер-громкости аудиопотока, который входит в конечное аудиоустройство или покидает его. Уровень громкости выражается в виде нормализованного звукового значения в диапазоне от 0,0 до 1,0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...