admin管理员组

文章数量:1297121

I am trying to get mixer events from alsa (v1.0.29) in C, but I cannot poll for them, because my card uses ioctl to change values. I am checking for events using amixer sevents, which correctly gets all controls, but is not aware of events - poll doesn't work with ioctl. According to Can we use epoll() to poll on a descriptor which is using ioctl for data transfer, it's driver issue.

#  amixer sevents                 
event add: 'Master',0         
event value: 'Master',0             
event info: 'master volume',0                
event value: 'master volume',0  
...
Ready to listen...                     
# strace amixer -Ddefault cset name='master volume' 10
...
open("/dev/snd/controlC0", O_RDWR|O_CLOEXEC) = 3
fcntl64(3, F_SETFD, FD_CLOEXEC)         = 0
ioctl(3, USBDEVFS_CONTROL, 0xbea56374)  = 0
ioctl(3, USBDEVFS_CONNECTINFO, 0xbea56748) = 0
ioctl(3, USBDEVFS_IOCTL, 0xbea56440)    = 0
ioctl(3, USBDEVFS_HUB_PORTINFO, 0xbea56440) = 0
close(3)                                = 0
stat64("/usr/share/alsa/alsa.conf", {st_mode=S_IFREG|0644, st_size=9318, ...}) = 0
open("/dev/snd/controlC0", O_RDWR|O_CLOEXEC) = 3
fcntl64(3, F_SETFD, FD_CLOEXEC)         = 0
ioctl(3, USBDEVFS_CONTROL, 0xbea5635c)  = 0
ioctl(3, USBDEVFS_RELEASEINTERFACE, 0xbea563d8) = 0
ioctl(3, USBDEVFS_RELEASEINTERFACE, 0xbea563d8) = 0
ioctl(3, USBDEVFS_DISCONNECT, 0xbea563c4) = 0
ioctl(3, USBDEVFS_CONNECTINFO, 0xbea56200) = 0
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 30), ...}) = 0
write(1, "numid=10,iface=MIXER,name='maste"..., 42numid=10,iface=MIXER,name='master volume'
) = 42
write(1, "  ; type=INTEGER,access=rw------"..., 63  ; type=INTEGER,access=rw------,values=1,min=0,max=120,step=0
) = 63
ioctl(3, USBDEVFS_IOCTL, 0xbea55f38)    = 0
write(1, "  : values=10\n", 14  : values=10
)         = 14
close(3)                                = 0

<no events in amixer>

My code is identical to amixer sevents command, so I am using it as example.

/?p=alsa-utils.git;a=blob;f=alsactl/monitor.c;hb=HEAD

Is there another way to be notified of alsa mixer events?

本文标签: epollGetting alsa mixer events on card which uses ioctlStack Overflow