5

SLDeviceVolumeItfAndroid で のインターフェイスを取得しようとしましたRecorderObjectが、エラーが発生しました。SL_RESULT_FEATURE_UNSUPPORTED.

OpenSL ES の Android 実装が の音量設定をサポートしていないことを読みましたAudioRecorder。本当?

はいの場合、回避策はありますか? マイクゲインが非常に高いため、Galaxy Nexus でうまく動作しない VOIP アプリケーションがあります。

また、 を新しいオーディオ ソースSL_IID_ANDROIDCONFIGURATIONに設定しようとしましたが、ここでもエラー 12 (サポートされていません) が発生します。streamTypeVOICE_COMMUNINCATION

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

レコーダーオブジェクトが作成されましたが、SL_IID_ANDROIDCONFIGURATIONインターフェイスを取得できません。Galaxy Nexus (ICS)、HTC sense (ICS)、Motorola Blur (Gingerbread) で試してみました。NDK バージョン 6 を使用しています。

4

4 に答える 4

1

これで、インターフェイスを取得できます。NDK8とtarget-14を使用する必要がありました。10をターゲットとして使用しようとすると、ネイティブコードのコンパイル中にエラーが発生しました(dirent.hが見つかりませんでした)。target-platform-14を使用する必要がありました。

于 2012-06-21T11:51:33.070 に答える
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;
    }
于 2013-12-06T03:12:04.613 に答える
0

同様の問題に遭遇しました。私の結果は、実装されていないというエラーコードを返していました。ただし、私の問題は、SL_IID_ANDROIDCONFIGURATIONインターフェイス フラグを使用してレコーダーを作成していなかったことです。

于 2013-11-07T04:03:20.407 に答える
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);
    }

}

ただし、ここでは、ゲインは (<< または >> に基づいて) 係数または 2 で乗算/除算されます。より滑らかなゲイン曲線が必要な場合は、より複雑なデジタル ゲイン関数を記述する必要があります。

于 2014-06-17T08:12:07.407 に答える