精华内容
参与话题
问答
  • Android 音频子系统简要介绍

    千次阅读 2014-11-16 15:14:53
    Android操作系统多媒体架构中,Audio子系统实现也是非常复杂的. 下面是Audio 架构图.

    Android多媒体架构中,Audio子系统实现也是非常复杂的.Audio子系统负责音频的输入输出,音频设备的控制。


    下面是Audio 架构图



    从图中可以看到抛出Linux内核,用户空间分为四层,下面简单的介绍用户空间四层:

    1:Application层,用户直接使用的应用

            Music 音乐应用

            MusicFX 音效控制应用,均衡器,例如:摇滚音效

           SoundRecorder 录音应用


    2:Framework层.Audio Java层Api

           AudioTack :音频原数据播放

           MediaPlayer:URI播放

           AudioRecord:原数据录制 

           MediaRecorder:压缩格式录制

           AudioEffect:音效控制

           SoundPool:低延迟音频输出,例如按键声音

           AudioManager:音频管理类,例如声音大小控制、输出模式控制扬声器切换到听筒等管理。

          

    3:Libraries 层包含 Natvie Api 和运行时库

           Natvie Api :OpenSL|ES 和 OpenMAX|AL 

           运行时库:MeidaFramework,Tinyalsa等

    4:HAL层,Android的HAL是为了避免不开源,如果放在Linux层必须开源,产商一般提供.so动态库。

            audio 对声卡驱动的控制,音频输入输出模块

            Audio_policy  负责音频设备的管理模块

            Audio_effect  音效处理模块


    后面我们将从应用层到HAL全面了解Android音频子系统,以及音频编解码知识。


    展开全文
  • Linux 驱动 ALSA模型: Linux ALSA声卡驱动之一:ALSA架构简介 Linux ALSA声卡驱动之二:声卡的创建 Linux ALSA声卡驱动之三:PCM设备的创建 Linux ALSA声卡驱动之四:Control设备的创建 Linux ALSA声卡驱动之五:...

    Linux 驱动 ALSA模型:

    Linux ALSA声卡驱动之一:ALSA架构简介
    Linux ALSA声卡驱动之二:声卡的创建
    Linux ALSA声卡驱动之三:PCM设备的创建
    Linux ALSA声卡驱动之四:Control设备的创建
    Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)
    Linux ALSA声卡驱动之六:ASoC架构中的Machine
    Linux ALSA声卡驱动之七:ASoC架构中的Codec
    Linux ALSA声卡驱动之八:ASoC架构中的Platform

    ALSA声卡驱动中的DAPM详解:

    ALSA声卡驱动中的DAPM详解之一:kcontrol
    ALSA声卡驱动中的DAPM详解之二:widget-具备路径和电源管理信息的kcontrol
    ALSA声卡驱动中的DAPM详解之三:如何定义各种widget
    ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route
    ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系
    ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
    ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)

    Linux ALSA 音频系统:物理链路篇
    Linux ALSA 音频系统:逻辑设备篇

    高通平台

    高通msm8996平台的ASOC音频路径分析(基于androidN及linux3.1x)
    qcom 音频相关的dsp driver笔记(基于msm8996平台)
    高通msm8996平台上的pa电源管理(wsa881x)

    DAPM(二)

    DAPM之一:概述
    DAPM之二:audio paths与dapm kcontrol
    DAPM之三:audio paths与asound.conf
    DAPM之五:dapm机制深入分析(上)
    DAPM之六:dapm机制深入分析(下)

    Android音频系统

    Android 音频系统:从 AudioTrack 到 AudioFlinger
    Android音频系统之AudioPolicyService
    深入剖析Android音频之AudioPolicyService
    Android音频系统之AudioFlinger(一)
    Android音频系统之AudioFlinger(二)
    Android音频系统之AudioFlinger(三)
    Android音频系统之AudioFlinger(四)
    Android音频系统之AudioTrack(一)
    Android音频系统之AudioTrack(二)

    展开全文
  • Android音频子系统,音频流(六)

    千次阅读 2017-11-15 16:29:48
    音频数据流音频正常的回放过程:比如用MediaPlayer播放音频,先要把音频文件读取到内存中,然后执行对应的解码...一个audiotrack代表一个播放实例,系统中可能同时运行多个audiotrack实例,同时系统中也会有多个音频...

    音频数据流

    音频正常的回放过程:

    比如用MediaPlayer播放音频,先要把音频文件读取到内存中,然后执行对应的解码操作,mediaplayer是在mediaplayerservice的帮助下完成解码相关操作的,mediaplayerservice会使用audiotrack完成播放功能。

    一个audiotrack代表一个播放实例,系统中可能同时运行多个audiotrack实例,同时系统中也会有多个音频回放设备,audiotrack和音频回放设备的对应关系由audiopolicyservice来确定,aps根据每个audiotrack所属“流类型”来为他选择与当前系统最匹配的输出设备,然后查找支持这个输出设备的audiofligner中的output输出通道(也就是openoutput所打开的通道)。

    Audioflinger执行audiopolicyservice确定好的路由策略,将各路音频数据进行混音,然后传到hal层,进一步输出到最终的音频设备中。在回放时,Audiofligner中起关键作用的有两个:一个是playbackthread,往通道中传输数据;一个是audiomixer,这是混音的核心。

     

    Audiotrack中的音频流

    以MediaAudioTrackTest.java中范例来分析:
    public void testSetStereoVolumeMax() @MediaAudioTrackTest.java throws Exception {
    AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, 
    TEST_FORMAT, minBuffSize, TEST_MODE);
    	track.write(data, 0, data.length);
    }
    

    上面的代码中,write函数把data数据写入audiotrack中,说明audiotrack内部一定申请了内存空间来存储音频数据,这是java层代码,下面直接看native层的实现:

    static jint android_media_AudioTrack_setup(…)@ android_media_AudioTrack.cpp{
    	sp<AudioTrack> lpTrack = new AudioTrack();
    //流模式下,音频数据是分多次传递的,这里传入的参数是0,audiotrack需要的内存空间是后面由audioflinger根据需要分配的一块缓冲区。
    	status = lpTrack->set(…0,// shared mem …);
    //静态模式下,把内存空间的地址(lpJniStorage->mMemBase)传给了audiotrack,这块空间是由AudioTrackJniStorage事先分配的。
    	status = lpTrack->set(…lpJniStorage->mMemBase,// shared mem …);
    }
    

    接着看流模式下分配的缓冲区:

    status_t AudioTrack::createTrack_l()@AudioTrack.cpp {
    // frameCount决定了申请缓冲区的大小。
    	sp<IAudioTrack> track = audioFlinger->createTrack(…frameCount…);
    //向audioflinger申请缓冲区
    	sp<IMemory> iMem = track->getCblk();
    //与audioflinger的ipc通信中介
    	mAudioTrack = track;
    	mCblkMemory = iMem;
    	audio_track_cblk_t* cblk = static_cast<audio_track_cblk_t*>(iMemPointer);
    	mCblk = cblk;
    }
    

    IAudioTrack在audioflinger中的实现是TrackHandler。

    sp<IMemory> AudioFlinger::TrackHandle::getCblk() const @ Tracks.cpp {
        return mTrack->getCblk();
    }
    

    这里的mTrack是一个playbackThread::track,是在audioflinger::createTrack时生成的。mTrack属于某个特定的playbackthread实例,每个audiotrack在audioflinger中都有一个对应的playbackthread。看看playbackthread::track如何生成一块内存区域:

    Track继承自trackbase,trackbase的构造函数中将申请所需的内存单元。

    AudioFlinger::ThreadBase::TrackBase::TrackBase(…frameCount…)@ Tracks.cpp {
    	if (client != 0) {
    		mCblkMemory = client->heap()->allocate(size);
    	}
    }
    

    mCblkMemory指向的内存地址由client指定,这个client是在Audioflinger::createtrack中生成的,每个playbackthread虽然有使用内存空间的权利,但是对内存的申请、回收仍是由audioflinger来掌控的。

    sp<IAudioTrack> AudioFlinger::createTrack( )@AudioFlinger.cpp{
    	sp<Client> client = registerPid(pid);
    }
    

    函数registerPid为当前的pid(audiotrack所在进程的pid)生成一个audioflinger::client实例,并将<pid,client>键值对添加到mclients中。每个audiotrack在audioflinger中有且仅有一个client实例。

     

           到这里,audiotrack和audioflinger中与音频数据相关的内存空间就分析完了。大致是这样的:

           Audiotrack(java)在构造时,通过本地方法native_setup来传递应用层所需的最小音频数据空间。

           Native_setup负责生成audiotrack(native)对象,此时还没涉及内存申请,随后调用Audiotrack::set接口,并将应用层计算出的数据空间大小转化为framecount。

           在set实现中,首先找到匹配的audioflinger中的playbackthread,接着调用audioflinger::createtrack在playbackthread中新增一个track,同时建立audiotrack和audioflinger间的通信接口Iaudiotrack。在audioflinger内部的track生成过程中,会有trackbase申请相应的内存空间。

           接下来audiotrack可以通过Iaudiotrack::getCblk来获得这个数据空间。

           之后audiotrack和audioflinger就能够利用这个数据缓冲区空间来传递音频数据,在audiotrack中,它是有audiotrack::mCblkmemory来表示,在audioflinger中,它是由Trackbase::mCBlkMemory来表示的。

           AudioMixer是由playbackthread(MixerThread)生成的,跟audioflinger属于同一个进程。AudioMixer中用于混音操作的缓冲区对象,和audiotrack,audiofligner中的数据区是同一个。

        AudioMixer内部由一个state_t结构体变量mState,其中的数组track_t         tracks[MAX_NUM_TRACKS]存储了最多32路Track数据,每个PlaybackThread::TrackBase在AudioMixer中对应tracks数组中一个元素。




    展开全文
  • android 音频子系统框架(一)

    千次阅读 2017-11-15 14:54:51
    Android 音频框架: 1,与应用程序开发有直接关联的是MediaPlayer,MediaRecorder。音频系统的核心由AudioFlinger、AudioPolicyService、AudioTrack/AudioRecorder三部分构成,其中AudioFlinger、...

    Android 音频框架:

     

    1,与应用程序开发有直接关联的是MediaPlayerMediaRecorder

    音频系统的核心由AudioFlingerAudioPolicyServiceAudioTrack/AudioRecorder三部分构成,其中AudioFlingerAudioPolicyService属于system service,驻留在audioserver进程,负责不断地处理AudioTrack/AudioRecorder的请求。

     

     

    依据Android音频框架图的几个层次结构:应用层,framework层,库层,hal层,kernel层来细分音频系统。

    1),app,比如音乐播放器

    2),framework层,开发音频产品使用最多的两个类MediaPlayerMediaRecorder;还有两个专门用于音频管理的类:AudioTrackAudioRecorder,系统服务MediaPlayerService内部的音频实现就是通过这两个类完成的。此外,还有AudioManagerAudioServiceAudioSystem类。

    3),Librariesframework层的java类只是app跟库文件的中介,这些中介并不会完全去实现相关的功能,真正的功能实现是在底层库中。跟音频相关的库很多,如:

    \frameworks\av\media\libmedia,包括的类有:AudioRecorder.cppAudioTrack.cppMediaRecorder.cppMediaPlayer.cpp等;

    音频系统的核心服务类:AudioFlinger.cpplibaudioflinger\frameworks\av\services\audioflinger路径下;

    AudioPolicyService.cpplibaudiopolicyservice在路径:frameworks\av\services\audiopolicy下。

    还有一个重要的系统服务MediaPlayerServicelibmediaplayerservic在目录:\frameworks\av\media\libmediaplayerservice下。

    其中,AudioTrackAudioRecordermediaPlayer,MediaRecorder是应用进程的一部分,通过Binder服务来与系统进程通信。

    4),HAL,音频硬件抽象层主要分为两个核心:AudioFlingerAudioPolicyServiceAudioFlinger是硬件抽象层的服务对象,一方面AudioFlinger可以不用直接调用底层的音频驱动,另一方面AudioFlinger的上层(包括同层的MediaPlayerService)模块,只需要与他进行通信就可以实现音频相关的功能了。AudioPolicyService实际并不是一个真实的设备,只是采用虚拟设备的方式让厂商可以方便的定制自己的“音频策略”。

    抽象层的任务是将AudioFlinger/AudioPolicyService真正的与硬件设备关联起来,但是又要保证底层的变化不对上层造成影响。所以Hal层提供了统一的接口来定义跟audioFlingerAudioPolicyService之间的通信方式,这就是audio_hw_device,audio_stream_in, audio_stream_out等结构体,这些struct数据类型内部只是提供了函数指针的定义,真正的实现要在AudioFlingerAudioPolicyService初始化时根据加载的库来填充。

     

    展开全文
  • 适用于铃声、系统提醒等对内存要求小的播放操作。一种是streaming,流模式和基于网络的音频流回放类似,音频数据严格按照要求不断地传递给接收方,直到结束。通常适用于音频文件较大时;音频属性要求高,如采样率高...
  • AudioPolicyServiceAudioFlinger是音频策略的执行者...Android系统中声音被换分为多个种类:AudioSystem.javapublic class AudioSystem{ public static final int STREAM_DEFAULT = -1; public static final int ...
  • Audiopolicyservice的路由实现:Audiopolicyservice作为音频策略的制定者,功能的实现跟audiotrack(使用者)有较大关联,所以在紧接着audiotrack看下路由的过程。路由,就要有发送方,接收方,这个场景中发送发就是...
  • 音频系统跟应用层直接相关的部分 从上层看,跟音频相关的功能概括说就是音频、视频的的录制、回放。与之直接相关的类有MediaPlayer,MediaRecorder。他们具有同时处理音频、视频的能力。 1, MediaPlayer主要处理...
  • android 音频子系统-AudioFlinger(二)

    千次阅读 2017-11-15 14:59:17
    音频系统的核心:AudioFlingerAudioFlinger为上层提供访问和管理音频的接口,同时通过hal来管理音频设备。AudioFlinger服务的启动:Framework/av/media/audioserver/main_audioserver.cpp int main(int argc __...
  • 网上已有许多朋友对Android音频子系统做了透彻的分析,我这完全是给自己在做学习笔记本文基于Android Ics AudioTrack的使用实例,在google的源码中已经为我们准备了AudioTrack的测试代码,代码路径如下: ...
  • 音频系统的播放接口由AudioTrack提供,每一个音频都会对应一个AudioTrack实例,它会通过iBinder来远程调用AudioFlinger的createTrack函数.AudioFlinger 会根据传入的frameCOunt参数申请一块内存,AudioTrack可以通过...
  • 音量的调节控制: 按下音量的加减键,对应的keyevent是:KEYCODE_VOLUME_DOWN,KEYCODE_VOLUME_UP。 主要看两个地方对这一事件的处理,一是:handleKeyDown()@AudioManager.java,一是: ... ...先看AudioMana
  • 1 Android 音频系统框架简介 音频系统的 整个框架图如下所示: 针对这张框架图。对几个关键的音频类进行说明: AudioFlinger:接收多个APP的数据,合并下发;是策略的执行者,例如具体如何与音频设备通信,如何...
  • 音频子系统(01)
  • 专题分纲目录 均为索引,本纲为:Android Framework 音频子系统 系列文章目录 Android Framework 音频子系统(01)音频基础知识 Android Framework 音频子系统(02)音频系统框架 Android Framework 音频子系统...
  • Android Audio - 音频子系统框架简析 // 从 APP 录音角度分析 AudioRecord.java create/set(设备(BT, DEFUALT), 通道数, 采样速率, 数据深度) start AudioRecord.cpp 1. set: new AudioRecordThread 读 RecordTrack....
  • 从上一节分析可以知道,Java层AudioTrack最终也是调用Native层的AudioTrack,所以我们分析的核心就是Native层的AudioTrack。本章节主要分析AudioTrack是如何跟output和playbackthread建立关联的。...
  • HAL层分析
  • 1 AudioRecord测试程序 核心源码分析 上一章节AudioRecord测试程序的 核心逻辑 整理...pAudioRecord = new android::AudioRecord(); //step2 set操作 pAudioRecord->set( inputSource, sampleRateInHz,audioF...
  • 1 从AudioPolicyService启动流程 到 AudioPolicyManager AudioPolicyService的启动是在Main_mediaserver.cpp中实现,代码如下: int main(int argc __unused, char** argv) { signal(SIGPIPE, SIG_IGN);...
  • 本章节主要分析AudioTrack的两种模式以及APP的AudioTrack 和 playbackThread的mTracks中的track 之间建立共享内存是如何实现的。 1 AudioTrack端 建立共享内存 1.1 AudioTrack的两种模式 APP创建AudioTrack,会和...
  • 1 录音基础知识 @1 PCM与WAV的关系 PCM音频数据是原始音频数据,无法使用播放器播放,需要给它加上一个头部,表明声音有几个通道,采样率是多少等等。... 采样精度:目前Android系统上固定为16bit。 声...
  • 这里使用两个测试程序来看,分别是 C++层的shared_mem_test 和 Java层的MediaAudioTrackTest.java。这两个测试程序的目录分别是: frameworks/base/media/tests/audiotests/shared_mem_test.cpp ...
  • 1 音量基础知识 @1 四大类Volume音量 master volume:设置它等于设置所有的stream volume和track volume。它可以写到声卡里面去,控制所有声音的音量。也可以不写到声卡里面去,而是作为一个乘数因子来影响所有的...

空空如也

1 2 3 4 5 ... 9
收藏数 175
精华内容 70
关键字:

android音频子系统