Android: Как получить предпочтительный (собственный) размер аудио буфера и частоту дискретизации звука в C / C ++?

Чтобы получить предпочтительный размер аудиобуфера и частоту аудиосэмплирования для данного устройства Android, вы можете выполнить следующий код Java:

// To get preferred buffer size and sampling rate.
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
Log.d("Buffer Size and sample rate", "Size :" + size + " & Rate: " + rate);

Возможно ли сделать это в C / C ++?

Если так, то как?

API openSLES, похоже, не предлагает эту функцию. Я заметил, что openSLES.h определяет структуру SLAudioInputDescriptor, а также SLAudioOutputDescriptor, но если это доступно в Android, я не уверен, как получить поддерживаемые частоты дискретизации микрофона и динамика. Кроме того, структура не содержит информации о предпочтительном размере буфера.

3

Решение

Конечно, это не часть OpenSL ES API, эти параметры относятся к Android и являются частью ОС Android.

К сожалению, я не нашел способа получить эти параметры непосредственно в нативном коде. Я закончил вызывать функции Java через JNI.

Вот псевдокод:

    jclass audioSystem = env->FindClass("android/media/AudioSystem");
jmethodID method = env->GetStaticMethodID(audioSystem, "getPrimaryOutputSamplingRate", "()I");
jint nativeOutputSampleRate = env->CallStaticIntMethod(audioSystem, method);
method = env->GetStaticMethodID(audioSystem, "getPrimaryOutputFrameCount", "()I");
jint nativeBufferLength = env->CallStaticIntMethod(audioSystem, method);

Добавьте обработку ошибок так, как вы хотите.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector