2016-05-11 13 views
0

Ich benutze alsa in Arm Linux 3.10. Es gibt 3 drahtlose Geräte: zwei erfassen und senden PCM mit snd_pcm_readi und sendmsg und eins als Empfänger, Wiedergabe, was mit snd_pcm_writei empfangen wurde.alsa snd_pcm_wreitei underrun Fehler

Hier ist die Prozedur: Programme funktioniert gut, während 1 Sender und 1 Empfänger. Aber wenn ich den ersten Sender stoppe und den zweiten Sender starte, hat die Empfängerseite einen Unterlauffehler. Für jeden Sender hat der Empfänger einen eindeutigen PCM-Handle, um mit Daten umzugehen. Und alle Seiten verwenden die gleiche Konfiguration, außer dass das Handle des Senders mit dem Namen default[snd_pcm_open(pcm_handle, "default", stream,0)] geöffnet ist und das Handle des Empfängers plug:dmix verwendet. [snd_pcm_open(pcm_handle, "plug:dmix", stream,0)]

while(1) 
{ 
    recv_from(); 
    if sender one or two's first packet 
    alsa init handle1 or handle2 
    int err = snd_pcm_writei(handle1 or 2, buffer, 224); 
    if(err == -EPIPE) 
    { 
    fprintf(stderr, "underrun occurred\n"); 
    snd_pcm_prepare(handle); 
    continue; 
    } 
} 

Der Zweck ist der Empfänger in der Lage zu machen für beide Sender gemischten Ton zu spielen. Kann mir jemand dabei helfen, ich bin neu in alsa Programmierung. Danke im Voraus!

Antwort

0

Ich könnte das Problem gefunden haben. Der Standard-Startschwellenwert in der Konfiguration ist 1. Und wenn ich dies auf n-mal meiner Schreib-Frames setze (n = 4 ist was ich verwendet habe), fällt der Unterlauf-Fehler auf seine Vorkommen. Nur einmal in einigen Minuten kann ein Unterlauf auftreten. Ich nehme an, das Problem ist, dass die Soundkarte versucht, Frames zu erhalten, während die Puffergröße größer als 1 (Schwelle) ist.