2012-06-12 7 views
5

He intentado conseguir la interfaz SLDeviceVolumeItf del RecorderObject en Android pero me dio el error: SL_RESULT_FEATURE_UNSUPPORTED.RecorderObject en OpenSL no implementa la interfaz para ajustar el volumen o configurar en Android

leí que la aplicación Android de OpenSL ES no admite la configuración de volumen para AudioRecorder. ¿Es eso cierto?

Si es así, ¿hay alguna solución? Tengo una aplicación VOIP que no funciona bien en Galaxy Nexus debido a la gran ganancia de micrófono.

También traté de obtener el SL_IID_ANDROIDCONFIGURATION para configurar el streamType en la nueva fuente de audio VOICE_COMMUNINCATION, pero nuevamente recibo el error 12 (no admitido).

// 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); 
} 

El recorderObject se crea pero no puede obtener la interfaz SL_IID_ANDROIDCONFIGURATION. Lo probé en Galaxy Nexus (ICS), HTC sense (ICS) y Motorola Blur (Gingerbread). Estoy usando NDK versión 6.

Respuesta

1

Ahora puedo obtener la interfaz. Tuve que usar NDK 8 y target-14. Cuando traté de usar 10 como destino, tuve un error al compilar el código nativo (no se encontró dirent.h). Tuve que usar target-platform-14.

+0

Suena extraño. Uso target = android-9 y hago las mismas cosas que tú, pero la interfaz SLAndroidConfigurationItf se recupera con éxito. ¿Puede ser por params que usaste para crear un objeto grabador? –

0

Me encontré con un problema similar. Mis resultados fueron devolver el código de error para no implementado. Sin embargo, mi problema era que no estaba creando la grabadora con el indicador de interfaz SL_IID_ANDROIDCONFIGURATION.

0
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; 
    } 
0

Incluso traté de encontrar una manera de cambiar la ganancia en OpenSL, parece que no hay API/interfaz para eso. i implementado un trabajo alrededor mediante la aplicación de un simple multiplicador de ganancia cambio

void multiply_gain (void * buffer, bytes int, 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); 
    } 

}

Pero aquí la ganancia se multiplica/dividido (basado en < < o >>) por un factor de 2. o si necesita una curva de ganancia más suave, tiene que escribir una más compleja función de ganancia digital.

Cuestiones relacionadas