MCPcopy Create free account
hub / github.com/Aloshi/EmulationStation / setVolume

Method setVolume

src/VolumeControl.cpp:321–388  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

319}
320
321void VolumeControl::setVolume(int volume)
322{
323 //clamp to 0-100 range
324 if (volume < 0)
325 {
326 volume = 0;
327 }
328 if (volume > 100)
329 {
330 volume = 100;
331 }
332 //store values in internal variables
333 internalVolume = volume;
334#if defined (__APPLE__)
335 #error TODO: Not implemented for MacOS yet!!!
336#elif defined(__linux__)
337 if (mixerElem != nullptr)
338 {
339 //get volume range
340 long minVolume;
341 long maxVolume;
342 if (snd_mixer_selem_get_playback_volume_range(mixerElem, &minVolume, &maxVolume) == 0)
343 {
344 //ok. bring into minVolume-maxVolume range and set
345 long rawVolume = (volume * (maxVolume - minVolume) / 100) + minVolume;
346 if (snd_mixer_selem_set_playback_volume(mixerElem, SND_MIXER_SCHN_FRONT_LEFT, rawVolume) < 0
347 || snd_mixer_selem_set_playback_volume(mixerElem, SND_MIXER_SCHN_FRONT_RIGHT, rawVolume) < 0)
348 {
349 LOG(LogError) << "VolumeControl::getVolume() - Failed to set mixer volume!";
350 }
351 }
352 else
353 {
354 LOG(LogError) << "VolumeControl::getVolume() - Failed to get volume range!";
355 }
356 }
357#elif defined(WIN32) || defined(_WIN32)
358 if (mixerHandle != nullptr)
359 {
360 //Windows older than Vista. use mixer API. get volume from line control
361 MIXERCONTROLDETAILS_UNSIGNED value;
362 value.dwValue = (volume * 65535) / 100;
363 MIXERCONTROLDETAILS mixerControlDetails;
364 mixerControlDetails.cbStruct = sizeof(MIXERCONTROLDETAILS);
365 mixerControlDetails.dwControlID = mixerControl.dwControlID;
366 mixerControlDetails.cChannels = 1; //always 1 for a MIXERCONTROL_CONTROLF_UNIFORM control
367 mixerControlDetails.cMultipleItems = 0; //always 0 except for a MIXERCONTROL_CONTROLF_MULTIPLE control
368 mixerControlDetails.paDetails = &value;
369 mixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
370 if (mixerSetControlDetails((HMIXEROBJ)mixerHandle, &mixerControlDetails, MIXER_SETCONTROLDETAILSF_VALUE) != MMSYSERR_NOERROR)
371 {
372 LOG(LogError) << "VolumeControl::setVolume() - Failed to set mixer volume!";
373 }
374 }
375 else if (endpointVolume != nullptr)
376 {
377 //Windows Vista or above. use EndpointVolume API
378 float floatVolume = 0.0f; //0-1

Callers 2

inputMethod · 0.80
applyStatesMethod · 0.80

Calls

no outgoing calls

Tested by

no test coverage detected