Чтобы получить предпочтительный размер аудиобуфера и частоту аудиосэмплирования для данного устройства 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, я не уверен, как получить поддерживаемые частоты дискретизации микрофона и динамика. Кроме того, структура не содержит информации о предпочтительном размере буфера.
Конечно, это не часть 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);
Добавьте обработку ошибок так, как вы хотите.