Android中的OpenSL ES是如何实现的?
16lz
2021-01-23
一般理解的Android Audio架构是这样的:
时间长了大家也就比较认可和熟悉了,但是了解OpenSL ES之后,发现如果使用OpenSL ES,是不使用JAVA API的,那么Android系统中是哪一层实现了OpenSL ES的呢?
只要搜索OpenSL ES
就会搜索到这个库如何如何在Android上使用,好的文章一大堆,比如这个 Android音频开发(6):使用OpenSL ES API上 下,还有其它googlesamples/android-ndk中的Audio-echo等等。都是OpenSL ES往上,而不是往下。也就是是哪一层实现的OpenSL ES。我是要用我的方法查找到,并不会贴出详细的代码调用流程。
通过Audio-echo得知,要使用OpenSL ES,那么需要链接的库名称为OpenSLES,在手上的一套Android L源码中以LOCAL_MODULE := libOpenSLES
查得其所在的Android.mk是frameworks/wilhelm/src/Android.mk
。对应该MODULE完整的代码为
include $(CLEAR_VARS)LOCAL_SRC_FILES := sl_entry.c sl_iid.c assert.cLOCAL_C_INCLUDES:= \ $(call include-path-for, wilhelm) \ frameworks/av/media/libstagefright \ frameworks/av/media/libstagefright/include \ frameworks/native/include/media/openmaxLOCAL_MODULE := libOpenSLESLOCAL_PRELINK_MODULE := falseLOCAL_MODULE_TAGS := optionalLOCAL_CFLAGS += -x c++ -DLI_API= -fvisibility=hidden -UNDEBUG \ -DSL_API='__attribute__((visibility("default")))'LOCAL_SHARED_LIBRARIES := libwilhelm libloginclude $(BUILD_SHARED_LIBRARY)
可以看到它链接到了libwilhelm中。查看libwilhelm对应的Android.mk为
include $(CLEAR_VARS)# do not claim support for any OpenSL ES or OpenMAX AL profilesLOCAL_CFLAGS += -DUSE_PROFILES=0# enable API logging; details are set separately by SL_TRACE_DEFAULT belowLOCAL_CFLAGS += -DUSE_TRACE# or -UUSE_TRACE to disable API logging# enable mutex deadlock detectionLOCAL_CFLAGS += -DUSE_DEBUG# or -UUSE_DEBUG for no mutex deadlock detection# enable assert() to do runtime checkingLOCAL_CFLAGS += -UNDEBUG# or -DNDEBUG for no runtime checking# select the level of log messagesLOCAL_CFLAGS += -DUSE_LOG=SLAndroidLogLevel_Info# or -DUSE_LOG=SLAndroidLogLevel_Verbose for verbose logging# log all API entries and exits (also requires Debug or Verbose log level)# LOCAL_CFLAGS += -DSL_TRACE_DEFAULT=SL_TRACE_ALL# (otherwise a warning log on error results only)# API levelLOCAL_CFLAGS += -DPLATFORM_SDK_VERSION=$(PLATFORM_SDK_VERSION)# Reduce size of .so and hide internal global symbolsLOCAL_CFLAGS += -fvisibility=hidden -DLI_API='__attribute__((visibility("default")))'LOCAL_SRC_FILES:= \ OpenSLES_IID.c \ assert.c \ classes.c \ data.c \ devices.c \ entry.c \ handler_bodies.c \ trace.c \ locks.c \ sles.c \ sl_iid.c \ sllog.c \ ThreadPool.c \ android/AudioPlayer_to_android.cpp \ android/AudioRecorder_to_android.cpp \ android/MediaPlayer_to_android.cpp \ android/OutputMix_to_android.cpp \ android/VideoCodec_to_android.cpp \ android/BufferQueueSource.cpp \ android/CallbackProtector.cpp \ android/AacBqToPcmCbRenderer.cpp \ android/android_AudioSfDecoder.cpp \ android/android_AudioToCbRenderer.cpp \ android/android_GenericMediaPlayer.cpp\ android/android_GenericPlayer.cpp \ android/android_LocAVPlayer.cpp \ android/android_StreamPlayer.cpp \ android/android_Effect.cpp \ android/util/AacAdtsExtractor.cpp \ autogen/IID_to_MPH.c \ objects/C3DGroup.c \ objects/CAudioPlayer.c \ objects/CAudioRecorder.c \ objects/CEngine.c \ objects/COutputMix.c \ objects/CMediaPlayer.c \ itf/IAndroidBufferQueue.c \ itf/IAndroidConfiguration.c \ itf/IAndroidEffect.cpp \ itf/IAndroidEffectCapabilities.c \ itf/IAndroidEffectSend.c \ itf/IAcousticEchoCancellation.c \ itf/IAutomaticGainControl.c \ itf/IBassBoost.c \ itf/IBufferQueue.c \ itf/IDynamicInterfaceManagement.c \ itf/IEffectSend.c \ itf/IEngine.c \ itf/IEngineCapabilities.c \ itf/IEnvironmentalReverb.c \ itf/IEqualizer.c \ itf/IMetadataExtraction.c \ itf/INoiseSuppression.c \ itf/IMuteSolo.c \ itf/IObject.c \ itf/IOutputMix.c \ itf/IPlay.c \ itf/IPlaybackRate.c \ itf/IPrefetchStatus.c \ itf/IPresetReverb.c \ itf/IRecord.c \ itf/ISeek.c \ itf/IStreamInformation.cpp \ itf/IVideoDecoderCapabilities.cpp \ itf/IVirtualizer.c \ itf/IVolume.cEXCLUDE_SRC := \ sync.c \ itf/I3DCommit.c \ itf/I3DDoppler.c \ itf/I3DGrouping.c \ itf/I3DLocation.c \ itf/I3DMacroscopic.c \ itf/I3DSource.c \ itf/IAudioDecoderCapabilities.c \ itf/IAudioEncoder.c \ itf/IAudioEncoderCapabilities.c \ itf/IAudioIODeviceCapabilities.c \ itf/IDeviceVolume.c \ itf/IDynamicSource.c \ itf/ILEDArray.c \ itf/IMIDIMessage.c \ itf/IMIDIMuteSolo.c \ itf/IMIDITempo.c \ itf/IMIDITime.c \ itf/IMetadataTraversal.c \ itf/IPitch.c \ itf/IRatePitch.c \ itf/IThreadSync.c \ itf/IVibra.c \ itf/IVisualization.cLOCAL_C_INCLUDES:= \ $(call include-path-for, wilhelm) \ frameworks/av/media/libstagefright \ frameworks/av/media/libstagefright/include \ frameworks/av/media/libstagefright/http \ frameworks/native/include/media/openmax \ $(call include-path-for, audio-effects)# __pthread_gettidLOCAL_C_INCLUDES += bionic/libc/privateLOCAL_CFLAGS += -x c++ -Wno-multichar -Wno-invalid-offsetofLOCAL_STATIC_LIBRARIES += \ libopensles_helper \ libOpenSLESUTLOCAL_SHARED_LIBRARIES := \ liblog \ libutils \ libmedia \ libbinder \ libstagefright \ libstagefright_foundation \ libstagefright_http_support \ libcutils \ libgui \ libdl \ libeffectsLOCAL_MODULE := libwilhelmLOCAL_MODULE_TAGS := optionalifeq ($(TARGET_BUILD_VARIANT),userdebug) LOCAL_CFLAGS += -DUSERDEBUG_BUILD=1endifLOCAL_PRELINK_MODULE := falseinclude $(BUILD_SHARED_LIBRARY)
可见该库实现了OpenSL ES所需要的entry.c。真正的实现就是该库了。这个库又属于哪一层呢?需要进一步分析。
更多相关文章
- Android JNI 使用的数据结构JNINativeMethod详解 ||建立Android
- Android最实用的各种技能点的网址链接(每天都会更新,希望大家用的
- Android ActionBar的源代码分析(二)
- Android之UI学习篇三:TextVeiw单击文字链接弹出Activity
- android平台下基于cmake编译链接ffmpeg-3.4.x的32位和64位(armea
- Android 轻松实现语音识别的完整代码[转]
- Android Studio 添加 C、C++ 代码
- Android 实现语音识别的完整代码
- Android 中使用代码动态网格布局