2009-11-16 4 views
1

Lorsque je compile pcm_min.c exemple de ALSA avecAvertissement/erreur de l'exemple pcm_min.c d'ALSA. Problème possible?

gcc -Wall -lasound pcm_min.c -o pcm_min 

Tout va bien, mais en cours d'exécution, je reçois le bruit blanc comme prévu, mais je reçois aussi cet avertissement/erreur:

Short write (expected 16384, wrote 7616) 

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

#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 comprendre pourquoi cet avertissement ou cette erreur se produit?

étreintes, Louise

Répondre

3

La fonction snd_pcm_writei() peut revenir à moins de sizeof(buffer) quand il y a soit un signal reçu ou un anti-encastrement. Dans votre cas, il semble que vous mélangez des octets et des cadres. Le dernier paramètre de l'appel est le nombre d'images que vous avez dans votre tampon. Puisque vous passez le nombre d'octets dans votre tampon à la place, vous voyez un sous-niveau.

+0

Je ne comprends pas ce que vous aimeriez que j'essaie. Pouvez-vous l'expliquer un peu plus? – Louise

+0

J'ai édité ma réponse puisque vous passez le nombre d'octets au lieu du nombre d'images. – Gonzalo

+0

Très cool. Maintenant, ma propre implémentation ne plante pas =) Mais j'ai toujours le même avertissement/erreur. Btw. comment peut-il être, que je n'entends aucun son, si j'enlève la boucle for (et bien sûr en gardant son contenu)? – Louise

1

J'avais aussi quelques problèmes avec cet exemple. Je l'ai modifié un peu et maintenant ça marche.

#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; 
} 
Questions connexes