I was reading over this thread while researching a fix for my problem. I
thought I would share what I happening on my machine, and hopefully it will
provide you with some insight into your situation. I don't have the answer
yet, but maybe I can provide a different view of what the problem is.
I am currently trying to get 4 PCI cards with 8 channels to work with a new
motherboard (MSI Neo 3FR). I also have an nvidia GeForce 9600 NGO video
card, an Intel Core2 Extreme Quad processor, 4 GB of memory, and 4 Sata II
disks installed. I am currently running Fedora Core 8, with CCRMA
modifications for sound. The audio card is an old Gadget Labs card, and
there is a linux driver, but it isn't part of the Alsa tree yet. I have to
compile and install a module to make the Gadget Labs cards work.
I can easily get 3 cards working (24 channels), but I am needing to do some
'black magic' to get 4 cards working. I am not getting any sound out of
the fourth soundcard. So far, it sounds familiar, doesn't it? (not enough
channels coming out). One of the benefits of having the new linux
driver is that there is already some basic diagnostics built into the
driver, and you can see reports in /var/log/messages of how long it takes to
open or close the card to it's memory buffer. This was originally used
because the interface chip was so old that it didn't have DMA, and a
'software DMA' had to be written, and this was the mechanism to test the
card/driver and figure out its performance.
For my particular system, because I can run a test and see the driver
performance in /var/log/messages (I'm using Jack/Ardour for 'high level
stuff, aplay, arecord, etc for low level stuff), I have seen that the video
card driver is sending a bunch of interrupts down the PCI bus (even though
it is on PCI Express). The particular driver that is sending the
interrupts down the PCI bus is called NV, and is an open source
implementation of NVidia drivers. I get rid of all graphics by issuing
'init 3' instead of being at the normal runlevel 5 (graphics).
As an example for playback only, here are some statistics for one card in
the graphics mode:
[root@localhost tmp]# cat /var/log/messages |grep ISR
...
Dec 13 12:18:23 localhost kernel: api_gl824_stop ISR took between 47 and 137
samples
Dec 13 12:18:23 localhost kernel: api_gl824_stop Buffer transfers TO CARD
within ISR took between 11 and 100 samples
Dec 13 12:18:23 localhost kernel: api_gl824_stop Buffer transfers FROM CARD
within ISR took between 35 and 125 samples
(There is a 128 sample-memory on the card. It is easier to deal with
samples than time, so the 44100khz or 48000khz can be scaled more easily.
What you are seeing is that I am about to run out of time on the PCI bus if
I only have 128 samples to play with)
When I go to a non-graphics mode with init 3, I get the following results:
[root@localhost tmp]# cat /var/log/messages
...
Dec 13 22:03:22 localhost kernel: pcm_gl824_output_trigger 0
Dec 13 22:03:22 localhost kernel: api_gl824_stop Master card's clock
position stopped at 1540
Dec 13 22:03:22 localhost kernel: api_gl824_stop ISR took between 2 and 4
samples
Dec 13 22:03:22 localhost kernel: api_gl824_stop Buffer transfers TO CARD
within ISR took between 2 and 4 samples
Dec 13 22:03:22 localhost kernel: api_gl824_stop Buffer transfers FROM CARD
within ISR took between 0 and 1 samples
.
Dec 13 22:07:48 localhost kernel: pcm_gl824_output_trigger 0
Dec 13 22:07:48 localhost kernel: api_gl824_stop Master card's clock
position stopped at 1932
Dec 13 22:07:48 localhost kernel: api_gl824_stop ISR took between 10 and 12
samples
Dec 13 22:07:48 localhost kernel: api_gl824_stop Buffer transfers TO CARD
within ISR took between 10 and 11 samples
Dec 13 22:07:48 localhost kernel: api_gl824_stop Buffer transfers FROM CARD
within ISR took between 0 and 1 samples
Dec 13 22:07:48 localhost kernel: pcm_gl824_output_hw_free
Dec 13 22:07:48 localhost kernel: pcm_gl824_output_close
What this means is that some interrupt in the graphics mode was taking up
all the PCI bus.
Now, further testing in nongraphic mode revealed that there is still an
issue with hard disk interrupts taking up a lot of PCI bus time.
I'm running arecord and aplay for about 30 seconds to see what the
performance is. I'm recording and playing back 8 channels at once in the
32 bit noninterleaved mode. After I record 8 channels for about 30 seconds
with arecord (creating one honkin' big file) and playing it back with aplay,
I get the following stats when looking at the output of the card:
Dec 14 09:39:15 localhost kernel: pcm_gl824_output_trigger 0
Dec 14 09:39:15 localhost kernel: api_gl824_stop Master card's clock
position stopped at 397
Dec 14 09:39:15 localhost kernel: api_gl824_stop ISR took between 11 and
1498 samples
Dec 14 09:39:15 localhost kernel: api_gl824_stop Buffer transfers TO CARD
within ISR took between 0 and 98 samples
Dec 14 09:39:15 localhost kernel: api_gl824_stop Buffer transfers FROM CARD
within ISR took between 0 and 39 samples
Dec 14 09:39:15 localhost kernel: pcm_gl824_output_hw_free
This means that there are still interrupts happening on the PCI bus while
the card is trying to play. I'm reading the following link to determine
what is the best next thing to do, but I'm also looking at a modern
equivalent to 'hdparm' (and maybe hdparm if I can get it to work with my
Sata disks).
Here's a link that gives an approach to solving the problem:
http://www.gentoo.org/doc/en/articles/hardware-stability-p2.xml
In my opinion, the problem I'm having is because the hard disks are 'too
fast' with 'too much priority' and are taking up too much bandwidth on the
PCI bus. You may be having the same thing happen. It may be that instead
of your problem being that your disks are too slow, the real problem is that
your disk may be too fast. I remember having very severe problems with
disk interrupts when I first started using this software and scsi disks on a
Sun V20z (which are much faster than IDE or SATA). Once I switched to a
normal PC (with slower IDE disks), the underruns just disappeared.
Fortunately with that setup, you could actually hear the disks move and see
the underruns happen at the same time.
If anyone else has been down this road and knows of how to solve the
underlying issues (sata hard disk interrupts taking up too much PCI
bandwidth), I am still searching for an answer and I'm VERY interested in
hearing something from you.
Thanks in advance,
Mike Mazarick
If someone else has been down this road