Android中的OpenSL ES是如何实现的?
来源:互联网 发布:重庆市网络知识竞赛 编辑:程序博客网 时间:2024/05/18 01:52
一般理解的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。真正的实现就是该库了。这个库又属于哪一层呢?需要进一步分析。
阅读全文
0 0
- Android中的OpenSL ES是如何实现的?
- Android利用opensl-es实现录音
- Android中如何实现播放音频设置不同的播放速率(MediaPlayer SoundPool AudioTrack OpenSL ES)
- Android 音频 OpenSL ES 录音
- Android采用opensl-es录音
- 基于ffmpeg+opengl+opensl es的android视频播放器
- Android的声音编程--使用OpenSL ES Audio
- android使用opensl es进行简单的音频播放
- Android的声音编程--使用OpenSL ES Audio
- OpenSL ES
- wzplayer for android正式支持OpenSL ES
- Android 音频 OpenSL ES URI播放
- Android 音频 OpenSL ES PCM数据播放
- Android+FFmpeg+OpenSL ES音频解码播放
- Android+FFmpeg+OpenSL ES音频解码播放
- Android 音频 OpenSL ES 录音 采集
- Android+FFmpeg+OpenSL ES音频解码播放
- Android Audio上层架构OpenSL ES、AAudio
- 听到别人发论文的感想
- openSUSE+Windows10(VirutalBox)
- Python进阶—*args与**kwargs详解
- 常用方法
- 一些与String相关的内容
- Android中的OpenSL ES是如何实现的?
- C#回顾学习笔记二十九:new关键字隐藏父类的方法
- 大数据预科班15
- 使用异或运算对交换两个变量的数据
- CSS相关及一些兼容性问题
- 【OJ相关】validator (UOJ / codeforces)
- 9-22
- NFS网络文件共享服务的配置和排错总结
- Rstudio安装出现问题