07_Android的Audio系统

合集下载

Android的Audio音频系统

Android的Audio音频系统

重新启动
如果 AudioFlinger 运行的 media_server 进程异常死掉,AudioSystem 会收到一个事件通知, void AudioSystem::DeathNotifier::binderDied(const wp<IBinder>& who) { Mutex::Autolock _l(AudioSystem::gLock); AudioSystem::gAudioFlinger.clear(); if (gAudioErrorCallback) { gAudioErrorCallback(DEAD_OBJECT); } LOGW("AudioFlinger server died!"); } 从而调用 android_media_AudioSystem.cpp 注册下来的回调函数,该函数又是通过 JNI 来调 用 AudioService.java 注册下来的回调函数, 在该函数中会发送 MSG_MEDIA_SERVER_DIED 消息,AudioService 会监听这个消息,这样 AudioService 就能知道 AudioFlinger 已不工作, 它就接着调用 getMode 来尝试连接到重启后的 AudioFlinger。 case MSG_MEDIA_SERVER_DIED: Log.e(TAG, "Media server died."); // Force creation of new IAudioflinger interface mMediaServerOk = false; AudioSystem.getMode(); break; 当连接成功后,AudioFlinger 会调用 android_media_AudioSystem.cpp 注册下来的回调函数, 该函数又是通过 JNI 来调用 AudioService.java 注册下来的回调函数,在该函数中会发送 MSG_MEDIA_SERVER_STARTED 消息。接着 AudioService 就去配置底层音频系统,包括 模式、路由、每一路流的音量大小和 Ringer 状态。 case MSG_MEDIA_SERVER_STARTED: // Restore audio routing and stream volumes applyAudioSettings(); for (int streamType = AudioSystem.NUM_STREAMS - 1; streamType >= 0; streamType--) { int volume; VolumeStreamState streamState = mStreamStates[streamType]; if (streamState.muteCount() == 0) { volume = streamState.mVolumes[streamState.mIndex];

Android Audio System

Android Audio System

引子Android Framework的音频子系统中,每一个音频流对应着一个AudioTrack类的一个实例,每个AudioTrack会在创建时注册到AudioFlinger中,由AudioFlinger把所有的AudioTrack进行混合(Mixer),然后输送到AudioHardware中进行播放,目前Android的Froyo版本设定了同时最多可以创建32个音频流,也就是说,Mixer最多会同时处理32个AudioTrack的数据流。

如何使用AudioTrackAudioTrack的主要代码位于frameworks/base/media/libmedia/audiotrack.cpp中。

