2012-06-12 3 views
5

에 구성 할 인터페이스를 구현하지 않습니다하지만 난 오류가있어 : SL_RESULT_FEATURE_UNSUPPORTED.RecorderObject 내가 안드로이드에 <code>RecorderObject</code>의 <code>SLDeviceVolumeItf</code> 인터페이스를 얻기 위해 노력 볼륨을 설정하거나 안드로이드

내가 OpenSL의 안드로이드 구현 읽었를 ES는 AudioRecorder의 볼륨 설정을 지원하지 않습니다. 그게 사실이야?

예인 경우 해결 방법이 있습니까? 나는 매우 높은 마이크 이득 때문에 Galaxy Nexus에서 잘 작동하지 않는 VOIP 애플리케이션을 가지고 있습니다.

SL_IID_ANDROIDCONFIGURATIONstreamType을 새로운 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 인터페이스를 가져올 수 없습니다. 갤럭시 넥서스 (ICS), HTC 센스 (ICS) 및 모토로라 블러 (진저 브레드)에서 시험해 보았습니다. NDK 버전 6을 사용 중입니다.

답변

1

이제 인터페이스를 얻을 수 있습니다. NDK 8과 표적 14를 사용해야했습니다. 대상으로 10을 사용하려고 시도했지만 nativent 코드를 컴파일하는 동안 오류가 발생했습니다 (dirent.h를 찾을 수 없습니다). target-platform-14를 사용해야했습니다.

+0

소리가 이상합니다. 나는 target = android-9를 사용하고 당신이하는 것과 동일한 일을하지만, SLAndroidConfigurationItf 인터페이스는 성공적으로 검색됩니다. 레코더 개체를 만드는 데 사용 된 params 때문일 수 있습니까? –

0

비슷한 문제가 발생했습니다. 내 결과가 구현되지 않은 오류 코드를 반환했습니다. 그러나, 내 문제는 내가 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

심지어 OpenSSL에서 이득을 변경하는 방법을 찾으려고했지만 거기에는 api/인터페이스가없는 것처럼 보입니다. 난 간단한 시프트 게인 승산기를 구현 주위 일 구현

공극 multiply_gain (무효 * 버퍼 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); 
    } 

}

그러나 여기에 이득이 곱은 /는 부드러운 이득 곡선을 필요로하는 경우 분할 된 배 또는 2 (< < 또는 >> 기준), 당신은 더 복잡한를 작성해야 디지털 이득 기능.