mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05: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);
 | 
				
			||||||
 | 
					    if (caps.dwSupport & WAVECAPS_LRVOLUME)
 | 
				
			||||||
        right = PA_CLAMP_VOLUME(((vol >> 16) & 0xFFFF) * PA_VOLUME_NORM / WAVEOUT_MAX_VOLUME);
 | 
					        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