0 votes

Avertissement/erreur dans l'exemple pcm_min.c d'ALSA. Problème possible ?

Lorsque je compile le fichier pcm_min.c exemple avec

gcc -Wall -lasound pcm_min.c -o pcm_min

Tout va bien, mais en l'exécutant, j'obtiens le bruit blanc comme prévu, mais j'obtiens aussi cet avertissement/erreur :

Short write (expected 16384, wrote 7616)

Ce qui vient de la dernière déclaration "if".

#include <alsa/asoundlib.h>

static char *device = "default";                        /* playback device */

snd_output_t *output = NULL;
unsigned char buffer[16*1024];                          /* some random data */

int main(void)
{
        int err;
        unsigned int i;
        snd_pcm_t *handle;
        snd_pcm_sframes_t frames;

        for (i = 0; i < sizeof(buffer); i++)
                buffer[i] = random() & 0xff;

        if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
                printf("Playback open error: %s\n", snd_strerror(err));
                exit(EXIT_FAILURE);
        }
        if ((err = snd_pcm_set_params(handle,
                                      SND_PCM_FORMAT_U8,
                                      SND_PCM_ACCESS_RW_INTERLEAVED,
                                      1,
                                      48000,
                                      1,
                                      500000)) < 0) {   /* 0.5sec */
                printf("Playback open error: %s\n", snd_strerror(err));
                exit(EXIT_FAILURE);
        }

        for (i = 0; i < 16; i++) {
                frames = snd_pcm_writei(handle, buffer, sizeof(buffer));
                if (frames < 0)
                        frames = snd_pcm_recover(handle, frames, 0);
                if (frames < 0) {
                        printf("snd_pcm_writei failed: %s\n", snd_strerror(err));
                        break;
                }
                if (frames > 0 && frames < (long)sizeof(buffer))
                        printf("Short write (expected %li, wrote %li)\n", (long)sizeof(buffer), frames);
        }

        snd_pcm_close(handle);
        return 0;
}

Quelqu'un peut-il expliquer pourquoi cet avertissement/cette erreur se produit ?

Je vous embrasse, Louise

2voto

Gonzalo Points 11758

En snd_pcm_writei() peut renvoyer moins que sizeof(buffer) lorsqu'il y a un signal reçu ou un dépassement. Dans votre cas, il semble que vous mélangiez les octets et les trames. Le dernier paramètre de l'appel est le nombre de trames que vous avez dans votre tampon. Comme vous transmettez le nombre d'octets dans votre tampon, vous constatez un dépassement de capacité.

0voto

Lesswire Points 157

J'ai également rencontré quelques problèmes avec cet exemple. Je l'ai légèrement modifié et il fonctionne désormais.

#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>

static char *device = "default"; /* playback device */
snd_output_t *output = NULL;
unsigned char buffer[16*1024]; /* some random data */
int main(void)
{
int err;
unsigned int i;
snd_pcm_t *handle;
snd_pcm_sframes_t frames;
snd_pcm_uframes_t bufferSize, periodSize;

for (i = 0; i < sizeof(buffer); i++)
    buffer[i] = random() & 0xff;
if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
    printf("Playback open error: %s\n", snd_strerror(err));
    exit(EXIT_FAILURE);
}
if ((err = snd_pcm_set_params(handle,
    SND_PCM_FORMAT_S16_LE,
    SND_PCM_ACCESS_RW_INTERLEAVED,
    1, //channels
    44100, //sample rate
    1, //allow resampling
    500000) //required latency in us
   ) < 0) {
    printf("Playback open error: %s\n", snd_strerror(err));
    exit(EXIT_FAILURE);
}

if ((err = snd_pcm_prepare(handle)) < 0) {
    printf("Pcm prepare error: %s\n", snd_strerror(err));
    exit(EXIT_FAILURE);
}

if ((err = snd_pcm_get_params( handle, &bufferSize, &periodSize )) < 0) {
    printf("Pcm get params error: %s\n", snd_strerror(err));
    exit(EXIT_FAILURE);
}
printf("Buffer size:%d, Period size:%d\n", (int)bufferSize, (int)periodSize);

for (i = 0; i < 16; i++) {
    frames = snd_pcm_writei(handle, buffer, periodSize);
    if (frames < 0)
        frames = snd_pcm_recover(handle, frames, 0);
    if (frames < 0) {
        printf("snd_pcm_writei failed: %s\n", snd_strerror(err));
        break;
    }
    if (frames > 0 && frames < (long)periodSize)
        printf("Short write (expected %li, wrote %li)\n", (long)sizeof(buffer), frames);
}
snd_pcm_close(handle);
return 0;

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X