现在先通过一个例子来了解一下如何使用AudioTrack,ToneGenerator是android 中产生电话拨号音和其他音调波形的一个实现,我们就以它为例子:ToneGenerator的初始化函数:[c-sharp]view plaincopybool ToneGenerator::initAudioTrack() {// Open audio track in mono, PCM 16bit, default sampling rate,default buffer sizempAudioTrack = new AudioTrack();mpAudioTrack->set(mStreamType,0,AudioSystem::PCM_16_BIT,AudioSystem::CHANNEL_OUT_MONO,0,0,audioCallback,this,0,0,mThreadCanCallJava);if (mpAudioTrack->initCheck() != NO_ERROR) {LOGE("AudioTrack->initCheck failed");goto initAudioTrack_exit;}mpAudioTrack->setVolume(mVolume, mVolume);mState = TONE_INIT;......}可见,创建步骤很简单,先new一个AudioTrack的实例,然后调用set成员函数完成参数的设置并注册到AudioFlinger中,然后可以调用其他诸如设置音量等函数进一步设置音频参数。

Android系统Audio框架

Android系统Audio框架

Android系统Audio框架介绍音频基础知识声音有哪些重要属性呢?1.响度(Loudness)响度就是人类可以感知到的各种声音的大小,也就是音量。

响度与声波的振幅有直接关系。

2.音调(Pitch)音调与声音的频率有关系,当声音的频率越大时,人耳所感知到的音调就越高,否则就越低。

3.音色(Quality)同一种乐器,使用不同的材质来制作,所表现出来的音色效果是不一样的,这是由物体本身的结构特性所决定的。

如何将各种媒体源数字化呢?音频采样将声波波形信号通过ADC转换成计算机支持的二进制的过程叫做音频采样(Audio Sampling)。

采样(Sampling)的核心是把连续的模拟信号转换成离散的数字信号。

1.样本(Sample)这是我们进行采样的初始资料,比如一段连续的声音波形。

2.采样器(Sampler)采样器是将样本转换成终态信号的关键。

它可以是一个子系统,也可以指一个操作过程,甚至是一个算法,取决于不同的信号处理场景。

理想的采样器要求尽可能不产生信号失真。

3.量化(Quantization)采样后的值还需要通过量化,也就是将连续值近似为某个范围内有限多个离散值的处理过程。

因为原始数据是模拟的连续信号,而数字信号则是离散的,它的表达范围是有限的,所以量化是必不可少的一个步骤。

4.编码(Coding)计算机的世界里,所有数值都是用二进制表示的,因而我们还需要把量化值进行二进制编码。

这一步通常与量化同时进行。

奈奎斯特采样理论“当对被采样的模拟信号进行还原时,其最高频率只有采样频率的一半”。

换句话说,如果我们要完整重构原始的模拟信号,则采样频率就必须是它的两倍以上。

比如人的声音范围是2~ 20kHZ,那么选择的采样频率就应该在40kHZ左右,数值太小则声音将产生失真现象,而数值太大也无法明显提升人耳所能感知的音质。

录制过程1.音频采集设备(比如Microphone)捕获声音信息。

2.模拟信号通过模数转换器(ADC)处理成计算机能接受的二进制数据。

android_audio计算volume_index的原理_解释说明

android_audio计算volume_index的原理_解释说明

android audio计算volume index的原理解释说明1. 引言1.1 概述本文旨在介绍Android Audio计算音量指数的原理。

随着移动设备的普及和多媒体应用的快速发展,对于音频控制和处理的需求也越来越高。

而音量调节是音频控制中一个重要的功能,它能够在不同场景下提供适当的音频输出水平。

因此,深入理解Android Audio计算音量指数的原理对于开发人员来说至关重要。

1.2 文章结构本文首先会介绍一些基础概念和知识,包括音量控制基础知识和音频采样与幅度计算。

接着,我们将详细解释Android Audio是如何计算音量指数的方法,并给出具体示例和案例分析进行验证。

最后,在结论与讨论部分总结全文观点,并展望该原理的进一步探索以及其应用前景和实际意义。

1.3 目的本文旨在帮助读者全面了解Android Audio计算音量指数的原理,从而更好地掌握音频控制与处理相关技术。

通过详细讲解相关概念和提供实例案例分析,读者将能够更加清晰地理解和应用音量指数计算方法。

同时,本文也旨在探索该原理的未来发展和实际应用前景,在推动音频技术进步的道路上起到积极的促进作用。

2. Android Audio 计算Volume Index 的原理:2.1 音量控制基础知识:音量控制在Android音频系统中扮演着重要的角色。

它用于调节设备的音频输出级别,使用户可以根据自己的需求来调整声音的大小。

在Android中,音量是通过使用一个0到100之间的值表示的。

较高的数值代表较高的音量,反之亦然。

2.2 音频采样与幅度计算:在计算Volume Index之前,我们需要理解一些关于音频采样和幅度计算的基础知识。

音频采样是指对连续模拟波形进行离散化处理以便数字化。

具体而言,在每个固定时间间隔内,将声波信号转换为数字序列。

这些采样可以用来表示声波信号随时间变化的幅度。

幅度指音频信号振幅大小或能量水平。

在计算机中,通常使用线性尺度或对数尺度来表示幅度值。

_Android的Audio系统

_Android的Audio系统

2.1 Audio 系统的各个层次
Audio 管理环节 Audio 输出 Audio 输入
Java 层
AudioSystem
AudioTrack
AudioRecorder
本地框架层
AudioSystem
AudioTrack
AudioRecorderห้องสมุดไป่ตู้
AudioFlinger
IAudioFlinger
2.2 media 库中的 Audio 框架部分 AudioSystem.h :
class AudioSystem { public: enum stream_type { // Audio 流的类型 SYSTEM = 1, RING = 2, MUSIC = 3, ALARM = 4, NOTIFICATION = 5, BLUETOOTH_SCO = 6, ENFORCED_AUDIBLE = 7, NUM_STREAM_TYPES }; enum audio_output_type { // Audio 数据输出类型 // …… 省略部分内容 }; enum audio_format { // Audio 数据格式 FORMAT_DEFAULT = 0, PCM_16_BIT, PCM_8_BIT, INVALID_FORMAT };
第二部分 Audio 系统和上层接口
2.1 2.2 2.3 2.4 2.5
Audio 系统的各个层次 media 库中的 Audio 框架部分 AudioFlinger 本地代码 Audio 系统的 JNI 代码 Audio 系统的 Java 代码
2.1 Audio 系统的各个层次
Audio 系统的结构: libmedia.so 提供 Audio 接口,这些 Audio 接 口既像上层开放,也向本地代码开发。 libaudiofilnger.so 提供 Audio 接口实现。 Audio 硬件抽象层提供到硬件的接口,供 AudioFlinger 调用。 Audio 使用 JNI 和 JAVA 对上层提供接口。

【Android系统原理与开发要点详解】07_Android的Audio系统

【Android系统原理与开发要点详解】07_Android的Audio系统
android的audio系统第一部分audio系统综述第二部分audio系统和上层接口第三部分audio的硬件抽象层android的audio系统第一部分audio系统综述audio系统在android中负责音频方面的数据流传输和控制功能也负责音频设备的管audio系统主要的分成几个层次
Android 的 Audio 系统
2.2 media 库中的 Audio 框架部分
AudioSystem +setXXX() +getXXX() IAudioFlinger +createTrack () +openRecord() +registerClient()
AudioTrack -mAudioTrack +start() +stop() +flush() +pause () +write() BnAudioFlinger IAudioTrack
Audio 系统的头文件 (路径为: frameworks/base/include/media/ ) : AudioSystem.h IAudioFlinger.h AudioTrack.h IAudioTrack.h AudioRecorder.h IAudioRecorder.h Ixxx 的接口通过 AudioFlinger 来实现,其他接口 通过 JNI 向上层提供接口。
2.2 media 库中的 Audio 框架部分
enum audio_mode { // Audio 模式 // …… 省略部分内容 }; enum audio_routes { // Audio 路径类型 ROUTE_EARPIECE = (1 << 0), ROUTE_SPEAKER = (1 << 1), ROUTE_BLUETOOTH_SCO = (1 << 2), ROUTE_HEADSET = (1 << 3), ROUTE_BLUETOOTH_A2DP = (1 << 4), ROUTE_ALL = -1UL, }; static status_t setMasterVolume(float value); static status_t setMasterMute(bool mute); static status_t getMasterVolume(float* volume); static status_t getMasterMute(bool* mute); static status_t setStreamVolume(int stream, float value); static status_t setStreamMute(int stream, bool mute); static status_t getStreamVolume(int stream, float* volume); static status_t getStreamMute(int stream, bool* mute); static status_t setMode(int mode); static status_t getMode(int* mode); static status_t setRouting(int mode, uint32_t routes, uint32_t mask); static status_t getRouting(int mode, uint32_t* routes); // …… 省略部分内容 };

android系统开发(十)-audio移植一

android系统开发(十)-audio移植一

android系统开发(十)-audio移植一android系统开发(十)-audio移植一1,移植基础:(1)内核声音驱动和alsa驱动(2)alsa-lib和alsa-utils库移植这两部分上一节已经介绍过了。

2,android的audio最核心的部分是audioflinger,audioflinger向上处理来自于应用程序的声音相关的所有请求向下通过AudioHardwareInterface访问硬件,android的audio架构如下所示:Applications|Frameworks|JNI|AudioFlinger|AudioHardwareInterface| | |专有audio库| alsa用户库| |/dev/eac /dev/snd/*| |内核eac驱动内核alsa驱动AudioHardwareInterface是audioflinger和硬件驱动之间的桥梁,android默认编译的是generic audio,此时AudioHardwareInterface直接指向了/dev/eac驱动,它通过eac驱动来操作声卡,android audio移植就是要让AudioHardwareInterface直接或者间接指向我们自己定义的声音驱动,一般都采用alsa声音体系,所以我们的目的就是要让AudioHardwareInterface指向alsa用户库。

下面的内容开始移植alsa-audio3,修改vendor/ardent/merlin/BoardConfig.mk文件内容如下:BOARD_USES_GENERIC_AUDIO := falseBOARD_USES_ALSA_AUDIO := trueBUILD_WITH_ALSA_UTILS := true上面配置的目的就是为了让要让AudioHardwareInterface指向alsa用户库4,下面来添加audio库的编译在vendor/ardent/merlin目录下新建一个libaudio目录,修改AndroidBoard.mk文件,添加编译路径如下:LOCAL_PATH := $(call my-dir)L_PATH := $(LOCAL_PATH)include $(L_PATH)/libaudio/Mdroid.mk5,vendor/ardent/merlin/libaudio目录下新建一个Mdroid.mk 文件,内容如下:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := libaudioLOCAL_SHARED_LIBRARIES := \libcutils \libutils \libmedia \libhardwareLOCAL_SRC_FILES += AudioHardwareMerlin.cpp LOCAL_CFLAGS +=LOCAL_C_INCLUDES +=LOCAL_STATIC_LIBRARIES += libaudiointerface include $(BUILD_SHARED_LIBRARY)6,android audio的实现方法,我们现看看接口部分,上面有说道audioflinger是通过AudioHardwareInterface指向驱动的AudioHardwareInterface类的代码在frameworks/base/libs/audioflinger/AudioHardwareInterface .cpp文件中该文件中的create函数中定义了AudioHardwareInterface 指向驱动的代码如下:AudioHardwareInterface* hw = 0;char value[PROPERTY_VALUE_MAX];#ifdef GENERIC_AUDIOhw = new AudioHardwareGeneric();#else// if running in emulation - use the emulator driverif (property_get("ro.kernel.qemu", value, 0)) {LOGD("Running in emulation - using generic audio driver");hw = new AudioHardwareGeneric();}else {LOGV("Creating Vendor Specific AudioHardware");hw = createAudioHardware();}#endifreturn hw;当系统为generic audio的时候此函数返回的是一个指向AudioHardwareGeneric对象的指针,其实是返回一个指向AudioHardwareInterface对象的指针,因为AudioHardwareGeneric是AudioHardwareInterface的子类,继承关系如下:AudioHardwareInterface-&gt;AudioHardwareBase-&gt;Au dioHardwareGeneric如果系统不是generic audio,则通过调用createAudioHardware函数来返回一个指向一个指向AudioHardwareInterface对象的指针,所以,简单的将,我们要做的事情就是实现这个函数以及它相关的内容即可。

android audio系统介绍

android audio系统介绍

Android 音频系统整理在framework中c/c++层的音频系统服务主要有三个。

在base/media/mediaserver/Main_mediaserver.cpp的代码中可以找到。

一个是AudioFlinger, MediaPlayerService, 和AudioPolicyService。

AudioFlinger和AudioPolicyService是android audio系统的服务,负责音频方面的数据流传输和控制功能,也负责音频设备的管理。

这个部分作为Android的Audio系统的输入/输出层次,一般负责播放PCM声音输出和从外部获取PCM声音,以及管理声音设备和设置。

Mediaplayerservice 是Android中很重要也最为复杂的媒体播放器(MediaPlayer)部分的服务。

MediaPlayer在底层是基于OpenCore(PacketVideo)和stagefright的库实现的。

音频服务端和客户端之间的交互包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。

代码框架:1:Java部分代码(frameworks/base/media/java/android/media)2:Audio的JNI层JNI的cpp分布在两个部分,base/core/jni中有AudioRecord,AudioSystem,AudioTrack,JetPlayer,ToneGenarator,其他的在base/media/jni中。

3:Audio的c/c++层1)Audio框架见下图:Audio本地框架是media库的一部分,本部分内容被编译成库libmedia.so,主要实现AudioSystem、AudioTrack和AudioRecorder三个类,对上面提供接口,由下层的本地代码去实现。

AudioFlinger内容被编译成库libaudioflinger.so,它是Audio系统的本地服务部分,它是audio系统中真正做事的类,它通过硬件抽象层提供到硬件的接口。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一部分 Audio 系统综述
Media 库( libmedia.so )的 Audio 部分的目录中: frameworks/base/include/media/ frameworks/base/media/libmedia/ 这部分的内容被编译成库 libmedia.so ,提供 Audio 部分的接口。 Audio Flinger (libaudioflinger.so) : frameworks/base/libs/audioflinger 这部分内容被编译成库 libaudioflinger.so 。
2.1 Audio 系统的各个层次
Audio 管理环节 Audio 输出 Audio 输入
Java 层
AudioSystem
AudioTrack
AudioRecorder
本地框架层
AudioSystem
AudioTrack
AudioRecorder
AudioFlinger
IAudioFlinger
2.3 AudioFlinger 本地代码
Audio 是 AudioFlinger 系统的中间层,其代码 的路径为: frameworks/base/libs/audioflinger AudioFlinger 的核心文件是 AudioFlinger.h 和 AudioFlinger.cpp ,提供了类 AudioFlinger ,这 个类是一个 IAudioFlinger 的实现。
2.2 media 库中的 Audio 框架部分
Audio 系统的头文件在 frameworks/base/include/media/ 目录中,主要的头文件如下: AudioSystem.h : media 库的 Audio 部分对上层的总管接 口; IAudioFlinger.h :需要下层实现的总管接口; AudioTrack.h :放音部分对上接口; IAudioTrack.h :放音部分需要下层实现的接口; AudioRecorder.h :录音部分对上接口; IAudioRecorder.h :录音部分需要下层实现的接口。 IAudioFlinger.h 、 IAudioTrack.h 和 IAudioRecorder.h 这 三个接口通过下层的继承来实现(即 AudioFlinger )。 AudioFlinger.h , AudioTrack.h 和 AudioRecorder.h 是对 上层提供的接口,它们既供本地程序调用(例如声音的播放 器、录制器等),也可以通过 JNI 向 Java 层提供接口。
第一部分 Audio 系统综述
Audio 的 JNI 部分: frameworks/base/core/jni Audio 的 JAVA 部分: frameworks/base/media/java/android/media 主要包含 AudioManager 和 Audio 系统的几个类。 Audio 硬件抽象层的接口: hardware/libhardware_legacy/include/hardware/
2.3 AudioFlinger 本地代码
AudioFlinger 的实现:
class AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient { public: // …… 省略部分内容 virtual sp<IAudioTrack> createTrack( // 获得音频输出接口( Track ) pid_t pid, int streamType,uint32_t sampleRate, int format,int channelCount, int frameCount, uint32_t flags, const sp<IMemory>& sharedBuffer, status_t *status); // …… 省略部分内容 virtual status_t setMasterVolume(float value); virtual status_t setMasterMute(bool muted); virtual status_t setStreamVolume(int stream, float value); virtual status_t setStreamMute(int stream, bool muted); virtual status_t setRouting(int mode, uint32_t routes, uint32_t mask); virtual uint32_t getRouting(int mode) const; virtual status_t setMode(int mode); virtual int getMode() const; virtual sp<IAudioRecord> openRecord( // 获得音频输出接口( Record ) pid_t pid,int streamType, uint32_t sampleRate, int format, int channelCount,int frameCount, uint32_t flags,status_t *status); }
2.2 media 库中的 Audio 框架部分 AudioSystem.h :
class AudioSystem { public: enum stream_type { // Audio 流的类型 SYSTEM = 1, RING = 2, MUSIC = 3, ALARM = 4, NOTIFICATION = 5, BLUETOOTH_SCO = 6, ENFORCED_AUDIBLE = 7, NUM_STREAM_TYPES }; enum audio_output_type { // Audio 数据输出类型 // …… 省略部分内容 }; enum audio_format { /= 0, PCM_16_BIT, PCM_8_BIT, INVALID_FORMAT };
2.2 media 库中的 Audio 框架部分
AudioSystem +setXXX() +getXXX() IAudioFlinger +createTrack () +openRecord() +registerClient()
AudioTrack -mAudioTrack +start() +stop() +flush() +pause () +write() BnAudioFlinger IAudioTrack
BnAudioTrack
IAudioFlingerClient
AudioRecord -mAudioRecord +start() +stop() +flush() +pause () +read()
BnAudioFlingerClient IAudioRecord
BnAudioRecord
2.2 media 库中的 Audio 框架部分
Audio 系统的头文件 (路径为: frameworks/base/include/media/ ) : AudioSystem.h IAudioFlinger.h AudioTrack.h IAudioTrack.h AudioRecorder.h IAudioRecorder.h Ixxx 的接口通过 AudioFlinger 来实现,其他接口 通过 JNI 向上层提供接口。
IAudioTrack
IAudioRecorder
硬件抽象层
AudioHardwareInterface
AudioStreamOut
AudioStreamIn
2.2 media 库中的 Audio 框架部分
Android 的 Audio 的核心框架在 media 库中 提供,其中对上面主要实现 AudioSystem 、 AudioTrack 和 AudioRecorder 三个类。 提供了 IAudioFlinger 类接口,在这个类 中,可以获得 IAudioTrack 和 IAudioRecorder 两个接口,分别用于声音的播放和录 制。 AudioTrack 和 AudioRecorder 分别通过调 用 IAudioTrack 和 IAudioRecorder 来实现。
Android 的 Audio 系统
Android 的 Audio 系统

第一部分 Audio 系统综述 第二部分 Audio 系统和上层接口 第三部分 Audio 的硬件抽象层
第一部分 Audio 系统综述
Audio 系统在 Android 中负责音频方面的数 据流传输和控制功能,也负责音频设备的管 理。 Audio 系统主要的分成几个层次: 1. media 中库提供的 Audio 系统的上层接口 2. AudioFlinger 作为 Audio 系统的中枢 3. Audio 库的硬件抽象层提供底层的支持 4. Audio 接口通过 JNI 和 Java 框架提供给上 层 Audio 系统的上层接口主要提供了两方面的 功能:放音( Track )和录音( Recorder )。
第一部分 Audio 系统综述
Java Audio Class Java 框架
Audio JNI Audio 本地API
Audio Flinger (libaudioflingerso) .
AudioHardwareInterface libmedia Audio Recorder Audio System Audio Track Audio HAL (libaudio.so) C框架 内核空间 Audio Driver /dev/eac Audio Generic A2dp
相关文档
最新文档