[alsa-devel] Alsa buffer

arif setiawan n.arif.setiawan at gmail.com
Tue Jul 14 03:55:58 CEST 2009


Hi,

I'm trying to get meaningful voice from ALSA buffer. I read tutorial on
http://www.suse.de/~mana/alsa090_howto.html<http://www.suse.de/%7Emana/alsa090_howto.html>and
realize that if alsa use 16 bit format value then I have to byte shift
to store it in 8 bit unsigned char buffer. I see this in sine wave generator
in tutorial. To confirm it, I try to save the output into file and open it
in Matlab. I want to know if this is correct, because when I try saving alsa
buffer on a from recording I still get noise not the voice.

Thank you.

Best regards,

Arif


This is my implementation :

int main()
{
    int nchannel = 1;
    int periodsize = 8192;
    int frame_size = nchannel * (16 / 8);
    int num_frames = periodsize / frame_size;

    unsigned char *data;
    int l2;
    short s;

    data = (unsigned char *)malloc(periodsize);

    // fill the buffer
    for(l2 = 0; l2 < num_frames; l2++)
    {
        s1 = (l2 % 128) * 100 - 5000;
        data[2*l2] = (unsigned char)s1;
        data[2*l2+1] = s1 >> 8;
    }

    // directly save
    FILE *fp1 = fopen("sineout1", "w");

    for (int i = 0; i < periodsize; i++)
    {
        fprintf_s(fp1, "%d\n", data[i]);
    }

    fclose(fp1);

    // with bit shifting from char to short
    FILE *fp2 = fopen("sineout2", "w");

    for (int i = 0; i < num_frames; i++)
    {
        short newval = data[2*i+1] << 8;
        newval += data[2*i];

        fprintf_s(fp2, "%d\n", newval);
    }

    fclose(fp2);

    return 0;
}


More information about the Alsa-devel mailing list