Thanks. And "huh" the "interesting" one not the "duhh" one.
It gets stuck polling a file descriptor. Edited highlights:
Code: Select all
open("/dev/snd/timer", O_RDONLY|O_NONBLOCK|O_CLOEXEC) = 3
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
ioctl(3, SNDRV_TIMER_IOCTL_PVERSION, 0xbedd62c8) = 0
ioctl(3, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, 0xbedd62cc) = 0
ioctl(3, SNDRV_TIMER_IOCTL_SELECT or TIOCSPGRP, 0xbedd62d0) = 0
ioctl(3, SNDRV_TIMER_IOCTL_PVERSION, 0xbedd6668) = 0
ioctl(3, SNDRV_TIMER_IOCTL_PARAMS or TIOCSTI, 0xbedd6518) = 0
ioctl(3, SNDRV_TIMER_IOCTL_START, 0x54a0) = 0
poll([{fd=3, events=POLLIN|POLLERR|POLLNVAL}], 1, -1) = 1 ([{fd=3, revents=POLLIN}])
read(3, "\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\233\0\0\0\3408\302\20\0\0\0\0", 64) = 32
read(3, 0xbedd6858, 64) = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=3, events=POLLIN|POLLERR|POLLNVAL}], 1, -1)
Kernel module snd_timer
is loaded
So it's polling on the sound timer, gets a *first* alert but not a second. Playing without dmix never references /dev/snd/timer so it works. /dev/snd/timer is root:audio and 660 - chmod'ing to 777 doesn't help. alsactl init doesn't help. Googling around finds nothing really relevant.
But we can see that after the first read(3) (presumably fetching a timestamp) the next read returns EAGAIN which apparently means "nothing there, this would have blocked" and that would be why it polls waiting for data that presumably never comes.
So it seems very likely that the problem is with /dev/snd/timer not running for some reason. I am officially now out of my depth
