2014-01-23 11 views
8

Ich habe eine App, die aufgenommene Audiodateien sowie wiederholte Audiodateien wiedergibt. Die Sounds werden korrekt über den integrierten iPad-Lautsprecher wiedergegeben, und wenn ich ein Kabel von der Kopfhörerbuchse an meinen Stereo-Audioeingang anschließe, spielt es auch gut. Wenn ich mein iPad mit meinem Bluetooth-Stereo-Eingang koppeln, funktionieren alle Töne meiner anderen Apps (geschrieben für iPhone, auf meinem iPad) genauso gut wie alle anderen Töne von meinem Gerät.AVAudioPlayer und AVAudioSession spielen nicht auf BlueTooth-Stereo auf dem iPad (2 oder nicht)

Das Problem ist meine App geschrieben für iPad spielt nicht über den Bluetooth-Pfad, sondern spielt stattdessen von den eingebauten Lautsprechern.

NSError *error = nil; 
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeDefault error:&error]; 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]; 
[[AVAudioSession sharedInstance] setActive:YES error:&error]; 

keine Fehler zurückgegeben Dieser Code wird aufgerufen und es gibt:

In meinem AppDelegate in der didFinishLaunchingWithOptions (...) Methode, habe ich folgendes gelegt.

In meinem Controller-Code, ich habe Proben aufgezeichnet, die ich AVAudioPlayer spielen wie folgt verwendet:

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordURL error:&error]; 
audioPlayer.numberOfLoops = 0; 
[audioPlayer setDelegate:self]; 
[audioPlayer play]; 

In anderen Bereichen, ich habe Drohnen, die in einem Gewinde gesteuerten Schleife kurze 0,01 Sekunden Töne wiederholt spielen und Ich mache dies mit OpenAL:

alSourcePlay(sourceID); 

Dies ist der gleiche Code wie ich in meinen anderen Apps für iPhone geschrieben, die wie gewünscht funktioniert.

Ich weiß, dass es andere Threads in Bezug auf Bluetooth-Eingabe gibt, aber ich habe ein spezifisches Problem mit der Bluetooth-Ausgabe von Audio-Sounds aus meiner iPad App.

+1

Neben Ihrer Frage wird AVAudioSessionCategoryPlayAndRecord das Ausgabevolumen verringern. Wenn Sie nicht VOIP (oder eine andere Aufnahme und gleichzeitig spielen) tun, vermeiden Sie es, Ihre Kategorie auf diese einzustellen. –

+0

Entdeckt ein bisschen mehr Informationen. Ich habe meine AVAudioSession eingerichtet, bevor ich OpenAL konfiguriert habe. Wenn Sie die AVAudioSession-Informationen danach einstellen (alle in der viewDidLoad, nur jetzt am Ende), wird das Audiosignal jetzt an die Bluetooth-Lautsprecher ausgegeben. Jetzt kann ich jedoch nicht aufnehmen. Ich finde, dass es einen Konflikt zwischen Ausgabe zu Bluetooth und Eingabe vom eingebauten Mikrofon geben kann. Irgendwelche Vorschläge? – Cal30

Antwort

1

Nicht möglich.

Vom sehr interessant Apple-doc AVAudioSession - Auswahl eines Mikrofons QA1799:

Wenn eine Anwendung der setPreferredInput verwendet: Fehler: Verfahren zur Herstellung eines Bluetooth HFP-Eingang zu wählen, wird die Ausgabe automatisch auf die Bluetooth HFP Ausgabe geändert werden . Wenn Sie einen Bluetooth-HFP-Ausgang mit dem Routenwähler des MPVolumeView auswählen, wird automatisch die Eingabe des Bluetooth-HFP-Eingangs geändert.Daher landen sowohl der Eingang als auch der Ausgang immer auf dem Bluetooth HFP-Gerät, obwohl nur der Eingang oder Ausgang einzeln eingestellt wurde.

+0

Danke Andrew. Das ist, wovor ich Angst hatte. Ich hoffe, dass Apple dies irgendwann (in naher Zukunft) ändern kann, um die Ausgabe an BlueTooth zu ermöglichen und gleichzeitig das eingebaute Mikrofon für die Eingabe zu behalten. Werde das als Antwort wählen ... auch wenn es nicht die Antwort ist, auf die ich gehofft habe (Grinsen). – Cal30

2

Da Ihre Kategorie "Play and Record" ist, müssten Sie Bluetooth als Eingabe aktivieren, damit es als Ausgabe unterstützt wird (standardmäßig wird derselbe Receiver für die Ein-/Ausgabe im Play- und Record-Modus verwendet) . Um das zu tun, würden Sie eine zusätzliche Eigenschaft auf Ihrem AVAudioSession einstellen:

UInt32 allowBluetoothInput = 1; 
AudioSessionSetProperty (
         kAudioSessionProperty_OverrideCategoryEnableBluetoothInput, 
         sizeof (allowBluetoothInput), 
         &allowBluetoothInput 
         ); 

Sie auch überprüfen möchten, dass Sie nicht die Ausgabe an die Lautsprecher in Ihrem Code an beliebiger Stelle gebaut Kraft hat, durch Setzen Sie die Eigenschaft kAudioSessionProperty_OverrideCategoryDefaultToSpeaker auf Ihre Sitzung.

+0

Versucht dies aber keine Änderung. Ich habe das override-enable-Bluetooth direkt vor dem Aufruf von setActive (...) hinzugefügt. Ich habe den ganzen Code überprüft und no, wo ich DefaultToSpeaker einstelle. – Cal30

+1

Ich weiß nicht, ob Sie eine Aufzeichnung benötigen, aber für den Zweck dieses Tests könnten Sie die Sitzung auf 'AVAudioSessionCategoryPlayback' einstellen und sehen, ob das irgendeine Änderung macht? –

+0

Hat keinen Unterschied gemacht, und ja, ich muss in der Lage sein, die Ausgabe gleichzeitig mit der Aufnahme zu spielen. Dies ist eine Musik-App, die ein metronomisches Ticken vornimmt und den Benutzer aufnimmt. Willst du sowohl ticken als auch Musiker live hören? Arbeitete gut mit no-Bluetooth ... aber Bluetooth-Ausgabe war das erste Problem. Nun scheint es tatsächlich, dass es einen Konflikt zwischen Bluetooth-Audio-Ausgang und eingebautem Mikrofon-Eingang gibt. Alles ist auf einem iPad ... nicht iPhone (wenn das der Diskussion hilft). – Cal30

2

Dies ist die Lösung im Moment, aber ist veraltet und jeder kennt die neue Lösung, aber fügen Sie diesen Teil des Codes jetzt auf Ihrer App und alles funktioniert sehr gut!

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); 
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

Hoffe, dass diese Ihnen helfen!

1

Haben Sie mit setCategory withOptions nachgesehen? Sein Start von iOS 6

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error]; 
+0

Ja, ich habe und immer noch nicht funktioniert. Es scheint, dass es eine Verwirrung ist, wenn der Eingang vom eingebauten Mikrofon kommt und der Ausgang zu Blue Tooth ist. – Cal30