Subject: pkg/36480: OSS mixer problems with audio/xmms: not using ioctl properly
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: None <jpeterson275@comcast.net>
List: pkgsrc-bugs
Date: 06/13/2007 09:25:00
>Number:         36480
>Category:       pkg
>Synopsis:       OSS mixer problems with audio/xmms: not using ioctl properly
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Jun 13 09:25:00 +0000 2007
>Originator:     Jesse Peterson
>Release:        NetBSD/amd64 3.1
>Organization:
>Environment:
NetBSD localhost 3.1 NetBSD 3.1 (GENERIC) #0: Mon Oct 30 21:47:28 UTC 2006  builds@b1.netbsd.org:/home/builds/ab/netbsd-3-1-RELEASE/amd64/200610302053Z-obj/home/builds/ab/netbsd-3-1-RELEASE/src/sys/arch/amd64/compile/GENERIC amd64
>Description:
Audio hardware:

auvia0 at pci0 dev 17 function 5: VIA Technologies VT8237 AC'97 Audio (rev 0x60)
auvia0: interrupting at ioapic0 pin 22 (irq 3)
auvia0: ac97: Avance Logic ALC850 codec; no 3D stereo
auvia0: ac97: ext id 9c6<AC97_23,LDAC,SDAC,CDAC,SPDIF,DRA>
audio0 at auvia0: full duplex, independent

XMMS is using passing int in place of an unsigned long for the request variable of ioctl(2).

The effect of which on this platform and hardware was that I could not change the volume
>How-To-Repeat:
Compile/use audio/xmms (nb8) from pkgsrc on NetBSD/amd64 3.1 with a VIA VT8237 AC'97 audio chip and attempt to change the volume using the OSSaudio emulation API. Even though audio plays fine you cannot change the mixer PCM or master volume levels through XMMS itself.
>Fix:
--- xmms-1.2.10/Output/OSS/mixer.c.orig 2001-06-16 06:30:35.000000000 -0700
+++ xmms-1.2.10/Output/OSS/mixer.c      2007-06-12 21:38:54.000000000 -0700
@@ -34,7 +34,8 @@
 
 void oss_get_volume(int *l, int *r)
 {
-       int fd, v, cmd, devs;
+       int fd, v, devs;
+       unsigned long cmd;
        gchar *devname;
 
        devname = get_mixer_device();
@@ -66,7 +67,8 @@
 
 void oss_set_volume(int l, int r)
 {
-       int fd, v, cmd, devs;
+       int fd, v, devs;
+       unsigned long cmd;
        gchar *devname;
 
        devname = get_mixer_device();