Schwierigkeiten beim Portieren von roher PCM-Ausgabecode von Java auf Android AudioTrack API

8

Ich versuche, eine Anwendung zu portieren, die Chiptunes (NSF, SPC, usw.) Musikdateien von Java SE auf Android spielt. Der Android-API fehlen offenbar die Java-Multimedia-Klassen, die diese Anwendung zur Ausgabe von PCM-Rohaudio verwendet. Das nächste Analog, das ich in der API gefunden habe, ist AudioTrack und damit habe ich mich gewehrt.

Wenn ich jedoch versuche, eine meiner Sample-Musikdateien über meinen Port-in-Progress abzuspielen, ist alles, was ich zurückbekomme, statisch. Mein Verdacht ist, dass es der AudioTrack ist, den ich eingerichtet habe, der Schuld ist. Ich habe verschiedene Konstruktoren ausprobiert, aber am Ende wird alles nur statisch ausgegeben.

Das DataLine-Setup im ursprünglichen Code ist etwas wie:

%Vor%

Der Konstruktor, den ich gerade benutze, ist:

%Vor%

Ich habe Konstanten und Variablen in diesen so ersetzt, dass sie so knapp wie möglich Sinn ergeben, aber meine grundlegende Frage ist, ob es offensichtliche Probleme in den Annahmen gibt, die ich gemacht habe, wenn ich von einem Format zum anderen gehe.

    
alexanderfb 25.04.2010, 05:50
quelle

1 Antwort

7

Ich hatte also heute etwas Zeit, um das genauer zu betrachten, und ich denke, ich habe es geschafft. Die AudioFormat-Deklaration im ersten Codebeispiel oben hat den big-endian-Parameter auf "true" gesetzt, aber Android AudioTrack erwartet PCM-Daten im Little-Endian-Format.

Also habe ich eine kurze kleine Schleife geschrieben, um meine Ahnung so zu testen:

%Vor%

Im Grunde dreht diese Schleife die Bytes jedes (16-Bit) -Sample im Puffer um. Das funktioniert großartig, außer dass es ein wenig abgehackt ist, da es furchtbar ineffizient ist. Ich habe versucht, einen ByteBuffer zu verwenden, aber das scheint die Bytes in den einzelnen Samples nicht zu spiegeln.

Ich werde mir noch etwas überlegen, aber das Grundproblem ist gelöst. Hoffe, jemand anderes findet das nützlich!

    
alexanderfb 28.04.2010, 08:18
quelle

Tags und Links