2012-06-12 15 views
5

üzerinde yapılandırmak için arabirimini uygulamıyor ama hata var: SL_RESULT_FEATURE_UNSUPPORTED.RecorderObject ben Android'de <code>RecorderObject</code> ait <code>SLDeviceVolumeItf</code> arayüzünü almaya çalıştı düzeyini ayarlamak veya Android

Ben OpenSL ait Android uygulaması okumak ES, AudioRecorder için ses ayarını desteklemez. Bu doğru mu?

Evet ise bir geçici çözüm var mı? Çok yüksek mikrofon kazancından dolayı Galaxy Nexus üzerinde iyi çalışmayan bir VOIP uygulamasına sahibim.

Ayrıca streamType yeni VOICE_COMMUNINCATION ses kaynağına ayarlamak için SL_IID_ANDROIDCONFIGURATION almayı denedim, ancak yine hata 12 (desteklenmiyor) olsun.

// 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 oluşturulur ama SL_IID_ANDROIDCONFIGURATION arayüzünü alamıyorum. Galaxy Nexus (ICS), HTC sense (ICS) ve Motorola Blur (Gingerbread) üzerinde denedim. NDK sürüm 6 kullanıyorum.

cevap

1

Artık arabirimi bulabilirim. NDK 8 ve hedef 14'ü kullanmalıydım. 10'u hedef olarak kullanmaya çalıştığımda, yerel kodu derlerken bir hata oluştu (dirent.h bulunamadı). Hedef platform 14'ü kullanmak zorundaydım.

+0

Kulağa garip geliyor. Hedef = android-9 kullanıyorum ve yaptığınız şeyleri aynen yapıyorum ama SLAndroidConfigurationItf arabirimi başarıyla alındı. Kayıt cihazı nesnesi oluşturmak için kullandığınız params yüzünden olabilir mi? –

0

Benzer bir soruna rastladım. Sonuçlarım uygulanmadığı için hata kodunu döndürüyordu. Ancak, benim sorunum, SL_IID_ANDROIDCONFIGURATION arabirim bayrağındaki kayıt cihazını oluşturmama neden oldu.

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

OpenSL'deki kazancı değiştirmek için bir yol bulmaya çalıştım bile, bunun için bir api/arabirim yok gibi görünüyor. i basit bir kayma kazanç çarpan uygulayarak geçici bir çözüm uygulanan

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

}

Ama burada kazanç çarpılır/sen daha yumuşak bir kazanç eğrisini gerekirse bölünmüş bir faktörle veya 2. (< < veya >> dayanarak), daha karmaşık yazmak gerekiyor sayısal kazanç işlevi.

İlgili konular