2017-02-26 1 views
1

Je peux modifier le niveau de volume du périphérique audio par défaut sur Windows par C++ par programmation en utilisant la méthode IAudioEndpointVolume et SetMasterVolumeLevel().Comment modifier le niveau de volume d'un périphérique audio autre que celui par défaut par programmation?

Comment changer le niveau de volume de non-par défaut appareils sonores, sur PC avec plusieurs cartes son?

+1

ce qui est généralement une très mauvaise idée, mon pote. Sauf si vous écrivez des pilotes etc., laissez la possibilité de gérer les niveaux de volume à l'utilisateur. – vaxquis

+1

Qu'est-ce qui vous empêche d'appeler 'SetMasterVolumeLevel()' sur l'interface 'IAudioEndpointVolume' en référence au périphérique audio désiré? – IInspectable

+0

@IInspectable, je peux obtenir la liste des périphériques mais je ne sais pas comment sélectionner un autre périphérique audio de cette liste pour modifier son niveau de volume. J'ai essayé de le sélectionner en utilisant la méthode 'IMMDeviceEnumerator' et' GetDevice() 'pour obtenir un périphérique autre que celui par défaut, mais il se bloque lors de l'exécution. – Alper

Répondre

1

Je l'ai résolu, voici mon code:

HRESULT hr = S_OK; 
IMMDeviceEnumerator *pEnumerator = NULL; 
IMMDeviceCollection *pCollection = NULL; 
IMMDevice *pEndpoint = NULL; 
IPropertyStore *pProps = NULL; 
LPWSTR pwszID = NULL; 
CoInitialize(NULL); 

hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL,CLSCTX_ALL, IID_IMMDeviceEnumerator,(void**)&pEnumerator); 
hr = pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE,&pCollection); // ** use "eCapture" for microphones and "eRender" for speakers. 
hr = pCollection->GetCount(&count); 
if (count == 0){ 
    cout <<"No endpoints found."<<endl; 
} 
for (ULONG i = 0; i < count; i++){ 
    hr = pCollection->Item(i, &pEndpoint); 
    hr = pEndpoint->GetId(&pwszID); 
    IAudioEndpointVolume *endpointVolume = NULL; 
    pEnumerator->GetDevice(pwszID,&pEndpoint); 
    pEndpoint->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume); 
    hr = pEndpoint->OpenPropertyStore(STGM_READ, &pProps); 
    PROPVARIANT varName; 
    PropVariantInit(&varName); 
    hr = pProps->GetValue(PKEY_Device_FriendlyName, &varName); 
    printf("Endpoint %d: \"%S\" (%S)\n",i, varName.pwszVal, pwszID); 
    CoTaskMemFree(pwszID); 
    pwszID = NULL; 
    PropVariantClear(&varName); 
    endpointVolume->SetMasterVolumeLevelScalar(0.1, NULL); // set volume level of device to 0.1 (10%) 
    // endpointVolume->Release(); 
    //you can save endpointVolume in a container to set set volume level for each device. 
}