How avoid automatic gain control with AudioRecord?

Hartmut Pfitzinger picture Hartmut Pfitzinger · Jan 17, 2013 · Viewed 17k times · Source

How can I do audio recordings using android.media.AudioRecord without any smartphone-manufacturer-dependent fancy signal processing like automatic gain control (AGC) and/or equalization, noise suppression, echo cancellation, ... just the pure microphone signal?

Background

MediaRecorder.AudioSource provides nine constants,

  • DEFAULT and MIC initially being there,
  • VOICE_UPLINK, VOICE_DOWNLINK, and VOICE_CALL added in API level 4,
  • CAMCORDER and VOICE_RECOGNITION added in API 7,
  • VOICE_COMMUNICATION added in API 11,
  • REMOTE_SUBMIX added in API 19 but not available to third-party applications.

But none of them does a clean job across all smartphones. Rather, I have to find out myself it seems, which device uses which combinations of signal processing blocks for which MediaRecorder.AudioSource constant.

Would be nice to have a tenth constant like PURE_MIC added in API level 20.

But as long as this is not available, what can I do instead?

Answer

Michael picture Michael · Jan 17, 2013

Short answer is "Nothing".

The AudioSources correspond to various logical audio input devices depending on the accessories that you have connected to the phone and the current use-case, which in turn corresponds to physical devices (primary built-in mic, secondary mic, wired headset mic, etc) with different tunings.

Each such combination of physical device and tuning is trimmed by the OEM to meet both external requirements (e.g. CTS, operator requirements, etc) and internal acoustic requirements set by the OEM itself. This process may cause the introduction of various filters - such as AGC, noise suppression, equalization, etc - into the audio input path at the hardware codec or multimedia DSP level.

While a PURE_MIC source might be useful in for some applications, it's not something that's available today.
On many devices you can control things like microphone gain, and possibly even the filter chain, by using amixer to write to the hardware codec's ALSA controls. However, this would obviously be a very platform-specific approach, and I also suspect that you have to be running as either the root or audio user to be allowed to do this.