* Understanding _snd_pcm_channel_area Struct (PCM Interface)!
[not found] <4A3DEAF9.80508@free.fr>
@ 2009-06-23 5:40 ` Guilherme
2009-06-23 11:14 ` Takashi Iwai
0 siblings, 1 reply; 7+ messages in thread
From: Guilherme @ 2009-06-23 5:40 UTC (permalink / raw)
Cc: alsa-devel
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.
Could I get some help from here?
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 -!
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Understanding _snd_pcm_channel_area Struct (PCM Interface)!
2009-06-23 5:40 ` Understanding _snd_pcm_channel_area Struct (PCM Interface)! Guilherme
@ 2009-06-23 11:14 ` Takashi Iwai
2009-06-27 2:56 ` Guilherme
0 siblings, 1 reply; 7+ messages in thread
From: Takashi Iwai @ 2009-06-23 11:14 UTC (permalink / raw)
To: Guilherme; +Cc: alsa-devel
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
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Understanding _snd_pcm_channel_area Struct (PCM Interface)!
2009-06-23 11:14 ` Takashi Iwai
@ 2009-06-27 2:56 ` Guilherme
2009-06-27 7:32 ` Takashi Iwai
0 siblings, 1 reply; 7+ messages in thread
From: Guilherme @ 2009-06-27 2:56 UTC (permalink / raw)
To: Takashi Iwai, alsa-devel
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
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Understanding _snd_pcm_channel_area Struct (PCM Interface)!
2009-06-27 2:56 ` Guilherme
@ 2009-06-27 7:32 ` Takashi Iwai
[not found] ` <4A4A23D4.4090505@gmail.com>
0 siblings, 1 reply; 7+ messages in thread
From: Takashi Iwai @ 2009-06-27 7:32 UTC (permalink / raw)
To: Guilherme; +Cc: alsa-devel
At Fri, 26 Jun 2009 23:56:43 -0300,
Guilherme wrote:
>
> 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.
Actually, the non-interleaved formats can be represented also with
a single base_address (and is so in the actual implementation).
addr[0].addr = base_addr;
addr[0].first = 0;
addr[0].step = 2;
addr[1].addr = base_addr;
addr[1].first = mono_buffer_len;
addr[1].step = 2;
addr[2].addr = base_addr;
addr[2].first = mono_buffer_len * 2;
addr[2].step = 2;
...
The "first" is the offset of the first sample. The address of the
first sample of the channel is simply calculated as addr + first.
This is because just we want to keep the base address same to all
channels as much as possible especially in mmap mode.
Takashi
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Understanding _snd_pcm_channel_area Struct (PCM Interface)!
[not found] ` <4A4A23D4.4090505@gmail.com>
@ 2009-06-30 14:42 ` Takashi Iwai
2009-06-30 15:01 ` Guilherme
0 siblings, 1 reply; 7+ messages in thread
From: Takashi Iwai @ 2009-06-30 14:42 UTC (permalink / raw)
To: Guilherme; +Cc: alsa-devel
At Tue, 30 Jun 2009 11:40:20 -0300,
Guilherme wrote:
>
> Tks takashi....
>
> The doubt comes from this block of code:
>
> for (chn = 0; chn < channels; chn++) {
> if ((areas[chn].first % 8) != 0) {
> printf("areas[%i].first == %i, abortando...\n", chn,
> areas[chn].first);
> exit(EXIT_FAILURE);
> }
> //pega endereço e offset da area
> samples[chn] = /*(signed short *)*/(((unsigned char
> *)areas[chn].addr) + (areas[chn].first / 8));
>
> if ((areas[chn].step % 16) != 0) {
> printf("areas[%i].step == %i, aborting...\n", chn,
> areas[chn].step);
> exit(EXIT_FAILURE);
> }
>
> steps[chn] = areas[chn].step / 8;
> samples[chn] += offset * steps[chn];
> }
>
> first:
>
> areas[chn].first % 8 ( I am using chn = 1). So for the only area that
> I have, if I get the value of the parameter 'first' isn't divisible by
> 8, the program exits.
> The same doubt happens with "areas[chn].step % 16" and
> "areas[chn].step / 8".
>
> This is the parameter I am using:
>
> static snd_pcm_format_t format = SND_PCM_FORMAT_S16; //sample format
> unsigned 16 bit endian
>
> Perhaps with this practical example I can understand better.
Oops, I wrote wrongly. The first and step fields are not in bytes but
bits. That's why 8 and 16 appear there, corresponding to 1 byte and 2
bytes.
Takashi
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Understanding _snd_pcm_channel_area Struct (PCM Interface)!
2009-06-30 14:42 ` Takashi Iwai
@ 2009-06-30 15:01 ` Guilherme
2009-06-30 15:13 ` Takashi Iwai
0 siblings, 1 reply; 7+ messages in thread
From: Guilherme @ 2009-06-30 15:01 UTC (permalink / raw)
To: Takashi Iwai, alsa-devel
Hum...
so .. the code
if ((areas[chn].step % 16) !=0 )
is because a 16bits format's been used.
If I wanted a 32bits sample format I should change that for
if ((areas[chn].step % 32) !=0 ) ??
and the offset for the first doen's need any changes, is it?
Just a opinion about all this, I think that alsa developers should design graphs for these things, as has in gstreamer documentation.
It is a lot easer to understand that way.
It is because I dont understand very well yet, but as I am going to work with sound stuff especially in linux environment, Ill be very soon offering help for this!
;o)
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, 30 Jun 2009 11:40:20 -0300,
> Guilherme wrote:
>
>> Tks takashi....
>>
>> The doubt comes from this block of code:
>>
>> for (chn = 0; chn < channels; chn++) {
>> if ((areas[chn].first % 8) != 0) {
>> printf("areas[%i].first == %i, abortando...\n", chn,
>> areas[chn].first);
>> exit(EXIT_FAILURE);
>> }
>> //pega endereço e offset da area
>> samples[chn] = /*(signed short *)*/(((unsigned char
>> *)areas[chn].addr) + (areas[chn].first / 8));
>>
>> if ((areas[chn].step % 16) != 0) {
>> printf("areas[%i].step == %i, aborting...\n", chn,
>> areas[chn].step);
>> exit(EXIT_FAILURE);
>> }
>>
>> steps[chn] = areas[chn].step / 8;
>> samples[chn] += offset * steps[chn];
>> }
>>
>> first:
>>
>> areas[chn].first % 8 ( I am using chn = 1). So for the only area that
>> I have, if I get the value of the parameter 'first' isn't divisible by
>> 8, the program exits.
>> The same doubt happens with "areas[chn].step % 16" and
>> "areas[chn].step / 8".
>>
>> This is the parameter I am using:
>>
>> static snd_pcm_format_t format = SND_PCM_FORMAT_S16; //sample format
>> unsigned 16 bit endian
>>
>> Perhaps with this practical example I can understand better.
>>
>
> Oops, I wrote wrongly. The first and step fields are not in bytes but
> bits. That's why 8 and 16 appear there, corresponding to 1 byte and 2
> bytes.
>
>
> Takashi
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Understanding _snd_pcm_channel_area Struct (PCM Interface)!
2009-06-30 15:01 ` Guilherme
@ 2009-06-30 15:13 ` Takashi Iwai
0 siblings, 0 replies; 7+ messages in thread
From: Takashi Iwai @ 2009-06-30 15:13 UTC (permalink / raw)
To: Guilherme; +Cc: alsa-devel
At Tue, 30 Jun 2009 12:01:53 -0300,
Guilherme wrote:
>
> Hum...
>
> so .. the code
>
> if ((areas[chn].step % 16) !=0 )
>
> is because a 16bits format's been used.
>
> If I wanted a 32bits sample format I should change that for
> if ((areas[chn].step % 32) !=0 ) ??
Depends.
The step field doesn't specify the sample format. It specifies
the bits to the next sample of the given channel.
For such a purpose, checking the sample format bits via
snd_pcm_format_width() or snd_pcm_format_physical_width() would be
more suitable.
> and the offset for the first doen's need any changes, is it?
>
> Just a opinion about all this, I think that alsa developers should design graphs for these things, as has in gstreamer documentation.
> It is a lot easer to understand that way.
>
> It is because I dont understand very well yet, but as I am going to work with sound stuff especially in linux environment, Ill be very soon offering help for this!
Well, usually you don't have to care about the channel_info. It's
just for mmap, and unless you really do want it inevitably, the mmap
access isn't needed.
Takashi
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2009-06-30 15:13 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <4A3DEAF9.80508@free.fr>
2009-06-23 5:40 ` Understanding _snd_pcm_channel_area Struct (PCM Interface)! Guilherme
2009-06-23 11:14 ` Takashi Iwai
2009-06-27 2:56 ` Guilherme
2009-06-27 7:32 ` Takashi Iwai
[not found] ` <4A4A23D4.4090505@gmail.com>
2009-06-30 14:42 ` Takashi Iwai
2009-06-30 15:01 ` Guilherme
2009-06-30 15:13 ` Takashi Iwai
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.