Trouble using IO::ioctl

I’m trying to write a audio volume control with Ruby. I want to use
Ruby’s ioctl method to control the mixer. It’s just not working. Here
is two short program to demonstrate the problem. It has to be a dumb
mistake, but I don’t see it. Thanks ahead of time.

pc

Ruby program fails:

···

SOUND_MIXER_READ_DEVMASK = 0x80044dfe
mixer = File.open("/dev/mixer", “w+”)
notused = 0
devmask = mixer.ioctl(SOUND_MIXER_READ_DEVMASK, notused)
printf “devmask[%08x]\n”, devmask

#~ Program results:
#~ test.rb:8:
#~ in `ioctl’: Bad address - /dev/mixer (Errno::EFAULT) from test.rb:8


C program works:
#define SOUND_MIXER_READ_DEVMASK 0X80044dfe

int main(int argc, char *argv[])
{
int mixerfd, devmask;

char* name = "/dev/mixer";
if ((mixerfd = open(name, O_RDWR)) < 0) {
	perror(name);
	exit(1);
}
if (ioctl(mixerfd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) {
	perror("SOUND_MIXER_READ_DEVMASK");
	exit(-1);
}
printf("Mixer Device mask [%08x]\n", devmask);

return 0;

}
/*
Program results:
Mixer Device mask [005051d1]
*/

Hi,

···

At Sun, 21 Dec 2003 14:26:54 +0900, Phil Callihan wrote:

SOUND_MIXER_READ_DEVMASK = 0x80044dfe
mixer = File.open(“/dev/mixer”, “w+”)
devmask = [0].pack(“i”)
mixer.ioctl(SOUND_MIXER_READ_DEVMASK, devmask)
devmask = devmask.unpack(“i”)[0]
printf “devmask[%08x]\n”, devmask


Nobu Nakada

Thank you for the help. That fix the problem. I could find any
documention except for the paragraph in Pickaxe.

Phil Callihan (pc)

···

nobu.nokada@softhome.net wrote:

Hi,

At Sun, 21 Dec 2003 14:26:54 +0900, > Phil Callihan wrote:

SOUND_MIXER_READ_DEVMASK = 0x80044dfe
mixer = File.open(“/dev/mixer”, “w+”)

devmask = [0].pack(“i”)
mixer.ioctl(SOUND_MIXER_READ_DEVMASK, devmask)
devmask = devmask.unpack(“i”)[0]
printf “devmask[%08x]\n”, devmask