Audio volume level is too low in iphone, working in ipad

Hi,

We developed a game in Unity5.1.2, having a game for audio song recording with background track playing, when microphone starts recording using Microphone.Start() function, audio volume level of background track playing in the game is too low for iphone devices (tested in iphone 5s) and working fine with ipads.

Included the following fixes for it

  1. importing UnitySpeakerFix unity package and called iPhoneSpeaker.ForceToSpeaker ()

  2. Checked/Unchecked Prepare iOS for recording option in build settings.

Those fixes doesn’t helped out. Could anyone help me to sort this out.

Regards,
Ben

Hey,

I tested this on 5.3.4p2, but also on 5.1.2p3 just in case there were any differences in this area.

I downloaded and imported the Plugins folder from GitHub - cbaltzer/UnitySpeakerFix: Forces audio to speaker while using the mic, on iPhone and it seems to work quite well. Make sure to call iPhoneSpeaker.ForceToSpeaker() after the call to Microphone.Start() and it should force the iPhone speaker to be used instead of the ear piece :slight_smile:

I hope this helps!

Here’s some related posts with similar answers:

EDIT:
The plugin uses some deprecated method calls and so here’s some changes to make use of AVAudioSession to get the same result (force audio to the speaker). These changes go in the iPhoneSpeaker.m file:

#import "iPhoneSpeaker.h"
#import <AVFoundation/AVFoundation.h>


void _forceToSpeaker() {
    // want audio to go to headset if it's connected
    if (_headsetConnected()) {
        return;
    }

    AVAudioSession *session = [AVAudioSession sharedInstance];
    NSError *error = nil;
    BOOL success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];

    if (!success) {
        NSLog(@"Error forcing audio to speaker: %@", error);
    }
    else {
        NSLog(@"Forcing audio to speaker");
    }
}

bool _headsetConnected() {
    AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
    for (AVAudioSessionPortDescription* desc in [route outputs]) {
        if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones])
            return true;
    }
    return false;
}

If anyone passing by wants to know how to detect airpods activated & linked to the phone, I managed using those cases:

bool _headsetConnected() {
        AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
        for (AVAudioSessionPortDescription* desc in [route outputs]) {
            if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones])
                return true;
            if ([[desc portType] isEqualToString:AVAudioSessionPortBluetoothA2DP])
                       return true;
            if ([[desc portType] isEqualToString:AVAudioSessionPortBluetoothHFP])
                       return true;
            if ([[desc portType] isEqualToString:AVAudioSessionPortHeadsetMic])
                    return true;
        }
        return false;
        }