Le sens de la période dans ALSA

J’utilise ALSA pour et l’application audio sur Linux, j’ai trouvé d’excellents documents expliquant comment l’utiliser: 1 et celui-ci . bien que j’ai quelques problèmes à comprendre cette partie de la configuration:

/* Set number of periods. Periods used to be called fragments. */ if (snd_pcm_hw_params_set_periods(pcm_handle, hwparams, periods, 0) < 0) { fprintf(stderr, "Error setting periods.\n"); return(-1); } 

ce qui signifie définir un certain nombre de périodes lorsque j’utilise le mode LECTURE et:

 /* Set buffer size (in frames). The resulting latency is given by */ /* latency = periodsize * periods / (rate * bytes_per_frame) */ if (snd_pcm_hw_params_set_buffer_size(pcm_handle, hwparams, (periodsize * periods)>>2) < 0) { fprintf(stderr, "Error setting buffersize.\n"); return(-1); } 

et la même question ici sur la latence, comment devrais-je le comprendre? Merci d’avance pour votre aide !

    Je suppose que vous avez lu et compris cette section de linux-journal . Vous pouvez également constater que ce blog clarifie des choses en ce qui concerne la sélection de la taille de la période (ou du fragment dans le blog) dans le contexte d’ALSA. Citer:

    Vous ne devez pas abuser de la logique des fragments des périphériques audio. C’est comme ça:

    La latence est définie par la taille du tampon.
    L’intervalle de réveil est défini par la taille du fragment.

    Le niveau de remplissage de la mémoire tampon oscillera entre la «mémoire tampon complète» et la «mémoire tampon complète moins la taille des fragments 1x moins la latence de planification du système d’exploitation». Définir des tailles de fragment plus petites augmentera la charge du processeur et réduira le temps de la batterie puisque vous forcez le processeur à se réveiller plus souvent. Il augmente la sécurité des abandons, puisque vous remplissez le tampon de lecture plus tôt. Choisir la taille des fragments est donc quelque chose que vous devriez faire en équilibrant vos besoins entre la consommation d’énergie et la sécurité des abandons. Avec les processeurs modernes et un bon ordonnanceur de système d’exploitation tel que celui de Linux, définir la taille du fragment sur une valeur autre que la moitié de la taille du tampon n’a pas beaucoup de sens.

    … (Oh, ALSA utilise le terme “période” pour ce que j’appelle “fragment” ci-dessus. C’est également synonyme)

    Donc, essentiellement, vous définissez généralement la period à 2 (comme cela a été fait dans le guide référentiel). Ensuite, periodsize * period est la taille totale de votre tampon en octets. Enfin, la latence est le délai induit par la mise en mémoire tampon de ces nombreux échantillons et peut être calculé en divisant la taille du tampon par la vitesse à laquelle les échantillons sont lus (c.-à-d. latency = periodsize * periods / (rate * bytes_per_frame) dans les commentaires du code).

    Par exemple, les parameters du howto :

    • période = 2
    • périodicité = 8192 octets
    • taux = 44100Hz
    • Données stéréo 16 bits (4 octets par image)

    correspond à une taille de tampon totale de la period * periodsize = 2 * 8192 = 16384 octets et une latence de 16384 / (44100 * 4) ~ 0,093` secondes.

    Notez également que votre matériel peut avoir certaines limitations de taille pour la taille de période prise en charge (consultez ce guide de dépannage ).

    Lorsque l’application essaie d’écrire des échantillons dans le tampon, le processus se met en veille si le tampon est déjà plein. Il est réveillé par le matériel via une interruption; cette interruption est levée à la fin de chaque période.

    Il devrait y avoir au moins deux périodes par tampon; sinon, le tampon est déjà vide quand un réveil se produit, ce qui entraîne une sous-utilisation.

    L’augmentation du nombre de périodes (c.-à-d. La réduction de la taille de la période) augmente la marge de sécurité contre les dépassements dus aux retards de planification ou de traitement.

    La latence est juste proportionnelle à la taille du tampon: lorsque vous remplissez complètement le tampon, le dernier échantillon écrit est lu par le matériel uniquement après que tous les autres échantillons ont été lus.