OpenSL中的RecorderObject未实现在Android上设置卷或配置的接口

时间:2012-06-12 12:11:25

标签: android opensl

我尝试在Android上获取SLDeviceVolumeItf的{​​{1}}界面,但收到错误:RecorderObject

我读到OpenSL ES的Android实现不支持SL_RESULT_FEATURE_UNSUPPORTED.的音量设置。真的吗?

如果是,是否有解决方法?我有一个VOIP应用程序,由于麦克风增益非常高,因此无法很好地应用于Galaxy Nexus。

我还尝试让AudioRecorderSL_IID_ANDROIDCONFIGURATION设置为新的streamType音频来源,但我又得到错误12(不支持)。

VOICE_COMMUNINCATION

创建了recorderObject但我无法获得 // 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); } 接口。 我在Galaxy Nexus(ICS),HTC sense(ICS)和Motorola Blur(Gingerbread)上尝试过它。 我正在使用NDK版本6。

4 个答案:

答案 0 :(得分:1)

现在我可以获得界面了。我不得不使用NDK 8和目标-14。 当我尝试使用10作为目标时,编译本机代码时出错(未找到dirent.h)。 我不得不使用target-platform-14。

答案 1 :(得分:0)

我遇到了类似的问题。我的结果返回了未实现的错误代码。但是,我的问题是我没有使用SL_IID_ANDROIDCONFIGURATION接口标志创建记录器。

答案 2 :(得分: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;
    }

答案 3 :(得分: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);
    }

}

但是这里增益被乘以/除以(基于&lt;&gt;&gt;&gt;)因子或2.如果你需要更平滑的增益曲线,你需要写一个更复杂的数字增益函数。 / p>