First thanks for the example 5505 USM_Stick_AudioFilter. It shows a good example of how to implement the I2S with ping pong buffers.
If I understand correctly how the DMA auto reload works I thing there is a small issue with the implementation. When a DMA length complete interrupt occurs the DMA channel reloads the current registers and continues the transfer. Therefore the correct data must already be in the DMA registers when the interrupt occurs. In effect then an interrupt is serviced you are setting up the next transfer that will occur not the current one.
The supplied routine work fine except when it is started. It that time it will play the same buffer is played twice. It is played first when set_dma0_ch0_Lout() is called and then again when the DMA interrupt expires and the registers are auto reloaded. This problem can easily be fixed by preloading the DMA registers with the ping pong buffer data after the DMA is started but before the DMA interrupt occurs.
Thanks again for the example.