Veo que está usando MPMediaPlayer Framework, sin embargo, el manejo del micrófono se realiza utilizando el marco AVAudioPlayer, que deberá agregar a su proyecto.
El sitio web de Apple tiene un código del marco de AVAudioPlayer que utilizo para manejar las interrupciones de un usuario que conecta o quita los auriculares del micrófono de Apple.
Echa un vistazo a iPhone Dev Center Audio Session Programming Guide de Apple.
- (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];
}
}
Mi código es un poco diferente y algunos de esto puede ayudarle a:
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];
}
}
erm estoy teniendo 2 error al compilar 1) wat's inPropertyValue? No se decolora tampoco en el parámetro de método 2) CFDictionaryGetValue devuelve un puntero void que es incompitable con CFNumberRef. ¿Debo hacer un casting antes de devolver el valor? –
hmm logré compilar mis códigos y todo funciona bien, pero cuando enchufo o desconecto mis auriculares no pasa nada. La función audioRouteChangeListenerCallback no se ha llamado. ¿Hay algo más que me falta junto a las funciones anteriores? –
Debe registrarse para la función de escucha DESPUÉS de su llamada a la inicialización de AudioSession .. ¿Lo hace de esa manera? – prakash