[alsa-devel] Problems with 32 bit apps on 64 bit OS using dmix and snd-ioctl32
Takashi Iwai
tiwai at suse.de
Wed Sep 5 14:51:59 CEST 2007
At Wed, 05 Sep 2007 12:10:40 +0100,
James Pearson wrote:
>
> I've already sent this to the alsa-user list, but may be this a better
> place to ask:
>
> I have a problem using 32 bit (i386) playback applications on a 64 bit
> (x86_64) CentOS4/RHEL4 based kernel (based on kernel 2.6.9).
>
> I've installed alsa-driver, alsa-lib and alsa-utils 1.0.13 (newer
> versions of alsa-driver don't build with this kernel)
>
> If I try to run a 32 bit copy of aplay on a 64 bit machine that doesn't
> support hardware mixing (e.g. HDA NVidia) - i.e. uses dmix by default, I
> get:
>
> aplay: pcm_write:1268: write error: Invalid argument
>
> and /var/log/messages reports:
>
> Sep 4 16:45:37 wstemp-b kernel: ioctl32(aplay:28133): Unknown cmd fd(3)
> cmd(40045402){00} arg(ffffae88) on /dev/snd/timer
> Sep 4 16:45:37 wstemp-b kernel: ioctl32(aplay:28133): Unknown cmd fd(5)
> cmd(c008551a){00} arg(080678a0) on /dev/snd/controlC0
> Sep 4 16:45:37 wstemp-b kernel: ioctl32(aplay:28133): Unknown cmd fd(5)
> cmd(c008551b){00} arg(080678a0) on /dev/snd/controlC0
> Sep 4 16:45:37 wstemp-b kernel: ioctl32(aplay:28133): Unknown cmd fd(3)
> cmd(000054a0){00} arg(00000320) on /dev/snd/timer
>
> I've done some searching to find a solution - and found out that in more
> recent kernels, snd-ioctl32 has been obsoleted - and if I do use a more
> modern kernel, then using a 32 bit version of aplay works OK on a newer
> 64 bit kernel.
>
> However, for other (not sound related) reasons, I need to run the
> RHEL4/CentOS4 2.6.9 kernel ...
>
> I had a look at the alsa-driver code, and acore/ioctl32/timer32_new.c
> contains:
>
> #if 0
> /* ** FIXME **
> * The following four entries are disabled because they conflict
> * with the TCOC* definitions.
> * Unfortunately, the current ioctl32 wrapper uses a single
> * hash table for all devices. Once when the wrapper is fixed
> * with the table based on devices, they'll be back again.
> */
> MAP_COMPAT(SNDRV_TIMER_IOCTL_START),
> MAP_COMPAT(SNDRV_TIMER_IOCTL_STOP),
> MAP_COMPAT(SNDRV_TIMER_IOCTL_CONTINUE),
> MAP_COMPAT(SNDRV_TIMER_IOCTL_PAUSE),
> #endif
>
> If I change the '#if 0' to '#if 1', recompile and reload with this new
> snd-ioctl32 module, then the 32 bit aplay works without an error ...
> although /var/log/messages still reports:
>
> Sep 4 17:05:26 wstemp-b kernel: ioctl32(aplay:28926): Unknown cmd fd(3)
> cmd(40045402){00} arg(ffffadb8) on /dev/snd/timer
> Sep 4 17:05:26 wstemp-b kernel: ioctl32(aplay:28926): Unknown cmd fd(5)
> cmd(c008551a){00} arg(080678a0) on /dev/snd/controlC0
> Sep 4 17:05:26 wstemp-b kernel: ioctl32(aplay:28926): Unknown cmd fd(5)
> cmd(c008551b){00} arg(080678a0) on /dev/snd/controlC0
>
> ... but at least I get sound out!
>
> So, what is the danger of using these 'disabled' ioctls?
>
> I can't find any reference to 'TCOC* definitions' - what are these ???
A typo of TIOC* or TC*. They are defined in asm-*/ioctls.h.
These are used for syscalls like fcntl(). Thus, it's indeed dangerous
to define these.
Can't you build the new alsa-driver with old kernel? Then, together
with the new alsa-lib, the problem should go away.
Takashi
More information about the Alsa-devel
mailing list