Detecting iPhone mute switch in iOS 5

t3_guy picture t3_guy · Nov 16, 2011 · Viewed 8.8k times · Source

I know that Apple does not provide a way to detect the state of the iPhone mute/silence switch in iOS 5. However, I have I tried a technique mentioned elsewhere to detect this by playing an audio file and measuring its runtime. However, even though my iPhone was muted, the audio file still played the entire duration. I'm using [AVAudioPlayer play] and computing the time before audioPlayerDidFinishPlaying is called. Do you know of a trick to play an audio file, which will complete early/immediately if the phone is muted?

Answer

Srikar Appalaraju picture Srikar Appalaraju · Nov 16, 2011

UPDATE: Sorry the below code posted works fine for me but I am using iOS4. For iOS5 this answer is what will solve your problem - Detecting the iPhone's Ring / Silent / Mute switch using AVAudioPlayer not working?

This piece of code is what you need. Define a global gAudioSessionInited var. This flag tells you whether your mute switch is on or off.

// "Ambient" makes it respect the mute switch. Must call this once to init session
if (!gAudioSessionInited)
{
    AudioSessionInterruptionListener inInterruptionListener = NULL;
    OSStatus error;
    if ((error = AudioSessionInitialize (NULL, NULL, inInterruptionListener, NULL)))
        NSLog(@"*** Error *** error in AudioSessionInitialize: %d.", error);
    else
        gAudioSessionInited = YES;
}

SInt32  ambient = kAudioSessionCategory_AmbientSound;
if (AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (ambient), &ambient))
{
    NSLog(@"*** Error *** could not set Session property to ambient.");
}