mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-31 22:25:33 -04:00
module-waveout: Correctly handle mono volume controls on waveout device
This commit is contained in:
parent
6addadc574
commit
ed0e879cd9
1 changed files with 23 additions and 4 deletions
|
|
@ -400,14 +400,23 @@ static int process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa
|
||||||
|
|
||||||
static void sink_get_volume_cb(pa_sink *s) {
|
static void sink_get_volume_cb(pa_sink *s) {
|
||||||
struct userdata *u = s->userdata;
|
struct userdata *u = s->userdata;
|
||||||
|
WAVEOUTCAPS caps;
|
||||||
DWORD vol;
|
DWORD vol;
|
||||||
pa_volume_t left, right;
|
pa_volume_t left, right;
|
||||||
|
|
||||||
|
if (waveOutGetDevCaps(u->hwo, &caps, sizeof(caps)) != MMSYSERR_NOERROR)
|
||||||
|
return;
|
||||||
|
if (!(caps.dwSupport & WAVECAPS_VOLUME))
|
||||||
|
return;
|
||||||
|
|
||||||
if (waveOutGetVolume(u->hwo, &vol) != MMSYSERR_NOERROR)
|
if (waveOutGetVolume(u->hwo, &vol) != MMSYSERR_NOERROR)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
left = PA_CLAMP_VOLUME((vol & 0xFFFF) * PA_VOLUME_NORM / WAVEOUT_MAX_VOLUME);
|
left = PA_CLAMP_VOLUME((vol & 0xFFFF) * PA_VOLUME_NORM / WAVEOUT_MAX_VOLUME);
|
||||||
right = PA_CLAMP_VOLUME(((vol >> 16) & 0xFFFF) * PA_VOLUME_NORM / WAVEOUT_MAX_VOLUME);
|
if (caps.dwSupport & WAVECAPS_LRVOLUME)
|
||||||
|
right = PA_CLAMP_VOLUME(((vol >> 16) & 0xFFFF) * PA_VOLUME_NORM / WAVEOUT_MAX_VOLUME);
|
||||||
|
else
|
||||||
|
right = left;
|
||||||
|
|
||||||
/* Windows supports > 2 channels, except for volume control */
|
/* Windows supports > 2 channels, except for volume control */
|
||||||
if (s->real_volume.channels > 2)
|
if (s->real_volume.channels > 2)
|
||||||
|
|
@ -420,11 +429,21 @@ static void sink_get_volume_cb(pa_sink *s) {
|
||||||
|
|
||||||
static void sink_set_volume_cb(pa_sink *s) {
|
static void sink_set_volume_cb(pa_sink *s) {
|
||||||
struct userdata *u = s->userdata;
|
struct userdata *u = s->userdata;
|
||||||
|
WAVEOUTCAPS caps;
|
||||||
DWORD vol;
|
DWORD vol;
|
||||||
|
|
||||||
vol = s->real_volume.values[0] * WAVEOUT_MAX_VOLUME / PA_VOLUME_NORM;
|
if (waveOutGetDevCaps(u->hwo, &caps, sizeof(caps)) != MMSYSERR_NOERROR)
|
||||||
if (s->real_volume.channels > 1)
|
return;
|
||||||
vol |= (s->real_volume.values[1] * WAVEOUT_MAX_VOLUME / PA_VOLUME_NORM) << 16;
|
if (!(caps.dwSupport & WAVECAPS_VOLUME))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (s->real_volume.channels == 2 && caps.dwSupport & WAVECAPS_LRVOLUME) {
|
||||||
|
vol = (s->real_volume.values[0] * WAVEOUT_MAX_VOLUME / PA_VOLUME_NORM)
|
||||||
|
| (s->real_volume.values[1] * WAVEOUT_MAX_VOLUME / PA_VOLUME_NORM) << 16;
|
||||||
|
} else {
|
||||||
|
vol = (pa_cvolume_avg(&(s->real_volume)) * WAVEOUT_MAX_VOLUME / PA_VOLUME_NORM)
|
||||||
|
| (pa_cvolume_avg(&(s->real_volume)) * WAVEOUT_MAX_VOLUME / PA_VOLUME_NORM) << 16;
|
||||||
|
}
|
||||||
|
|
||||||
if (waveOutSetVolume(u->hwo, vol) != MMSYSERR_NOERROR)
|
if (waveOutSetVolume(u->hwo, vol) != MMSYSERR_NOERROR)
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue