Поскольку существует так много Android-устройств (да, снова фрагментация!), каждое из которых поддерживает разные частоты дискретизации, каналы и форматы, должен быть хороший способ выяснить, какие настройки нужно установить вашему приложению на каждом телефоне. К сожалению, нет вызова, который просто говорит: Дайте мне, какие настройки вы поддерживаете. Вместо этого на самом деле есть вызов, который позволит вам запросить (вроде) ваш телефон, чтобы спросить его, поддерживает ли он определенную настройку. Это функция AudioRecord.getMinBufferSize. Он вернет ERROR_BAD_VALUE, если заданные вами настройки не поддерживаются.

Из этой функции вы можете создать оболочку, которая будет спускаться вниз по списку частот дискретизации (48000, 44100, 22050, 11025, 8000, так как Android не перечисляет их для вас), пока вы не найдете первую допустимую настройку, затем сделайте то же самое для каналов и форматов PCM. MicDroid использует этот код для этого.

do {
    switch (sampleRate) {
        case -1: sampleRate = Constants.SAMPLE_RATE_22KHZ; break;
        case Constants.SAMPLE_RATE_44KHZ: sampleRate = Constants.SAMPLE_RATE_22KHZ; break;
        case Constants.SAMPLE_RATE_22KHZ: sampleRate = Constants.SAMPLE_RATE_11KHZ; break;
        case Constants.SAMPLE_RATE_11KHZ: sampleRate = Constants.SAMPLE_RATE_8KHZ; break;
        default: Log.w(“AudioHelper”, String.format(“Hardware does not support recording!”));
        DialogHelper.showWarning(context, R.string.unable_to_configure_audio_title, R.string.unable_to_configure_audio_warning);
        return;
    }
    bufferSize = AudioRecord.getMinBufferSize( sampleRate, Constants.DEFAULT_CHANNEL_CONFIG, Constants.DEFAULT_PCM_FORMAT);
} while (bufferSize == AudioRecord.ERROR_BAD_VALUE);

Поскольку я подаю только моновход в 16-битном формате PCM LE, я оставил их как константы в MicDroid, но для большей гибкости, вероятно, лучше иметь функцию, которая будет запрашивать все возможные комбинации, пока не найдет ту, которая работает, поскольку оборудование может быть странным.

Наконец, важно отметить, что несмотря на то, что аппаратное обеспечение сообщает вашему приложению, что оно поддерживает определенную комбинацию, возможно, что на самом деле это не так. Я только размышляю здесь, так как у меня нет возможности доказать свои теории (может быть, это магниты), но, возможно, именно здесь Samsung Galaxy S приводит к сбою MicDroid.

Первоначально опубликовано на www.intervigil.net.