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. Если вам нужна более плавная кривая усиления, вам нужно написать более сложную функцию цифрового усиления.