RecorderObject в OpenSL не реализует интерфейс для установки громкости или настройки на Android

Я пытался получить SLDeviceVolumeItf интерфейс RecorderObject на Android, но я получил ошибку: SL_RESULT_FEATURE_UNSUPPORTED.

Я читал, что реализация Android OpenSL ES не поддерживает настройку громкости для AudioRecorder, Это правда?

Если да, есть ли обходной путь? У меня есть приложение VOIP, которое плохо работает на Galaxy Nexus из-за очень высокого усиления микрофона.

Я также пытался получить SL_IID_ANDROIDCONFIGURATION установить streamType к новому VOICE_COMMUNINCATION аудио-источник, но снова я получаю ошибку 12 (не поддерживается).

   // create audio recorder
const SLInterfaceID id[2] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_ANDROIDCONFIGURATION };
const SLboolean    req[2] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE };

result = (*engine)->CreateAudioRecorder(engine, &recorderObject, &audioSrc,  &audioSnk, 2, id, req);
if (SL_RESULT_SUCCESS != result) {
    return false;
}

SLAndroidConfigurationItf recorderConfig;   
result = (*recorderObject)->GetInterface(recorderObject, SL_IID_ANDROIDCONFIGURATION, &recorderConfig);
if(result != SL_RESULT_SUCCESS) {
    error("failed to get SL_IID_ANDROIDCONFIGURATION interface. e == %d", result);
}

RecorderObject создан, но я не могу получить SL_IID_ANDROIDCONFIGURATION интерфейс. Я пробовал это на Galaxy Nexus (ICS), HTC Sense (ICS) и Motorola Blur (Gingerbread). Я использую NDK версии 6.

4 ответа

Решение

Теперь я могу получить интерфейс. Мне пришлось использовать NDK 8 и target-14. Когда я попытался использовать 10 в качестве цели, у меня была ошибка при компиляции нативного кода (dirent.h не был найден). Мне пришлось использовать target-platform-14.

Я столкнулся с подобной проблемой. Мои результаты возвращали код ошибки для не реализовано. Однако моя проблема заключалась в том, что я не создавал рекордер с SL_IID_ANDROIDCONFIGURATION флаг интерфейса.

    apiLvl = (*env)->GetStaticIntField(env, versionClass, sdkIntFieldID);

SLint32 streamType = SL_ANDROID_RECORDING_PRESET_GENERIC;
    if(apiLvl > 10){
        streamType = SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION;
        I("set SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION");
    }

    result = (*recorderConfig)->SetConfiguration(recorderConfig, SL_ANDROID_KEY_RECORDING_PRESET, &streamType, sizeof(SLint32));
    if (SL_RESULT_SUCCESS != result) {
        return 0;
    }

Даже я пытался найти способ изменить усиление в OpenSL, похоже, что для этого нет API / интерфейса. я реализовал обходной путь, реализовав простой коэффициент усиления сдвига

void multiply_gain(void *buffer, int bytes, int gain_val) { int i = 0, j = 0;

    short *buffer_samples = (short*)buffer;

    for(i = 0, j = 0; i < bytes; i+=2,j++)
    {
       buffer_samples[j] = (buffer_samples[j] >> gain_val);
    }

}

Но здесь усиление умножается / делится (на основе << или >>) на коэффициент или 2. Если вам нужна более плавная кривая усиления, вам нужно написать более сложную функцию цифрового усиления.

Другие вопросы по тегам