Re: C program for playing sound

[email protected]
Newsgroups gmane.linux.alsa.user
Message-ID <20200624061056.GI760547@localhost>
> now the problem is that the sound is skipping.

Can you provide a recording of what it sounds like?

In alsa-lib there is an example test/latency.c which just moves samples from one device to another.

When I run it, the sound that comes out of my speakers is what I would call "scratchy".

I submitted a bug report here, which has recordings of what I hear when I run ./latency:

https://github.com/alsa-project/alsa-lib/issues/53

It was closed by someone named Jaroslav Kysela who is the author of ALSA, according to Wikipedia. But I'm not sure if he read the actual bug report.

I don't know where you got the idea to call snd_pcm_prepare in your loop, or why that fixed the problem.

I hope this is helpful.

Frederick

On Tue, Jun 23, 2020 at 04:54:09PM -0300, Sleep wrote:
>Update, forgot snd_pcm_prepare(), now the problem is that the sound is 
>skipping.
>
>#include <stdlib.h>
>#include <stdint.h>
>#include <alsa/asoundlib.h>
>
>#define STEREO 2
>#define BITS 16 / 8
>#define FRAMEBUFFERSIZE 512 // in samples
>#define PERIODS 2
>#define SAMPLERATE 11025
>
>int main(void)
>{
>    snd_pcm_t *handle;
>    uint32_t channels = STEREO;
>    uint32_t sample_size = BITS; // 16 bit
>    uint32_t frame_size = sample_size * channels;
>    snd_pcm_uframes_t frames = FRAMEBUFFERSIZE;
>    snd_pcm_uframes_t frames_per_period = frames / PERIODS;
>    int dir = 0; // No idea what this does.
>    snd_pcm_hw_params_t *params;
>    int16_t framebuffer[FRAMEBUFFERSIZE * STEREO * BITS] = {0};
>    FILE *wav;
>    int size;
>    int status;
>
>    snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0); // 
>SND_PCM_NONBLOCK);
>    snd_pcm_hw_params_alloca(&params);
>    snd_pcm_hw_params_any(handle, params);
>    snd_pcm_hw_params_set_buffer_size(handle, params, frames);
>    snd_pcm_hw_params_set_period_size(handle, params, 
>frames_per_period, dir);
>    snd_pcm_hw_params_set_rate(handle, params, SAMPLERATE, dir);
>    snd_pcm_hw_params_set_access(handle, params, 
>SND_PCM_ACCESS_RW_INTERLEAVED);
>    snd_pcm_hw_params_set_channels(handle, params, STEREO);
>    snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);
>    snd_pcm_hw_params(handle, params);
>
>    // Insert samples to framebuffer.
>    wav = fopen("pcm1611s.wav", "r");
>    fseek(wav, 0L, SEEK_END);
>    size = ftell(wav);
>    fseek(wav, 0L, SEEK_SET);
>    size /= sizeof(signed short);
>    while (size > 0)
>    {
>        fread(framebuffer, sizeof(int16_t), FRAMEBUFFERSIZE * STEREO * 
>BITS, wav);
>        status = snd_pcm_writei(handle, framebuffer, frames);
>        if (status == -EPIPE)
>        {
>            snd_pcm_prepare(handle);
>        }
>        size -= FRAMEBUFFERSIZE * STEREO * BITS;
>    }
>    snd_pcm_drain(handle);
>    snd_pcm_close(handle);
>    exit(EXIT_SUCCESS);
>}
>
>
>
>_______________________________________________
>Alsa-user mailing list
>[email protected]
>https://lists.sourceforge.net/lists/listinfo/alsa-user
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.