my dsound/winealsa hacks

James Courtier-Dutton James at superbug.co.uk
Sun Sep 24 09:28:04 CDT 2006


Tomas Carnecky wrote:
> James Courtier-Dutton wrote:
>> I have place some documentation on the ALSA wiki site:
>> https://bugtrack.alsa-project.org/wiki/wikka.php?wakka=ALSAresampler
>>
>> It tries to explain the constraints that the current ALSA resampler 
>> works under.
>>
>> You might like to read it as I think it will have impact on your plans.
>>
> 
> Thanks. One question though, if the app in in blocking mode and requests 
> the said two periods, will alsa wait until the hardware has processed 
> three 48000Hz-periods and then copy the two 44100Hz-periods to the 
> application (because: 3 periods at 48000Hz > 2*1024 frames at 44100Hz)?
> 
> DirectSound doesn't know anything about periods, the windows application 
> operates on bytes rather than frames or periods. So whether I'd have to 
> wait for two or three periods wouldn't matter. The important thing is 
> that I get X bytes in the right format to pass that back to the 
> application.
> 
> tom

Maybe the ALSA terminology needs to be clarified.
A frame is equivalent of one sample being played, irrespective of the 
number of channels or the about of bits.
e.g.
1 frame of a Stereo 48khz 16bit PCM stream is 4 bytes.
1 frame of a 5.1 48khz 16bit PCM stream is 12 bytes.

A period is the amount of frames in between each hardware interrupt. The 
poll() will return once a period.

The buffer is a ring buffer. The buffer size always has to be greater 
than one period size. Commonly this is 2*period size, but some hardware 
can do 8 periods per buffer. It is also possible for the buffer size to 
not be an integer multiple of the period size.

Now, if the hardware has been set to 48000Hz , 2 periods, of 1024 frames 
each, making a buffer size of 2048 frames. The hardware will interrupt 2 
times per buffer. The application 44100Hz will also have 2 periods of 
940 frames.
ALSA will endeavor to keep the buffer as full as possible. Once the 
first period has been played, the third is transfered into the space the 
first one occupied while the second period is being played. (normal ring 
buffer behaviour).

So, once a period has been transfered to the sound card hardware, it 
cannot be modified, even though the sound card has not yet played it 
from the DACs.

As Direct Sound does not know anything about periods, I don't really 
know how you will be able to get it to work well with ALSA. I expect 
that some sort of double buffer will be required.
Does Direct Sound have a concept of position of the ADC, and also a 
concept of where in the buffer it is sensible to fill with new samples?

James






More information about the wine-devel mailing list