* 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
[parent not found: <4A4A23D4.4090505@gmail.com>]
* 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.