ALSA: les Moyens de prévenir contre les ruptures de pour haut-parleur
Je suis de la lecture d'un seul canal audio en non-mode entrelacé. Je suis contre les ruptures quand je suis en train d'écrire des données audio en haut-parleur : ALSA lib pcm.c:7339:(snd_pcm_recover) underrun occurred
Voici comment j'écris:
printf("%d",snd_pcm_avail (spkhandle));
ret = snd_pcm_writen(spkhandle, pSpeakerBuf , framesIn18Millisec);
if(ret < 0)
{
snd_pcm_recover(spkhandle, ret, 0);
}
Quelles sont les différentes façons/paramètres de configurations pour éviter ALSA en vertu de l'exécuter ?
(Je suis sous Linux 3.0, BRAS )
Edit:
Voici un tampon de mesure à l'aide de snd_pcm_avail() de l'API
snd_pcm_avail = 2304 << snd_pcm_writen call 1 success
snd_pcm_avail = 2160 << snd_pcm_writen call 2 success
snd_pcm_avail = 2016 << snd_pcm_writen call 3 success
snd_pcm_writen error -32 Broken pipe << snd_pcm_writen call 4 failure
ALSA lib pcm.c:7339:(snd_pcm_recover) underrun occurred << And displays this message
Ici est la sortie que Marko a demandé:
snd_output_t* out;
....
//Do alsa parameters init ....
....
snd_output_stdio_attach(&out, stderr, 0);
snd_pcm_dump_sw_setup(spkhandle, out);
tstamp_mode : NONE
period_step : 1
avail_min : 144
period_event : 0
start_threshold : 288
stop_threshold : 2304
silence_threshold: 0
silence_size : 0
boundary : 1207959552
A votre fil obtenu priorité d'ordonnancement temps réel?
Oui, j'ai donné de planification en temps réel des priorités SCHED_FIFO.
Quelle est votre période tampon relative de la période de notification?
Je suis nouveau sur alsa. J'écris 18 millisecondes audio en un seul haut-parleur de canal (comme à mon habitude système intégré de demandes de 18ms). Comme vous pouvez le voir dans la question, snd_pcm_avail diminue de 144 octets. Comment faire pour éviter cela ?
Vous vous attendez à l'espace disponible pour les échantillons dans la mémoire tampon à une diminution de l'écriture en elle - mais en un peu plus de 144 images pour 18ms. Pourriez-vous mettre un appel à
Oui, j'ai donné de planification en temps réel des priorités SCHED_FIFO.
Quelle est votre période tampon relative de la période de notification?
Je suis nouveau sur alsa. J'écris 18 millisecondes audio en un seul haut-parleur de canal (comme à mon habitude système intégré de demandes de 18ms). Comme vous pouvez le voir dans la question, snd_pcm_avail diminue de 144 octets. Comment faire pour éviter cela ?
Vous vous attendez à l'espace disponible pour les échantillons dans la mémoire tampon à une diminution de l'écriture en elle - mais en un peu plus de 144 images pour 18ms. Pourriez-vous mettre un appel à
snd_pcm_dump_sw_setup()
dans votre code quelque part avant que démarre l'audio, et de partager la sortie de la console avec nous?
OriginalL'auteur Lunar Mushrooms | 2013-01-30
Vous devez vous connecter pour publier un commentaire.
Je suppose que ce code s'exécute dans une boucle serrée, et est destiné à bloquer sur
snd_pcm_writen()
. La fréquence d'échantillonnage n'est pas donné; je suppose 48 khz depuis le tous les numéros de diviser joliment.Ce que je pense, ici, est comme suit:
snd_pcm_write()
ne garantit pas à écrire toutes les images fournies (la valeur de retour n'est jamais vérifié les conditions d'erreurs). À en juger par l'enregistrement desnd_pcm_avail()
c'est en fait de consommeravail_min
ou144
images sur chacun d'eux. C'est 3ms de l'audio.start_threshold
- à288
échantillons; sortie audio commenceprintf()
bloc, et je crois me souvenir quesnd_pcm_avail()
a à se synchroniser avec la sortie audio de matériel et peut également bloquer. Puisque vous êtes maintenant 6ms à l'avance de la lecture, il est tout à fait possible que la mémoire tampon est en cours d'exécution à sec pendant le temps de la troisième appel desnd_pcm_writen()
En résumé, vous ne devriez pas appeler
printf()
à ce point, et vous avez probablement besoin de compenser pour le fait qu'snd_pcm_writen()
n'est pas consommer toutes les images danspSpeakerBuf
Désolé, comment vous êtes-vous et comment l'avez-vous mise à jour de votre pilote alsa?
OriginalL'auteur marko
C'est le problème de mémoire tampon,Vous pouvez essayer d'augmenter la taille de la mémoire tampon par une mention explicite dans votre ~/.asoundrc fichier ?
OriginalL'auteur Rahul