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

Takashi Iwai tiwai at suse.de
Tue Jun 30 16:42:42 CEST 2009


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


More information about the Alsa-devel mailing list