- Home /
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
Answer by ryan_unity · Apr 19, 2016 at 03:08 PM
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 https://github.com/cbaltzer/UnitySpeakerFix 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 :)
I hope this helps!
Here's some related posts with similar answers: http://answers.unity3d.com/questions/257240/microphonestart-stops-audio-from-playing-on-ios.html http://answers.unity3d.com/questions/840441/how-to-force-audio-through-iphone-loudspeaker-when.html
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;
}
Is there any specific settings in player settings apart from de-selecting Prepare iOS for recording option. Is there any Audio specific setting have to make. I am recording audio with a BG track playing, the BG tracing which is playing in the background is too low. Its my issue. After recording, recorded voice is hearing fine, but BG audio level is low.
Call iPhoneSpeaker.ForceToSpeaker() after completing recording and start playing recorded audio. In Build settings - player settings - prepare iOS for Recording - unchecked, to play audio's loudly in iphone device.
In Edit - Player settings - Audio - check audio setted as sterio or others ins$$anonymous$$d of mono.
Thanks Ryan for all updates and help.
Regards, Ben
Answer by yester30 · Sep 19, 2019 at 12:58 PM
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;
}