On ios6 + you can use AVAudioSession properties
CGFloat gain = sender.value; NSError* error; self.audioSession = [AVAudioSession sharedInstance]; if (self.audioSession.isInputGainSettable) { BOOL success = [self.audioSession setInputGain:gain error:&error]; if (!success){} //error handling } else { NSLog(@"ios6 - cannot set input gain"); }
On ios5, you can get / set the gain properties of the input audio signal using the AudioSession functions
UInt32 ui32propSize = sizeof(UInt32); UInt32 f32propSize = sizeof(Float32); UInt32 inputGainAvailable = 0; Float32 inputGain = sender.value; OSStatus err = AudioSessionGetProperty(kAudioSessionProperty_InputGainAvailable , &ui32propSize , &inputGainAvailable); if (inputGainAvailable) { OSStatus err = AudioSessionSetProperty(kAudioSessionProperty_InputGainScalar , sizeof(inputGain) , &inputGain); } else { NSLog(@"ios5 - cannot set input gain"); } OSStatus err = AudioSessionGetProperty(kAudioSessionProperty_InputGainScalar , &f32propSize , &inputGain); NSLog(@"inputGain: %0.2f",inputGain);
(processing error omitted)
Since you are interested in controlling the gain of the input signal, you can also turn off the automatic gain control by setting the audio session mode to AVAudioSessionModeMeasurement (ios5 + 6)
[self.audioSession setMode:AVAudioSessionModeMeasurement error:nil]; NSLog(@"mode:%@",self.audioSession.mode);
These settings are quite specific to the hardware, so accessibility must not be allowed. For example, I can change the gain on iPhone3GS / ios6 and iPhone4S / ios5.1, but not on ipadMini / ios6.1. I can disable AGC on iPhone3G and iPad mini, but not iPhone4S.
foundry
source share