christian Muller
christian Muller

Reputation: 541

Low recording volume in combination with AVAudioSessionCategoryPlayAndRecord

When I set:

[[AVAudioSession sharedInstance] setCategory:
    AVAudioSessionCategoryPlayAndRecord error:NULL];

…recording and playing works fine, just the playback volume is around 60% lower than when I would just play the same sound without recording and settings PlayAndRecord.

I need to get high volume peaks (to check if a user blow in the mic) for that i started a recording session. But without settings AVAudio..PlayandRecord, i can not playback any sounds in the meantime. Thats the reason i implemented this command.

Any Help?

Thx Chris

Upvotes: 23

Views: 11873

Answers (7)

Peter Honeder
Peter Honeder

Reputation: 161

I ran into this today, and most of the answers don't seem to apply to recent iOS changes. Lucian's answer above with the defaultToSpeaker option is correct, although still seems to behave differently in Simulator and on the device from time to time. What helped for me was to set category, mode and options in one call, which is available in iOS 10+ like this:

try session.setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeDefault, options: .defaultToSpeaker)

Using this audio was all the way up to maximum and stayed that way.

Upvotes: 5

Andrey Kuznetsov
Andrey Kuznetsov

Reputation: 843

In my case in addition to using AVAudioSessionCategoryOptionDefaultToSpeaker option I had to remove changing audioSession mode from AVAudioSessionModeDefault to AVAudioSessionModeMeasurement.

So if you are using modes other than AVAudioSessionModeDefault, be careful.

Upvotes: 0

Lucian Thorr
Lucian Thorr

Reputation: 2267

I ran into this problem today and it seems this answer is a bit outdated. AudioSessionsSetProperty(...) is now deprecated.

The following seems to work though, providing full volume through the speakers but automatically routing the audio to headphones if they're plugged in before the app is run:

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];

And if you'd rather the audio play through the speakers at full volume even if the headphones are plugged in, this works too:

[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];

Upvotes: 28

Jonas
Jonas

Reputation: 173

I found out (cf. Listing 7-9 in the iOS documentation) that the suggested solution above on overriding the audio route stops working after plugging, and removing earphones.

So, if you want the change in audio route to be permanent in the current audio session (Listing 7-10 in the iOS documentation) the same source you can set the default audio route by instead using

NSError *setCategoryErr = nil;
NSError *activationErr  = nil;
//Set the general audio session category
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: &setCategoryErr];

//Make the default sound route for the session be to use the speaker
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute);

//Activate the customized audio session
[[AVAudioSession sharedInstance] setActive: YES error: &activationErr];

and of course make sure to link the AudioToolbox framework and import it using

#import <AudioToolbox/AudioServices.h>

Upvotes: 14

Thiru
Thiru

Reputation: 1378

Also,need to add AudioToolbox and AVFoundation frameworks to your project by Right-Cliking on Frameworks -> Add -> Existing Frameworks.

Otherwise might get linker error:"_AudioSessionSetProperty", referenced from: -[OpenBook startRecording] in OpenBook.o

Upvotes: 0

christian Muller
christian Muller

Reputation: 541

For everyone with the same problem, redirect your output to the speaker:

[[AVAudioSession sharedInstance] setCategory:
    AVAudioSessionCategoryPlayAndRecord error:NULL];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute,
    sizeof(audioRouteOverride), &audioRouteOverride);

That works.

Upvotes: 26

Sjors Provoost
Sjors Provoost

Reputation: 1931

Don't forget the import statement. Perhaps obvious for the more experienced programmers...

#import <AudioToolbox/AudioServices.h>

Upvotes: 3

Related Questions