AudioSessionSetActive schlägt nach der Unterbrechung fehl

8

Ich habe versucht herauszufinden, was tatsächlich seit Wochen passiert, und ich habe keine Ahnung, warum ich die Wiedergabe nach der Unterbrechung nicht fortsetzen kann, also kennen Sie wahrscheinlich eine Antwort. AudioSessionSetActive (TRUE) gibt immer '! Cat' zurück, das ist kAudioSessionIncompatibleCategory während der Reaktivierung, wenn meine App im Hintergrund spielt und ich in einer anderen App bin. Es funktioniert zwar gut und setzt die Wiedergabe fort, wenn ich in meiner App unterbrochen wurde.

Im Originalcode sind alle AudioSession- und AudioQueue-Aufrufe in Makros eingeschlossen, die OSStatus drucken, wenn es einen Fehler bedeutet, aber ich habe es aus Gründen der besseren Lesbarkeit entfernt. Außerdem schaltet [self pause] nur die Pause ein, also ruft es AudioQueueStart (audioQueue, NULL) auf upause auf, funktioniert aber natürlich nicht, wenn AudioSession fehlschlägt.

Audio Session-Initialisierungscode:

%Vor%

Unterbrechungshandlercode:

%Vor%

Diesen Streamer-Quellcode finden Sie hier Ссылка , wenn es so ist werde irgendwie helfen, ein Problem zu lösen ..

    
Andy 27.10.2011, 21:06
quelle

6 Antworten

3

Wenn Sie die AudioQueue-API verwenden, müssen Sie einige zusätzliche Schritte ausführen, die von einem gewissen Faktor abhängen. Ich habe das nie gemacht, deshalb überlasse ich dem Experten die Erklärung:
Es gibt ein Video zu diesem Thema auf der Apple Developer Website, das genau dieses Problem behandelt. WWDC 2010 Session 412 Audio Entwicklung für iPhone OS Teil 1 um die 45. Minute haben Sie eine ziemlich gute Erklärung in dieser Angelegenheit.

    
Vincent Bernier 04.11.2011 15:34
quelle
2

Ich hatte ein Problem. Wenn der Alarm während des App-Laufs kommt, drückt der Benutzer einfach den Netzschalter des Geräts, so dass er schlafen geht. Dann, nach der Wiederaufnahme aus dem Schlaf, scheitert meine AudioSessionSetActive mit etwas wie " this audiosession type can't be used ". Ich habe versucht, set audiosession Eigenschaft vor AudioSessionSetActive(true) in Interruptionlistener hinzuzufügen, aber kein Glück. Endlich habe ich

hinzugefügt %Vor%

ftw)

%Vor%

und es hat mein Problem gelöst.

    
NoAngel 13.12.2012 11:19
quelle
0

Aktivieren Sie AudioSession in sonst, wenn wie folgt aussehen:

%Vor%

Aber ich glaube, das funktioniert vielleicht nicht, weil in meinem Fall, wenn ich im Hintergrund war, es keine Sitzung gab. Aber versuchen Sie das aurioTouch Beispiel von Apple zu analysieren und gehen Sie nur durch AppDelegate file und Versuche, (void)rioInterruptionListener method zu analysieren, was das gleiche Problem erklärt.

Verwenden Sie Live-Streaming von Audio? dann würde ich dir empfehlen, meine Frageantwort durchzugehen, wo ein Problem des Warteschlangenanfangs gelöst wird indem ich den Fehler behandle, wie er in meiner Antwort angegeben ist.

Ich hoffe, dass Ihnen das hilfreich sein könnte.

    
DShah 30.10.2011 16:57
quelle
0

Die kAudioSessionEndInterruption kann Ihren Code treffen oder auch nicht, es ist keine zuverlässige Möglichkeit, Ihre Abspielzustände zu steuern. Schalten Sie die Audiositzung nicht einfach in Ihrem Code aus, sie wird die Sitzung wieder aufnehmen, sobald sie die Kontrolle wieder erlangen kann Ihr Fall, kommentieren Sie einfach die AudioSessionSetActive (FALSE) wird Ihnen helfen.

    
Allen 01.11.2011 12:38
quelle
0

Wenn Sie sich Listing 7-16 An interruption listener callback function im Audio-Session-Programmieranleitung Kochbuch-Abschnitt , das Code-Beispiel (das mit Ihrer Situation kompatibel zu sein scheint, mit kAudioSessionCategory_MediaPlayback) führt das

nicht wirklich durch %Vor%

call im Fall von kAudioSessionBeginInterruption und

%Vor%

call im Fall von kAudioSessionEndInterruption . Ich glaube wirklich nicht, dass du das tun solltest. Dieser Beitrag scheint dies zu veranschaulichen Problem auch (eine kAudioSessionIncompatibleCategory erhalten). Was passiert, wenn Sie beide Anrufe auskommentieren?

Der Grund, warum das Problem auftritt, wenn Ihre App im Hintergrund, nicht im Vordergrund ein Geheimnis ist. Sie sollten vielleicht den Status verfolgen (wie es bei NX_STATE_PLAY der Fall zu sein scheint) und dann zwei verschiedene Methoden verwenden ([self pause] und [self play]), da vielleicht die [self pause] (toggling play state) aufgerufen wird unerwartete Anzahl von Malen.

    
jbat100 03.11.2011 23:39
quelle
0

Ich habe es wie funktioniert für mich, Sie können Ihr Risiko versuchen.

In der Funktion

%Vor%

entfernen

%Vor%

Sie müssen handleInterruptionChangeToState nicht aufrufen, wenn Sie es direkt in audioSessionInterruptionListener verarbeiten können, weil audioSessionInterruptionListener inInterruptionState als Parameter hat. Also ändere deine audioSessionInterruptionListener

%Vor%     
saadnib 04.11.2011 13:11
quelle