[hatari-devel] DMA sound improvements

Laurent Sallafranque laurent.sallafranque at free.fr
Sun Apr 10 21:43:42 CEST 2011


Hi Nicolas,

I was reading about your DMA patch.

I think it would have been better to add a Sound_HBL_Update() function 
in sound.c

In this function, there would be a test like this :
if falcon
      call crossbar_update_hbl
else
      call dma_snd_update_hbl.

Like this, I could use the hbl udpate too in crossbar.c

The way you did it, falcon sound goes into dma_sound every HBL, and I 
really wanted to separate dma_snd and crossbar code.
(I think also that dma_snd should be renamed to STEDMA_snd, or something 
like this to avoid confusion, as Falcon DMA sound is taken into account 
into the crossbar code).

Do you agree with both points ?

Regards

Laurent




Le 07/04/2011 23:31, Nicolas Pomarède a écrit :
> Hello
>
> I committed a first round of patches that should improve sound quality 
> as well as accuracy.
>
>  - use fixed values for dma sound freqs ; on STE, clock for dma sound 
> (as well as fdc or ym2149) is not the result of dividing the main 32 
> Mhz clock, but it uses a separate dedicated 8 Mhz clock (also, 
> dividing by 160,320,... doesn't give the right value anyway)
>
>  - reorder / factorize some common code
>
>  - handle programs that write in the sample buffer at the same time 
> this buffer is played by the DMA
>
> This last point is audible in the demo "Mental Hangover" for example 
> (very noisy sound output) as well as in the game "Power Up Plus" 
> (nearly no sound at all).
>
> In order to fix this, I updated the code to work in a similar way to 
> DMA sound on a real STE. On STE, the DMA sound uses a small 8 bytes 
> FIFO to store the next bytes to be sent to the DAC at the requested 
> output freq (50066, 25033, ...).
> To keep this FIFO filled (you need approx 6.5 bytes per VBL at 50066 
> Hz stereo), the DMA sound has some bus accesses during the end of the 
> HBL (while the shifter doesn't need to read data to be displayed).
> During those accesses, the DMA sound will read as many bytes as 
> necessary to get 8 bytes in the FIFO.
>
> This means that once the DMA read some bytes at the current sample 
> frame address, you can immediatly write some new bytes in the sample 
> buffer before this address, those addresses won't be read until the 
> sample loops.
>
> So, even if it's more complex than using double buffer, it's completly 
> possible to have a single buffer replay routine that generates new 
> samples at the same time it plays the rest of the buffer (this is 
> similar to how some demos work at the video level, where they use only 
> one video buffer and use some synchronisation with $ff8209 to be sure 
> there's no "conflict" with the data the shifter will read next (the 
> game Enchanted Lands works this way due to RAM limit to use double 
> buffer for video)).
>
> To emulate this way of processing DMA sound bytes, I added the 
> function DmaSnd_HBL_Update and call this function on every HBL in 
> video.c. This way, we now "read" sample data at the same video 
> position that the DMA does on STE (in the case of Hatari, I don't 
> handle a real 8 bytes FIFO, but this difference should not be hearable).
>
> Instead of generating ~500 samples in one go per VBL (for 25066 Hz 
> sound), we now generate small chunks of samples at every HBL. The most 
> important for this to work is that the total number of bytes per VBL 
> remains the same (but whether we generate one big chunk in one go or 
> 100 smallers chunks doesn't matter).
>
>
> Let me know if you here some regressions. I'm not sure a lot of 
> programs will benefit from this fix, as using single buffer instead of 
> double buffer when generating sample is rather rare.
>
>
> I still have some other patches pending to increase accuracy as well 
> as fixing the audio/video synchro problem reported in "More Or Less 
> Zero", but they require modifications to other parts than dmaSnd.c, so 
> it will take a little more time to clean.
>
>
> PS : Anders, regarding the DMA sound FIFO, you once told me that doing 
> a stop/start to change sample address was messing with the overscan 
> timing (because the DMA will try to read 8 bytes in one go), but have 
> you ever tried to play 50066 Hz stereo sound during an overscan in 
> loop mode ? I'd like to know if this breaks the timings (with 230 or 
> 224 bytes per line)
>
>
>
> Nicolas
> _______________________________________________
> hatari-devel mailing list
> hatari-devel at lists.berlios.de
> https://lists.berlios.de/mailman/listinfo/hatari-devel
>
>




More information about the hatari-devel mailing list