Re: [AD] [BUG?] X11 Windowed driver delay... |
[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]
On Thu, 2004-02-19 at 01:35, Thomas Fjellstrom wrote: > I'm starting to suspect the different ALSA hardware drivers all behave > differently... And the only way to get around this is to not use alsa's plain > "write" interface... Something with shared mem, callbacks, or whatever will > probably work better with allegro. > > I really don't know anymore.. It was a pain to grep through ALSAs > "documentation", and through various headers... > > I've had as much fun playing with ALSAs api as I've had playing with TCL in > eggdrop bots... (not fun at all.) > Heh, I can imagine that :P Since the alsa5 and alsa9 code was splitted, I had no more excuse to not look at it - and I finally got it to work :) I'm still wondering though if a simple threaded version wouldn't be a better idea. Is anyone still needing the unix-signals version of Allegro? Not even AllegGL works with that version, so I guess ALSA doesn't have to either. But anyway, the polled version seems to work now. I had to fiddle around quite a bit to make it play together with Allegro's "interrupt" context. E.g. "poll" can't wait infinitly - instead it must return from the "interrupt". Otherwise everything else, e.g. keyboard input, is stopped. I'm not really 100% sure - but I think another problem was due to the fragments loop, like I initially suspected. It somehow was re-mixing the complete buffer for every fragment or something :P I just threw it all out and did like in that ALSA example, and works perfectly here. I also think samples, bytes, and the sample frames/points stuff was mixed up at some places. If not, it is now :P Some additional minor things: - I set some SW parameters, like in the ALSA examples. - Why was the driver using SND_PCM_FORMAT_S16_NE? Allegro has unsigned samples - so I changed it to unsigned. Probably I'm overlooking something here though - maybe only signed is guaranteed to work on all ALSA drivers, but not unsigned, and therefore we should do the conversion to unsigned? I also see there's some endianess detection in the ALSA 5 driver.. probably on big endian the ALSA 9 driver won't work currently. - I changed ALSA_DEFAULT_NUMFRAGS from 16 to 5 - simply because that's what is used in the ALSA example I was looking at. - The following code fragment: if (fragsize < 0) { bps >>= 9; if (bps < 16) bps = 16; fragsize = 1; while ((fragsize << 1) < bps) fragsize <<= 1; } else { fragsize = fragsize * (alsa_bits / 8) * (alsa_stereo ? 2 : 1); } I wasn't exactly sure what it does. So i replaced it by the below, where ALSA_DEFAULT_BUFFER_MS is 100 and is the default fragment/period length in ms. if (fragsize < 0) { int size = alsa_rate * ALSA_DEFAULT_BUFFER_MS / 1000 / numfrags; fragsize = 1; while (fragsize < size) fragsize <<= 1; } - Inside the xrun_recovery function, I commented out the handling of ESTRPIPE. I must admit, I have no idea what it does. But sleeping for a second, or in fact entering a loop which seems to wait much more time than a second - all *inside an Allegro-interrupt* - definitely is plain wrong - even if only done for ESTRPIPE. Patch is attached. Regarding Allegro 4.1.13 - if this gets included despite the freeze, we should still leave it at low priority I think - since OSS works just as good. -- Elias Pschernig <elias@xxxxxxxxxx>
Attachment:
alsa9.diff.gz
Description: GNU Zip compressed data
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |