我尝试在Android上获取SLDeviceVolumeItf
的{{1}}界面,但收到错误:RecorderObject
我读到OpenSL ES的Android实现不支持SL_RESULT_FEATURE_UNSUPPORTED.
的音量设置。真的吗?
如果是,是否有解决方法?我有一个VOIP应用程序,由于麦克风增益非常高,因此无法很好地应用于Galaxy Nexus。
我还尝试让AudioRecorder
将SL_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。
答案 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>