Quelqu'un peut-il expliquer comment SND_PCM_WRITEI < Pré> xxx pré>
fonctionne? p>
Je l'ai utilisé comme: p> code source complet à Cela signifie-t-il que je ne devrais pas donner sample_rate * latency = Si je par exemple ont:
Sample_Rate = 44100
Latence = 0.5 [S]
all_frame = 100000 p> Le nombre de cadres que je devrais donner à Sample_rate * latence = cadres
44100 * 0.5 = 22050 P> et le nombre d'itérations Le pour-boucle devrait être?: P> (int) 100000/22050 = 4; avec des cadres = 22050 p> et un extra, mais uniquement avec p> 100000 mod 22050 = 11800 p> cadres? p> est-ce comment fonctionne? p> Louise p> http://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html#GF13067C0EBDE29138CA05AF76E5B17A9 P> P> snd_pcm_writei () code> le nombre de
tous les cadres dans tampon code>, mais uniquement p> images code> p> snd_pcm_writei () code> serait p>
4 Réponses :
les cadres em> doivent être le nombre de cadres (échantillons) que vous souhaitez écrire depuis le tampon. Le pilote de son de votre système commence à transférer ces échantillons à la carte son tout de suite, et ils seront joués à un taux constant. P>
La latence est introduite à plusieurs endroits. Il y a de la latence des données tamponnées par le conducteur en attendant d'être transférée sur la carte. Il y a au moins un tampon rempli de données transférées à la carte à un moment donné, et il y a la mise en mémoire tampon du côté de l'application, ce qui est ce que vous semblez être préoccupé. P>
Pour réduire la latence du côté de l'application, vous devez écrire le plus petit tampon qui fonctionnera pour vous. Si votre application effectue une tâche DSP, c'est-à-dire une seule fenêtre de données de la fenêtre. P>
Il n'y a pas d'avantage en écrivant de petits tampons dans une boucle - il suffit d'aller de l'avant et d'écrire tout en une fois - mais il y a un point important pour comprendre: minimiser la latence, votre application doit écrire sur le pilote no pas plus rapidement que le conducteur données sur la carte son, ou vous allez finir par accumuler plus de données et accumuler de plus en plus de latence. P>
Pour une conception qui permet de produire des données dans Lockstep avec le pilote de son relativement facile, regardez Jack ( http://jackaudio.org / ) qui est basé sur l'enregistrement d'une fonction de rappel avec le moteur de lecture sonore. En fait, vous êtes probablement tout simplement préférable d'utiliser Jack au lieu d'essayer de le faire vous-même si vous êtes vraiment préoccupé par la latence. P>
Je n'ai besoin que de jouer ~ 17000 cadres, alors la latence du côté de l'application irait bien. La chose la plus étrange est que si je donne snd_pcm_writei () toutes les cadres et supprimez la boucle pour la boucle, rien n'est joué. Si je garde la boucle pour la boucle et par exemple. Définissez-le sur 5 itérations, il boucle deux fois les deux cadres. Si je regarde dans l'exemple de Libsndfile à la ligne 11, Pastebin.com/m559397B3 , il parcourt le tampon. Quand je fais ça, rien n'est joué. De plus, ce que je trouve étrange, c'est que SND_PCM_WRITEI () renvoie toujours le même nombre de cadres que je lui donne. Cela ne retourne jamais un nombre inférieur, ce que j'attendrais. ?
17000 échantillons représentent moins d'une seconde de lecture. En écrivant le tampon à plusieurs reprises sur le pilote de son, vous la jouez fondamentalement encore et encore, mais à partir de votre description, il semble que quelque chose sur votre système empêche le début du son de jouer. Tout d'abord, entrez le tampon est la bonne chose à faire; Vous n'avez pas besoin d'écrire un échantillon plus d'une fois. Deuxièmement, pour voir si votre pilote de son ou votre carte son ne parvient pas à jouer au début du son, essayez de remplir votre tampon avec environ une seconde de 0 échantillons au début, et voyez si cela fait une différence.
Merci beaucoup d'avoir nettoyé tout cela. Maintenant, lorsque vous en parlez, j'ai des problèmes d'audio lors de la lecture de ALSA à par ex. Mplayer. Les 2 premières secondes ou donc rien ne sont joués, puis il joue. Je vais essayer de passer à Fedora 12, puis j'essaye à nouveau. Merci encore =)
Je voudrais ajouter que les cadres sont égaux numériques_of_semples / canaux.
J'ai fait des tests pour déterminer pourquoi i Définir la vitesse sur Pour donner au périphérique suffisamment de temps pour convertir les données en Audio, j'ai été utilisé A pour la boucle après la Après les tests, je devais conclure que le code de l'échantillon n'a pas fourni suffisamment d'échantillons pour surmonter la latence de l'appareil avant que la fonction snd_pcm_writei () code> ne semblait pas fonctionner pour moi en utilisant plusieurs exemples que j'ai trouvés dans les tutoriels Alsa et ce que j'ai conclu était que les exemples simples faisaient un < Code> snd_pcm_close () code> avant que le périphérique sonore puisse lire le flux complet l'a envoyé. P>
11025 CODE>, a utilisé un tampon aléatoire 128 octets et pour la boucle snd_pcm_writei () code> pour 11025/128 pour chaque seconde du son. Deux secondes requises 86 * 2 appels snd_pcm_write () code> pour obtenir deux secondes de son. P>
snd_pcm_writei () code> boucle pour retarder l'exécution du snd_pcm_close () Code> Fonction. P>
snd_pcm_close code> a été appelée qui implique que la fonction de fermeture a moins de latence que la < Code> snd_pcm_write () code> fonction. p>
Je pense que la fermeture de périphérique "prématurée" est que vous devez appeler snd_pcm_drain (poignée); code> avant snd_pcm_close (poignée); CODE> Pour que tout Les données sont jouées avant la fermeture du périphérique. P>
Si le seuil de démarrage du pilote ALSA n'est pas défini correctement (si dans votre cas, il est environ 2s), vous devrez appeler SND_PCM_START () pour lancer le rendu des données immédiatement après SND_PCM_WRITEI (). Ou vous pouvez définir le seuil approprié dans les paramètres SW du périphérique ALSA. P>
ref: p>