On Mon, 2004-03-01 at 00:17, Jaroslav Kysela wrote: > On Sun, 29 Feb 2004, Ann Patterson wrote: > > > I installed a M-Audio Revolution 7.1 (snd-ice1724) in my mythtv box. I > > had mythtv working fine with the machine's onboard sound (snd-trident) > > using OSS emulation. The revo works correctly for things like xine, > > mplayer, aplay (of course), play, etc. In mythtv, however, I get no > > sound. > > > > I dug into the mythtv code, and found that it is doing a call to > > ioctl(audiofd, SNDCTL_DSP_GETOSPACE, &info) and using the info.bytes > > value that is returned to determine whether or not to write to the card. > > The first call to SNDCTL_DSP_GETOSPACE appears to return a reasonable > > number, but from that point, the numbers returned are all over the > > place, and are often negative. So, mythtv, of course, won't write to the > > card. I find that if I comment out the code that checks the values > > returned from GETOSPACE, I get sound, but it is out of sync with the > > video (sound slightly behind video). > > > > I'm using the dmix plugin, if that matters, but I got the same results > > without the plugin. > > > > I'm willing to debug this further, but I've not done anything with alsa > > or soundcards before, so I need a bit of help in determining where to > > look. > > Can you write a nice small test code which shows this problem? You may > modify code in alsa-oss/test/osstest.c . > > Jaroslav
I've attached a patch to alsa-oss-1.0.3rc3 that modifies osstest.c to reproduce the problem. If you run it like: osstest -v -M write you will see the output from the SNDCTL_DSP_GETOSPACE ioctl during each write loop. I also attached the log from when I run it with my revo, and the log when I run it with my onboard SiS sound. I included my asound.conf and modules.conf for good measure, too. Let me know if you need anything else, or if I'm doing something wrong. Ann P.
Only in alsa-oss-mod/alsa: aoss Only in alsa-oss-mod/alsa: .deps Only in alsa-oss-mod/alsa: Makefile Only in alsa-oss-mod/alsa: testaoss Only in alsa-oss-mod/: config.log Only in alsa-oss-mod/: config.status Only in alsa-oss-mod/: libtool Only in alsa-oss-mod/: Makefile Only in alsa-oss-mod/oss-redir: .deps Only in alsa-oss-mod/oss-redir: Makefile Only in alsa-oss-mod/test: .deps Only in alsa-oss-mod/test: ice1724.log Only in alsa-oss-mod/test: Makefile diff -ur alsa-oss-1.0.3rc3/test/osstest.c alsa-oss-mod/test/osstest.c --- alsa-oss-1.0.3rc3/test/osstest.c 2004-02-26 07:34:50.000000000 -0800 +++ alsa-oss-mod/test/osstest.c 2004-03-02 08:21:21.000000000 -0800 @@ -162,6 +162,14 @@ char buf[1000]; if (omode != O_RDONLY) { ssize_t res; + if (oss_pcm_ioctl(fd, SNDCTL_DSP_GETOSPACE, &ospace) < 0) { + perror("SNDCTL_DSP_GETOSPACE"); + exit(EXIT_FAILURE); + } + printf("ospace.fragstotal = %i\n", ospace.fragstotal); + printf("ospace.fragsize = %i\n", ospace.fragsize); + printf("ospace.periods = %i\n", ospace.fragments); + printf("ospace.bytes = %i\n", ospace.bytes); if (first) { res = oss_pcm_write(fd, buf, sizeof(buf)); if (verbose) Only in alsa-oss-mod/test: osstest.c~ Only in alsa-oss-mod/test: osstest.c.orig Only in alsa-oss-mod/test: testaoss Only in alsa-oss-mod/test: trident.log
Using transfer method rw Device /dev/dsp opened sucessfully Format set to 16 Rate set to 48000 Channels set to 2 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 32 ospace.bytes = 131072 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 32 ospace.bytes = 131072 write: (1000) -> 1000 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1048575 ospace.bytes = -2000 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1048575 ospace.bytes = -3000 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1048575 ospace.bytes = -4000 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 11416 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 10416 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 9416 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 8416 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1 ospace.bytes = 7432 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1 ospace.bytes = 6432 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1 ospace.bytes = 5432 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1 ospace.bytes = 4432 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 0 ospace.bytes = 3432 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 0 ospace.bytes = 2432 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 0 ospace.bytes = 1432 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 0 ospace.bytes = 432 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1048575 ospace.bytes = -552 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1048575 ospace.bytes = -1552 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1048575 ospace.bytes = -2552 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1048575 ospace.bytes = -3552 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 11832 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 10832 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 9832 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 8832 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1 ospace.bytes = 7832 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1 ospace.bytes = 6848 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1 ospace.bytes = 5848 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1 ospace.bytes = 4848 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 0 ospace.bytes = 3848 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 0 ospace.bytes = 2848 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 0 ospace.bytes = 1848 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 0 ospace.bytes = 848 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1048575 ospace.bytes = -152 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1048575 ospace.bytes = -1152 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1048575 ospace.bytes = -2136 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 1048575 ospace.bytes = -3136 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 12264 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 11264 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 10264 write: (1000) -> 1000 ospace.fragstotal = 32 ospace.fragsize = 4096 ospace.periods = 2 ospace.bytes = 9264 write: (1000) -> 1000
Using transfer method rw Device /dev/dsp opened sucessfully Format set to 16 Rate set to 48000 Channels set to 2 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 16 ospace.bytes = 65536 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 16 ospace.bytes = 65536 write: (1000) -> 1000 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 15 ospace.bytes = 63536 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 15 ospace.bytes = 62536 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 15 ospace.bytes = 61536 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 14 ospace.bytes = 60556 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 14 ospace.bytes = 59556 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 14 ospace.bytes = 58556 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 14 ospace.bytes = 57560 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 13 ospace.bytes = 56692 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 13 ospace.bytes = 55692 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 13 ospace.bytes = 54696 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 13 ospace.bytes = 53696 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 12 ospace.bytes = 52700 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 12 ospace.bytes = 51700 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 12 ospace.bytes = 50704 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 12 ospace.bytes = 49704 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 11 ospace.bytes = 48708 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 11 ospace.bytes = 47744 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 11 ospace.bytes = 46744 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 11 ospace.bytes = 45744 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 10 ospace.bytes = 44748 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 10 ospace.bytes = 43752 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 10 ospace.bytes = 42752 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 10 ospace.bytes = 41752 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 9 ospace.bytes = 40776 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 9 ospace.bytes = 39776 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 9 ospace.bytes = 38776 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 9 ospace.bytes = 37820 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 8 ospace.bytes = 36824 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 8 ospace.bytes = 35828 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 8 ospace.bytes = 34828 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 8 ospace.bytes = 33828 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 8 ospace.bytes = 32832 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 7 ospace.bytes = 31836 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 7 ospace.bytes = 30836 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 7 ospace.bytes = 29836 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 7 ospace.bytes = 28868 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 6 ospace.bytes = 27872 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 6 ospace.bytes = 26872 write: (1000) -> 1000 ospace.fragstotal = 16 ospace.fragsize = 4096 ospace.periods = 6 ospace.bytes = 25872 write: (1000) -> 1000
pcm.ice1724 { type hw card 0 device 0 } ctl.ice1724 { type hw card 0 device 0 } pcm.ice1724_digital { type hw card 0 device 1 } ctl.ice1724_digital { type hw card 0 device 1 } pcm_slave.ice1724_S32_LE { pcm ice1724 format S32_LE } pcm.ice1724_convert { type plug slave ice1724_S32_LE } pcm_slave.ice1724_S32_LE_digital { pcm ice1724_digital format S32_LE } pcm.ice1724_convert_digital { type plug slave ice1724_S32_LE_digital } pcm.ossmix { type dmix ipc_key 1024 # must be unique! slave { pcm "hw:0,0" # you cannot use a "plug" device here, darn. period_time 0 period_size 512 buffer_size 4096 format "S32_LE" # periods 128 # dito. # rate 44100 } bindings { 0 0 # from 0 => to 0 1 1 # from 1 => to 1 } } #pcm.dsp0 { # type plug # slave.pcm "ossmix" # use our new PCM here #} #ctl.mixer0 { # type hw # card 0 #} #pcm.!default { # type plug # slave.pcm "ossmix" #} #ctl.!default { # type plug # slave.pcm "ossmix" #} pcm.!default { type plug slave ice1724_S32_LE } pcm.!default { type plug slave ice1724_S32_LE } pcm.intel8x0 { type hw card 1 device 0 } ctl.intel8x0 { type hw card 1 device 0 }
path[toplevel]=/lib/modules/`uname -r`/updates # default path path[toplevel]=/lib/modules/`uname -r` alias usb-controller usb-ohci alias usb-controller1 ehci-hcd alias eth0 nvnet alias char-major-195 nvidia alias char-major-61 lirc_i2c # ivtv modules setup alias char-major-81 videodev alias char-major-81-0 ivtv options tuner type=2 options msp3400 once=1 simple=1 add below ivtv msp3400 saa7115 tuner # --- BEGIN: Generated by ALSACONF, do not edit. --- # --- ALSACONF verion 1.0.1 --- alias char-major-116 snd alias char-major-14 soundcore alias sound-service-0-0 snd-mixer-oss alias sound-service-0-1 snd-seq-oss alias sound-service-0-3 snd-pcm-oss alias sound-service-0-8 snd-seq-oss alias sound-service-0-12 snd-pcm-oss alias snd-card-0 snd-ice1724 # --- END: Generated by ALSACONF, do not edit. --- alias sound-slot-0 snd-ice1724 # onboard sound alias snd-card-1 snd-intel8x0 alias sound-slot-1 snd-intel8x0 alias sound-service-1-0 snd-mixer-oss alias sound-service-1-3 snd-pcm-oss alias sound-service-1-8 snd-seq-oss alias sound-service-1-12 snd-pcm-oss post-install sound-slot-0 /usr/sbin/alsactl restore alias usb-interface usb-ohci