2009-12-02 9 views
16

Ich arbeite gerade an einem Projekt, bei dem Musik aus der iphone Musikbibliothek innerhalb der App abgespielt wird. Ich verwende MPMediaPickerController, um dem Benutzer zu ermöglichen, seine Musik auszuwählen und sie mit dem iPod Music Player im iPhone abzuspielen.Wie programmiere ich Hörmuschel im iPhone?

Allerdings stieß ich auf Problem, wenn der Benutzer seinen Hörer einfügt und entfernt. Die Musik hört plötzlich ohne Grund auf zu spielen. Nach einigen Tests habe ich festgestellt, dass der iPod-Player die Wiedergabe unterbricht, wenn der Benutzer den Hörer vom Gerät abzieht. Gibt es eine Möglichkeit, programmatisch zu erkennen, ob der Hörer abgenommen wurde, damit ich die Musik weiter abspielen kann? Oder kann der iPod-Player nicht angehalten werden, wenn der Benutzer den Hörer abzieht?

Antwort

9

Sie registrieren sollten für AudioRoute Benachrichtigung geändert und implementieren, wie Sie den Router zu handhaben wollen ändert

// Registers the audio route change listener callback function 
    AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, 
            audioRouteChangeListenerCallback, 
            self); 

und innerhalb des Callback können Sie den Grund für die Routenänderung

erhalten
+0

erm Benachrichtigung implementieren Ich habe 2 Fehler beim Kompilieren 1) wat's inPropertyValue? Es wird entweder im Methodenparameter nicht deklariert. 2) CFDictionaryGetValue gibt einen void-Zeiger zurück, der mit CFNumberRef inkompatibel ist. Muss ich ein Casting machen, bevor ich den Wert zurückgebe? –

+0

hmm es ist mir gelungen, meine codes zu kompilieren und alles läuft gut, aber wenn ich meinen kopfhörer einstecke oder ziehe passiert nichts. Die Funktion audioRouteChangeListenerCallback wurde nicht aufgerufen. Gibt es noch etwas, das mir neben den oben genannten Funktionen fehlt? –

+0

Sie sollten sich für die Listener-Funktion NACH Ihrem Anruf beim Initialisieren von AudioSession registrieren. Machst du das? – prakash

2

Ich sehe, Sie verwenden das MPMediaPlayer Framework, aber die Mikrofon-Handhabung erfolgt über das AVAudioPlayer-Framework, das Sie Ihrem Projekt hinzufügen müssen.

Die Apple-Website enthält Code aus dem AVAudioPlayer-Framework, mit dem ich Unterbrechungen durch einen Benutzer beheben kann, der die Kopfhörer des Apple-Mikrofons einsteckt oder entfernt.

Schauen Sie sich Apples iPhone Dev Center Audio Session Programming Guide.

- (void) beginInterruption { 
    if (playing) { 
     playing = NO; 
     interruptedWhilePlaying = YES; 
     [self updateUserInterface]; 
    } 
} 

NSError *activationError = nil; 
- (void) endInterruption { 
    if (interruptedWhilePlaying) { 
     [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; 
     [player play]; 
     playing = YES; 
     interruptedWhilePlaying = NO; 
     [self updateUserInterface]; 
    } 
} 

Mein Code ist ein wenig anders, und einige von diesen können Sie helfen:

void interruptionListenerCallback (
            void *inUserData, 
            UInt32 interruptionState 
) { 
    // This callback, being outside the implementation block, needs a reference 
    // to the AudioViewController object 
    RecordingListViewController *controller = (RecordingListViewController *) inUserData; 

    if (interruptionState == kAudioSessionBeginInterruption) { 

     //NSLog (@"Interrupted. Stopping playback or recording."); 

     if (controller.audioRecorder) { 
      // if currently recording, stop 
      [controller recordOrStop: (id) controller]; 
     } else if (controller.audioPlayer) { 
      // if currently playing, pause 
      [controller pausePlayback]; 
      controller.interruptedOnPlayback = YES; 
     } 

    } else if ((interruptionState == kAudioSessionEndInterruption) && controller.interruptedOnPlayback) { 
     // if the interruption was removed, and the app had been playing, resume playback 
     [controller resumePlayback]; 
     controller.interruptedOnPlayback = NO; 
    } 
} 

void recordingListViewMicrophoneListener (
         void      *inUserData, 
         AudioSessionPropertyID inPropertyID, 
         UInt32     inPropertyValueSize, 
         const void    *isMicConnected 
         ) { 

    // ensure that this callback was invoked for a change to microphone connection 
    if (inPropertyID != kAudioSessionProperty_AudioInputAvailable) { 
     return; 
    } 

    RecordingListViewController *controller = (RecordingListViewController *) inUserData; 

    // kAudioSessionProperty_AudioInputAvailable is a UInt32 (see Apple Audio Session Services Reference documentation) 
    // to read isMicConnected, convert the const void pointer to a UInt32 pointer 
    // then dereference the memory address contained in that pointer 
    UInt32 connected = * (UInt32 *) isMicConnected; 

    if (connected){ 
     [controller setMicrophoneConnected : YES]; 
    } 
    else{ 
     [controller setMicrophoneConnected: NO];  
    } 

    // check to see if microphone disconnected while recording 
    // cancel the recording if it was 
    if(controller.isRecording && !connected){ 
     [controller cancelDueToMicrophoneError]; 
    } 
} 
4

Wenn Sie wollen einfach nur prüfen, ob ein Kopfhörer zu einem bestimmten Zeitpunkt eingesteckt, ohne Änderungen zu routen zu hören, können Sie einfach wie folgt vor:

OSStatus error = AudioSessionInitialize(NULL, NULL, NULL, NULL); 
if (error) 
    NSLog("Error %d while initializing session", error); 

UInt32 routeSize = sizeof (CFStringRef); 
CFStringRef route; 

error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, 
           &routeSize, 
           &route); 

if (error) 
    NSLog("Error %d while retrieving audio property", error); 
else if (route == NULL) { 
    NSLog(@"Silent switch is currently on"); 
} else if([route isEqual:@"Headset"]) { 
    NSLog(@"Using headphones"); 
} else { 
    NSLog(@"Using %@", route); 
} 

Cheers, Raffaello Colasante

+1

Eine viel bessere Umsetzung davon findet sich hier: http://stackoverflow.com/questions/3728781/detecti-f-headphones-not-microphone-are-plugged- In-zu-iOS-Gerät –

2

Hey Leute, checkt einfach die AddMusic-Beispiel-App. Werden alle iPod Fragen lösen

Erste für die Benachrichtigung iPod-Player registrieren Code folgenden

NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

    [notificationCenter 
    addObserver: self 
    selector: @selector (handle_PlaybackStateChanged:) 
    name:  MPMusicPlayerControllerPlaybackStateDidChangeNotification 
    object:  musicPlayer]; 

    [musicPlayer beginGeneratingPlaybackNotifications]; 

Und den folgenden Code in der

- (void) handle_PlaybackStateChanged: (id) notification 
{ 

    MPMusicPlaybackState playbackState = [musicPlayer playbackState]; 

    if (playbackState == MPMusicPlaybackStatePaused) 
    { 
      [self playiPodMusic]; 
    } 
    else if (playbackState == MPMusicPlaybackStatePlaying) 
    { 

    } 
    else if (playbackState == MPMusicPlaybackStateStopped) 
    { 
     [musicPlayer stop]; 
    } 
} 
Verwandte Themen