Chapitre 3. PCM capture

Il n'est pas possible d'utiliser un pcm_handle pour la lecture et la capture. Ainsi vous devez configurer deux handles si vous voulez accéder au dispositif PCM dans les deux directions. La fonction :

     snd_pcm_open

doit être défini avec le stream réglé en

     snd_pcm_stream_capture.

    /* Capture stream */
    snd_pcm_stream_t stream_capture = SND_PCM_STREAM_CAPTURE;

Les autres paramètres sont identique à ceux pour la lecture. Pour le mode de capture interleaved, il faut

    /* Read num_frames frames from the PCM device  */
    /* pointed to by pcm_handle to buffer capdata. */
    /* Returns the number of frames actually read. */
    snd_pcm_readi(pcm_capture_handle, capdata, num_frames);

Pour noninterleaved

    /* Read num_frames frames from the PCM device  */         
    /* pointed to by pcm_handle to buffer capdata. */      
    /* Returns the number of frames actually read. */   
    snd_pcm_readn(pcm_capture_handle, capdata, num_frames);

Comme dans le cas de la lecture, nous devons faire attention que l'application appelle la fonction lecture avant que le buffer capture de la carte son soit complètement rempli. Autrement il y aura un buffer overrun (dépassement de la mémoire tampon).

    int pcmreturn;

    while ((pcmreturn = snd_pcm_readi(pcm_capture_handle, capdata, periodsize>>2)) < 0) {
      snd_pcm_prepare(pcm_capture_handle);
      fprintf(stderr, "------------------------------------- Buffer Overrun ------------------------------------------\n");
    }