| 319 | } |
| 320 | |
| 321 | void 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 |
no outgoing calls
no test coverage detected