Lautstärkelimit eines Programms unter Windows 10 herausfinden



  • Guten morgen/abend!

    Folgendes Projekt: Ich arbeite an einem individuellen Lautstärkemixer, wie man ihn vlt. von Roccat Power Grid kennt, um über z.B. MQTT Werte and das Programm zu senden, damit man die Lautstärke jedes Programms/jede Audiosession regeln kann.

    Problematik: Ich habe es geschafft mir, mit der unten aufgeführten Funktion getVolume das Lautstärkelimit der Master-Volume raus zu bekommen. Jetzt möchte ich aber das Limit für jedes andere Programm auslesen/verändern. Mit Lautstärkelimit meine ich die, im Lautstärkemixer verfügbaren, Slider mit denen man die Lautstärke für einzelne offene Programme regeln kann.

    Frage: Gibt es eine Funktion (wie GetMasterVolumeLevelScalar bei der getVolume Funktion) für einzelne Audiosessions? Habe die Funktion GetPeakValue gefunden (in der getSessions Funktion zu finden), welche allerdings die aktuelle Lautstärke angibt (vermutlich in dB) und nicht das "Limit", welches im Lautstärkemixer gesetzt ist.

    Kann mir eventuell jemand helfen ? ^^

    double getVolume() {
        float currentVolume = 0;
    
        CoInitialize(NULL);
        IMMDeviceEnumerator *deviceEnumerator = NULL;
        CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);
        IMMDevice *defaultDevice = NULL;
        deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice);
        deviceEnumerator->Release();
        deviceEnumerator = NULL;
    
        IAudioEndpointVolume *endpointVolume = NULL;
        defaultDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
        defaultDevice->Release();
        defaultDevice = NULL;
    
        float fLevel;
        endpointVolume->GetMasterVolumeLevel(&fLevel);
        qDebug() << "FLevel: ";
        qDebug() << fLevel;
    
        endpointVolume->GetMasterVolumeLevelScalar(&currentVolume);
        endpointVolume->Release();
    
        CoUninitialize();
    
        return (double)(currentVolume * 100);
    }
    
    void getSessions() {
        CoInitialize(NULL);
    
        IMMDeviceEnumerator *pDeviceEnumerator = NULL;
        IMMDevice *pDevice = NULL;
        IAudioSessionManager2 *pAudioSessionManager2 = NULL;
        IAudioSessionEnumerator *pAudioSessionEnumerator = NULL;
    
        CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&pDeviceEnumerator);
        pDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
    
        pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void **) &pAudioSessionManager2);
        pAudioSessionManager2->GetSessionEnumerator(&pAudioSessionEnumerator);
    
        int nSessionCount;
        pAudioSessionEnumerator->GetCount(&nSessionCount);
    
        qDebug() << "Session Count";
        qDebug() << nSessionCount;
    
        while (true) {
            for (int nSessionIndex = 0; nSessionIndex < nSessionCount; nSessionIndex++) {
                IAudioSessionControl *pSessionControl = NULL;
                if (FAILED(pAudioSessionEnumerator->GetSession(nSessionIndex, &pSessionControl)))
                    continue;
    
                IAudioMeterInformation *pAudioMeterInformation;
                pSessionControl->QueryInterface(&pAudioMeterInformation);
    
                float fPeak;
                pAudioMeterInformation->GetPeakValue(&fPeak);
            }
    
            Sleep(1000);
        }
    
        CoUninitialize();
    }
    


  • Alles klar, ich hab die Lösung gefunden. Man muss bei einer Session ein QueryInterface auf ISimpleAudioVolume hetzen, somit kann man die Funktionen GetMasterVolume und SetMasterVolume für diese Session setzen.

    Beitrag kann somit geschlossen werden (wenn das hier so gehandhabt wird).
    Hier noch der Code:

    void getSessions() {
        CoInitialize(NULL);
    
        IMMDeviceEnumerator *pDeviceEnumerator;
        IMMDevice *pDevice;
        IAudioSessionManager2 *pAudioSessionManager2;
        IAudioSessionEnumerator *pAudioSessionEnumerator;
    
        CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&pDeviceEnumerator);
        pDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
    
        pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void **) &pAudioSessionManager2);
        pAudioSessionManager2->GetSessionEnumerator(&pAudioSessionEnumerator);
    
        int nSessionCount;
        pAudioSessionEnumerator->GetCount(&nSessionCount);
    
        while (true) {
            for (int nSessionIndex = 0; nSessionIndex < nSessionCount; nSessionIndex++) {
                IAudioSessionControl *pSessionControl;
                if (FAILED(pAudioSessionEnumerator->GetSession(nSessionIndex, &pSessionControl)))
                    continue;
    
                ISimpleAudioVolume *pSimpleAudioVolume;
                pSessionControl->QueryInterface(&pSimpleAudioVolume);
    
                float fLevel;
                pSimpleAudioVolume->GetMasterVolume(&fLevel);
    
                qDebug() << "fLevel";
                qDebug() << fLevel;
            }
    
            Sleep(1000);
        }
    
        CoUninitialize();
    }
    

Anmelden zum Antworten