| 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(¶ms);
> 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
>