[alsa-devel] Understanding _snd_pcm_channel_area Struct (PCM Interface)!

Guilherme grlongo.ireland at gmail.com
Sat Jun 27 04:56:43 CEST 2009


Takashi...

The base_address and the step sounds pretty clear to me.... just the 
offset I could not understand.

What the difference in being  .first = 0 or .first = 2??? Could you 
provide please a more in depth explanation. I tried really hard find 
this but there is nothing related in the documentation.

area[0].addr = base_address;
	addr[0].first = 0;
	addr[0].step = 4;
	addr[1].addr = base_address;
	addr[1].first = 2;
	addr[1].step = 4;

P.S. being a stereo or a mono pipeline I understand... just the way the offset works that is not so clear to me.

Thanks in advanced!


Tks!

-------------------

Guilherme Longo
Dept. Eng. da Computação
Unaerp

Linux User - #484927

*Before Asking
http://www.istf.com.br/?page=perguntas

!- I'd rather die on my feet than live on my knees -!



Takashi Iwai wrote:
> At Tue, 23 Jun 2009 02:40:35 -0300,
> Guilherme wrote:
>   
>> Hi all.
>>
>> I am a bit confused on what I get with this function.
>> I finished my first project but I did not understand what exactly the
>>
>> _snd_pcm_channel_area at
>>
>>  http://www.alsa-project.org/alsa-doc/alsa-lib/struct__snd__pcm__channel__area.html
>>
>> does.
>>
>> There are 3 fields in the documentation.
>>
>> addr, first and step.
>>
>> It seems that addr is the memory address of the channel samples... so 
>> far so good. The "step" is the distance between 2 sample (but I am not 
>> sure) and the least, "first", I could not figure out what does it means.
>>     
>
> This information is needed to understand how the multi-channel samples
> are assigned in a stream.  The first is the offset of the channel
> position to the given addr.  The step is the bytes to the next sample
> of that channel.
>
> For example, suppose you have a 2-channel stereo interleaved stream
> with 16bit samples.  Then you'll have an array of snd_pcm_channel_area
> with two elements, for left and right channels, containing like
>
> 	area[0].addr = base_address;
> 	addr[0].first = 0;
> 	addr[0].step = 4;
> 	addr[1].addr = base_address;
> 	addr[1].first = 2;
> 	addr[1].step = 4;
>
> Both channels share the same base address but have the different
> "first" offset bytes.  The step size is 4 = #chanel * sample-size.
>
> For a non-interleaved stereo stream, it'll look like
>
> 	addr[0].addr = base_addr_0;
> 	addr[0].first = 0;
> 	addr[0].step = 2;
> 	addr[1].addr = base_addr_1;
> 	addr[1].first = 0;
> 	addr[1].step = 2;
>
> Thus it looks like two mono streams with 16bit samples.
>
>
> HTH,
>
> Takashi
>
>   


More information about the Alsa-devel mailing list