2010-08-09 16 views
10

Ich bin auf der Suche nach einem Weg in Android zu In-Memory-Audio in einer Weise analog zur waveOutOpen Familie von Methoden in Windows-Programmierung zu spielen.Low-Level-Audio-API für Android

Die waveOut... Methoden im Wesentlichen lassen eine Anwendung erstellen Arrays von Beispielwerten (wie In-Memory-WAV-Dateien ohne die Header) und dump sie in eine Warteschlange für die sequenzielle Wiedergabe. Windows wechselt nahtlos von einem Array zum nächsten. Solange die Anwendung Arrays vor der Wiedergabe in die Warteschlange zurücklegt, kann das Programm fortlaufende Audiodaten beliebiger Länge erstellen und wiedergeben. Die Windows-API enthält außerdem einen Rückrufmechanismus, mit dem die Anwendung Fortschritt anzeigen und zusätzliche Puffer laden kann.

Soweit ich das beurteilen kann, ermöglicht es die Android-Audio-API einer Anwendung, eine Datei vom lokalen Speicher oder einer URL oder aus einem Speicherstream abzuspielen. Gibt es eine Möglichkeit, Android dazu zu bringen, Anrufe MediaPlayer.start() "in Warteschlange" zu bringen, so dass ein Spieler (ohne Pannen) in den nächsten übergeht, wenn der Spielablauf abgeschlossen ist? Es scheint, dass Jet so etwas tut, aber nur mit seiner eigenen internen Synthese-Engine.

Gibt es eine andere Möglichkeit, auf Android-Audio in einer waveOutOpen Weise zuzugreifen?

Antwort

9
android.media.AudioTrack 

... ist die Klasse, die Sie wahrscheinlich suchen.

http://developer.android.com/reference/android/media/AudioTrack.html#AudioTrack%28int,%20int,%20int,%20int,%20int,%20int%29

Nach dem Erstellen füttern Sie es einfach mit binären Daten mit bestimmtem Format folgende Methode:

genau sieht
AudioTrack.writeTo(...) 
+0

Danke, das wie das, was ich suchte. Weißt du, ob das im Emulator funktioniert? In Windows Mobile funktionierten die waveOutWrite-Methoden nur im Emulator (viele Pausen und Stottern), während sie in den echten Geräten funktionierten. – MusiGenesis

+0

Ich habe es nicht persönlich versucht, aber ich fand es, als ich nach einer Möglichkeit suchte, MP3-Inhalte aus einem Stream abzuspielen. Die Verwendung von MediaPlayer im Emulator funktioniert einwandfrei, es sei denn, Sie haben eine Verbindung zum debugger. Es kann ähnlich sein mit AudioTrack. – plugmind

+0

Ich bin mir ziemlich sicher, dass sowohl der MediaPlayer als auch der SoundPool (ich kenne diesen Punkt schon früher) heute AudioTrack intern verwenden, also würde ich sagen, dass es definitiv läuft (besonders wenn es darum geht, wie es läuft) auch meinen eigenen Code). –