Re: reading 1 second of audio at a time

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2010/6/22 folkert <folkert@xxxxxxxxxxxxxx>

> Hi,
>
> Am trying to achieve something trivial: reading 1 second of audio at a
> time, but something goes wrong:
>
> Sound 1277148008.835094
> Sound 1277148008.838224
> Sound 1277148010.834839
> Sound 1277148010.838001
> Sound 1277148012.834523
> Sound 1277148012.837580
> Sound 1277148014.835240
> Sound 1277148014.838333
>
> As you can see; audio is returned for 2 seconds, then it sleeps 2
> secondsn, then 2 seconds of audio, etc.
>
> What I do is:
>
>        if (snd_pcm_hw_params_set_access(pcm_handle, hwparams,
> SND_PCM_ACCESS_RW_INTERLEAVED) < 0) {
>        }
>
>        if (snd_pcm_hw_params_set_format(pcm_handle, hwparams,
> SND_PCM_FORMAT_S16_LE) < 0) {
>        }
>
>        exact_rate = 44100;
>        if (snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams,
> &exact_rate, 0) < 0) {
>                error_exit("Error setting rate.\n");
>        }
>        if (*rate != exact_rate) {
>                fprintf(stderr, "The rate %d Hz is not supported by your
> hardware.\n ==> Using %d Hz instead.\n", *rate, exact_rate);
>                *rate = exact_rate;
>        }
>
>        if (snd_pcm_hw_params_set_channels(pcm_handle, hwparams, 2) < 0) { }
>
>        int periods = 2;
>        if (snd_pcm_hw_params_set_periods(pcm_handle, hwparams, periods, 0)
> < 0) {
>        }
>
>        if (snd_pcm_hw_params_set_buffer_size(pcm_handle, hwparams,
> exact_rate * 2 * n_channels) < 0) {
>        }
>

buffer_size is actually no of samples , exact_rate*2*n_channels seem to be
buffer_bytes

Have you checked whether hardware driver support exactly 1 second buffer ?

since the most common HDA , you cannot get exactlyy 1 second buffer because
period_size is multiple of 128 bytes




>
>        if (snd_pcm_hw_params(pcm_handle, hwparams) < 0) {
>        }
>
>        return pcm_handle;
> }
>
> void get_audio_1s(snd_pcm_t *pcm_handle, short *buffer, int rate, int
> channels)
> {
>        int samples = channels * rate, index = 0;
>
>        while(samples > 0)
>        {
>                int cur = samples, pcmreturn;
>
>                while ((pcmreturn = snd_pcm_readi(pcm_handle,
> &buffer[index], cur)) < 0) {
>                        snd_pcm_prepare(pcm_handle);
>                        printf("
> underrun\n");
>                }
>
>                index += pcmreturn;
>                samples -= pcmreturn;
>        }
> }
>
> So I call this get_audio_1s() with the samplerate (44100) and the number of
> channels (2).
> Then it seems to return the first second at once, then the second second of
> audio too, then sleeps for 2 seconds(!) and then repeats.
>
>
> Folkert van Heusden
>
> --
> Ever wonder what is out there? Any alien races? Then please support
> the seti@home project: setiathome.ssl.berkeley.edu
> ----------------------------------------------------------------------
> Phone: +31-6-41278122, PGP-key: 1F28D8AE, www.vanheusden.com
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@xxxxxxxxxxxxxxxx
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel


[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux