2016-04-28 12 views
1

Ich bin neu bei ALSA und habe es geschafft, PCM-Sound im SND_PCM_ACCESS_RW_INTERLEAVED-Modus zu spielen. Mein Problem ist, dass ich einfach keinen Weg finden kann, diesen Modus für das, was ich versuche, nützlich zu machen. (Wenn mir jemand sagen kann, wie es mir gefällt, lese ich gerne). Ich habe gelesen, dass es diesen MMAP-Modus gibt, aber es ist nicht so einfach, einfache Beispiele dafür zu finden. Ich frage mich, ob es das ist, was ich brauche und wie ich es umsetzen kann.Ist MMAP das, was ich von ALSA brauche, um simultane, sofortige Sounds in meinem Spiel zu spielen?

Was ich tun möchte, ist mein kleines Spiel (ein einfaches Space-Shoot-up), um sofort einen Ton zu spielen, wenn ich schieße oder erschossen werde. Wenn ein Gegner schießt, während ein anderer Ton gespielt wird, sollten sich die Töne summieren und sättigen, aber kein Klangereignis sollte unterbrochen werden. Mit anderen Worten, ich muss in der Lage sein, genau das Byte zu bearbeiten, das gerade gespielt wird.

In meinem nutzlosen Versuch MMAP zu versuchen (ohne wirklich zu wissen, wie es in der Praxis funktioniert, nur vage theoretische Anweisungen folgen), habe ich alles eingerichtet wie für SND_PCM_ACCESS_RW_INTERLEAVED, aber es SND_PCM_ACCESS_MMAP_INTERLEAVED zu ändern. Dann rufe ich snd_pcm_avail_update auf, was zu funktionieren scheint und eine große Anzahl verfügbarer Frames zurückgibt. Danach rufe ich snd_pcm_mmap_begin auf und übergebe die Parameter, die vorher "Frames" mit einer vernünftigen Zahl (z. B. einer 10) füllen. Die Funktion schlägt fehl und gibt einen Fehlercode -77 zurück. Ich habe nicht gefunden, was das bedeutet. Das Bereichs-Array bleibt unverändert.

Was bedeutet dieser Fehler? Wo kann ich eine Liste der Fehler erhalten? Wie kann ich es überwinden? Gibt es ein gutes, einfaches Beispiel dafür, wie man MMAP (oder etwas anderes) benutzt, um etwas mehr oder weniger so zu machen, wie ich es versuche?

Ich schätze Ihre Hilfe :)

Antwort

2

ALSA negative Werte auf Fehler zurückgibt. 77 ist höchstwahrscheinlich EBADFD, was anzeigt, dass sich das Gerät in einem ungültigen Zustand befindet (unter/überläuft oder überhaupt nicht läuft). Im Falle eines Unterlaufs verwenden Sie wahrscheinlich eine zu geringe Puffergröße.

In jedem Fall gibt es keine Möglichkeit, Audiodaten zu ändern, die Sie bereits an den alsa-Treiber gesendet haben (snd_pcm_mmap_commit/writeti/written). Der Trick, um Audio-Sound sofort zu haben, ist nur sehr niedrige Puffergrößen zu verwenden, < 10ms tun. Dazu sollten Sie hw: devices verwenden, andere Gerätetypen fügen Latenz hinzu.

Sie müssen Sounds noch manuell mischen, bevor Sie sie an alsa übergeben. Es gibt ein nettes mmap-Beispiel in den Anmerkungen zu dieser Frage: Alsa api: how to use mmap in c?.

Das gesagt, ALSA ist eine gültige Wahl für diese Art von Anwendung, aber Sie müssen nicht unbedingt Speicherzuordnung verwenden. Lese-/Schreibzugriff führt nicht zu zusätzlicher Latenz, sondern kopiert Audio nur ein wenig mehr.

+0

Vielen Dank. Das war sehr nützlich. Für den Fall, dass jemand es interessant findet, hatte ich zum Zeitpunkt der Lektüre dieser Antwort bereits einen Weg gefunden, mein Problem zu lösen, aber ich konnte immer noch nicht MMAP verwenden. Trotzdem hatte ich nicht gedacht, dass ich einfach niedrige Puffergrößen verwenden könnte. Stattdessen nutze ich mehrere Griffe und behandle jeden als "Kanal", um simultane Sounds zu spielen. Diese Antwort ist genau das, was ich gefragt habe. Ich schätze es. – xlucas