2013-04-02 2 views
5

Dies ist mein erster Post auf Stackoverflow. Ich versuche, Audio auf Android Smartphone für die letzten Tage zu routen, aber ich finde keine Funktion, um das richtig zu machen.Android - Funktion zum Routen von Audio zwischen Smartphone und Bluetooth-Modul

Es ist für die Herstellung eines Bluetooth Babyphones.

Ich muss ein Routing zwischen Smartphone und Bluetooth-Modul vornehmen. Das Bluetooth-Modul wird zunächst verwendet, um Handset, Autos Handfree, drahtlose Lautsprecher ...

Ich kommuniziere mit A2DP und HFP (Handfree) Profile für die Audio-Seite des Projekts.

Ich kann eine "SCO" Verbindung (Verbindung mit Audio-Bluetooth-Austausch) zwischen Geräten herstellen und Audio vom Bluetooth-Modul zurückbekommen. Aber wenn eine Verbindung "sco" funktioniert, kann ich den Lautsprecher und das Mikrofon auf meinem Smartphone nicht mehr verwenden.

Ich hoffe, eine Lösung zu finden, um Audio auf meinem Smartphone und gleichzeitig das Audio auf meinem Bluetooth-Modul zu verwenden.

Ich suchte auf http://developer.android.com/index.html für eine Funktion, um Audio zu routen.

Die AudioManager-Klasse hat einige Funktionen, um Audio wie setRouting oder setParameters zu routen, aber ich habe noch kein Ergebnis. http://developer.android.com/reference/android/media/AudioManager.html

Sie unter dem Code sehen kann ich von Babyphon Seite Audio zu bekommen verwenden (Bluetooth-Modul Seite):

boolean isRecording=true; 
int buffersize = 8000; 
byte[] buffer = new byte[buffersize]; 

//audio configuration and SCO Bluetooth connection. 
AudioManager aManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
android.os.Process.setThreadPriority(
      android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
aManager.startBluetoothSco(); 
aManager.setBluetoothScoOn(true); 
aManager.setMode(AudioManager.MODE_IN_COMMUNICATION); 

//AudioRecord configuation for recording audio from babyphone. 
AudioRecord arec = new AudioRecord(
      MediaRecorder.AudioSource.VOICE_COMMUNICATION, 
      8000, 
      AudioFormat.CHANNEL_IN_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, 
      buffersize); 

//AudioTrack configuation for sending audio to smartphone speaker.     
AudioTrack atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
       8000, 
       AudioFormat.CHANNEL_OUT_MONO, 
       AudioFormat.ENCODING_PCM_16BIT, 
       buffersize, 
       AudioTrack.MODE_STREAM); 

atrack.setPlaybackRate(8000); 

//start audio recording and playing. 
arec.startRecording(); 
atrack.play(); 

while(isRecording) { 
    arec.read(buffer, 0, buffersize); 

    atrack.write(buffer, 0, buffer.length); 
} 

arec.stop(); 
atrack.stop() 

Wenn ich Smartphone Lautsprecher nicht Audio an und „sco“ -Verbindung in der Verwendung Gleichzeitig, um Audio vom Mikrofon auf der Babyphone-Seite zurückzubekommen, muss ich es so schnell wie möglich wissen, um die Richtung meines Projekts zu ändern.

Das Babyphone-Programm auf der Smartphone-Seite muss nach Möglichkeit auf allen neueren Smartphones laufen.

Englisch ist nicht meine Muttersprache, daher kann ein Satz nicht korrekt sein.

Ich bin offen für jede Lösung.

+0

Irgendein Glück? Ich versuche, das Mikrofon meines Bluetooth-Headsets als PA-System zu verwenden, mit anderen Worten, die Wiedergabe sollte über die Buchse (Ausgang) sein, (ich denke über ein anderes Bluetooth-Gerät wäre unmöglich). Es scheint, als wäre es nicht möglich, dass – Diego

Antwort

1

A2DP ist für Medienwiedergabe und ist in eine Richtung. SCO wird für Sprachanrufe/VoIP/Aufzeichnung über BT verwendet und ist zweiseitig, jedoch von geringerer Qualität.

Was passiert (auf den meisten/alle Geräte, die ich mit mindestens gearbeitet haben), wenn Sie BluetoothSco aktivieren und den Modus auf IN_CALL oder IN_COMMUNICATION ist festgelegt, dass STREAM_VOICE_CALL wird dem BT_SCO Ausgabegerät geleitet werden, und das Eingabegerät wird basierend auf dem Ausgabegerät (wegen des Modus) ausgewählt werden, was das Eingabegerät BT_SCO bedeutet.

Mein Vorschlag - obwohl ich nicht garantieren kann, dass es auf jedem Gerät funktioniert - ist nicht den Modus auf IN_COMMUNICATION. Der setBluetoothScoOn(true) Anruf wird intern die "force use" -Einstellung für die Aufnahme auf BT_SCO einstellen, und die Kombination mit der DEFAULT oder VOICE_RECOGNITION AudioSource sollte das BT_SCO Mikrofon als Aufnahmegerät auswählen.
Die gleichzeitige Aufnahme von BT_SCO und des internen Mikrofons ist jedoch wahrscheinlich nicht tragbar.
Für die Ausgabe könnten Sie die Stream-Typen RING, ALARM oder MUSIC verwenden, die an den internen Lautsprecher und nicht an BT_SCO weitergeleitet werden sollten, wenn kein Sprachanruf erfolgt.

+0

@ user2235813 Vielleicht der AudioSource.CAMCORDER könnte den Trick tun, einen zweiten Recorder zu öffnen, der interne Mikrofon verwendet. – Schlangi

Verwandte Themen