自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

江南才尽江南山,年少无知年少狂!

愿你十载归来,你仍年少依旧狂,那时漫天枫叶书窗前,笔墨深秋锁江南!

  • 博客(54)
  • 收藏
  • 关注

原创 08.音频系统:第006课_音频系统HAL分析:第002节_HAL之调用流程源码分析

在上小节中,分析了android音频系统中,HAL代码的框架,该小节我们根据源代码查看一下流程,加深一下理解。在分析源代码之前,我们先俩看看HAL在整个音频系统中,他处于什么位置,下面是一个框图,相关知识点,在前面的小节中,都已经讲解过:现在我们来回顾一下,假设有一个android手机,他上面有喇叭,我们在听音乐的时候,声音会中喇叭中播放出来,当插上耳机的时候,声音就从耳机中播放出来,那么这整......

2019-04-30 16:08:10 2582 3

原创 08.音频系统:第006课_音频系统HAL分析:第001节_HAL之框架

该小节开始,分析音频系统HAL分析,在前面有一章节:第004课_Android音频系统详解。详细的分析了Android音频系统的源码,但是那些都是系统集成的,一般来说,我们在移植的时候,都不需要去理会的,只需要修改HAL层即可。首先我们来讲解一下音频系统HAL的框架,我们要分析HAL层,那么他的相关文件由那些呢?audio_hw_hal.cpp (hardware\rock......

2019-04-30 11:27:24 2658 1

原创 08.音频系统:第003课_Linux音频驱动程序:第004节_切换声音通道流程

在前面两节中,我们根据耳麦的拔插,修改了系统源码,在andriod设备状态栏中显示或者隐藏状态栏的信息,并且分析了插拔耳麦导致系统的整个流程。...

2019-04-29 14:49:37 2641 3

原创 08.音频系统:第003课_Linux音频驱动程序:第003节_耳麦拔插事件调用流程分析

在前面的小节中,我们编写了一个驱动程序,模拟耳机的插拔事件,其可以上报耳机的拔插事件,并且修改了android的源代码,可以根据耳机的拔插事件,在状态栏上现实或者消除耳麦的图标,这节视频我们讲解耳麦插拔事件导致的程序调用流程。前面提到过,有两种上报插拔事件的方式,一种是使用输入子系统,另外一种是使用swith dev(实质是使用uevent,通过网络上报事件),那么我们的anroid系统最终是使......

2019-04-29 14:42:53 2041

原创 08.音频系统:第003课_Linux音频驱动程序:第002节_在状态栏显示耳麦图标

在上小节编写了一个耳麦插拔的驱动程序,按理说接上耳麦的时候,我们应该声音通道,让声音从耳机中输出出来,我们需改修改一下源代码,让他在状态栏显示耳麦的图标。我们需要做以下事情:1.确定在状态栏上图标的位置2.创建图标文件3.修改源代码,当接受到消息时,显示或者清除图标4.编译文件,然后替换单板的源文件。修改文件frameworks\base\core\res\res\values\conf......

2019-04-28 17:01:54 636

原创 08.音频系统:第005课_项目实战1_耳麦拔插:第001节_驱动程序上报耳麦拔插事件

在接下来的几个小节中,会讲解几个音频的项目,现在想讲解第一个项目:对 耳麦拔插事件的处理,一起分为四个小节左右:5.1 驱动程序上报耳麦拔插事件5.2 在状态栏显示耳麦图标5.3 耳麦拔插事件调用流程分析5.4 切换声音通道流程在讲解驱动程序之前,先讲解几个概念:如上,对于耳机,有很多类型,带麦克的耳机术语叫做headset,不带麦克的术语叫做headphone:上面是一个and......

2019-04-28 13:29:36 1444

原创 08.音频系统:第004课_Android音频系统详解:第011节_PlaybackThread处理流程

上小节我们讲解了音频数据的传输,应用程序会创建一个AudioTrack,然后会到时其与playbackThread之间创建一个共享内存,当然这个共享可以是应用程序创建,也可以是playbackThread创建。应用程序只要把数据写入到共享内存,playbackThread就能从共享内存得到数据,然后播放数据。那么我们来看一个问题,我们有2个应用程序,同时播放声音,每个应用程序都创建了一个Audi......

2019-04-27 19:30:44 3001

原创 08.音频系统:第004课_Android音频系统详解:第010节_音频数据的传递

通过前面的学习,在应用程序中,每创建一个AudioTrack,在AudioFlinger边,某个playbackThread中就会创建一个Track与其对应,Track与AudioTrack之间,通过共享内存传递音频数据,那么怎么传递这个数据呢?其实非常的简单,分为两种情况1.MODE_STATIC:一次性,提前提供数据。2.MODE_STREAM:多次传输,是一边播放,一边提供数据在第一种......

2019-04-26 20:05:19 2009

原创 08.音频系统:第004课_Android音频系统详解:第009节_AudioTrack创建过程_Track和共享内存

在上小节中我们讲解了,在AudioTrack创建过程中,他会选择一个output,一个output对应一个播放设备,他也对应着一个播放线程,该小节我们讲解在这个线程之中,怎么去创建一个Track,应用程序的AudioTrack与播放线程之中的Track是一一对应的,并且我们还会讲解应用程序的AudioTrack与播放线程之中的Track他们之间是怎么传递数据的,也就是说,他们是通过怎样的内存传递数......

2019-04-26 14:35:10 2234 1

原创 08.音频系统:第004课_Android音频系统详解:第008节_AudioTrack创建过程_选择output

应用程序创建的AudioTrack怎么去选择output呢?下面是上小节的图:首先应用程序传入声音类型,然后根据声音类型会设置一个属性,然后根据声音的属性确定他的组/类别,找到device,最后在根据device找到对应的output(一个device可能对应多个output,但是只选择一个)。一下其调用过程:a. APP构造AudioTrack时指定了 stream typeb. Aud......

2019-04-25 18:04:03 2583 1

原创 08.音频系统:第004课_Android音频系统详解:第007节_AudioPolicyManager堪误与回顾

上小节我们对AudioTrack创建作了一些概述,知道其大概会做如下事情:1 使用AudioTrack的属性, 根据AudioPolicy找到对应的output、playbackThread2 在playbackThread中创建对应的track3 APP的AudioTrack 和 playbackThread的mTracks中的track之间建立共享内存第一点我们先来讲解第一点,应用程......

2019-04-24 17:39:34 4253

原创 08.音频系统:第004课_Android音频系统详解:第006节_AudioTrack创建过程

上面的是C++的测试函数,现在我们来看看Java的测试程序frameworks\base\media\tests\MediaFrameworkTest\src\com\android\mediaframeworktest\functional\audio\MediaAudioTrackTest.java,在使用java编写的程序之前,我们应该知道,其也存在同名的AudioTrack类。所以APP的AudioTrack和playbackThread的mTracks中的track之间需要建立共享内存。...

2019-04-24 10:20:21 1430

原创 08.音频系统:第004课_Android音频系统详解:第005节_AudioFlinger启动过程分析

该小节讲解AudioFlinger启动的过程,作为一个硬件访问服务,其启动过程十分的简单,只需要向系统注册服务就可以了,然后被动的等待其他的客户端来访问。在上一小节讲解了AudioPolicyService的启动过程,其除了注册本身的服务之外,还调用了AudioFlinger加载厂家提供的so文件。并且open某个output。在这小节的我们除了讲解AudioFlinger服务之外,还会讲解上小......

2019-04-23 14:15:51 2270 1

原创 08.音频系统:第004课_Android音频系统详解:第004节_AudioPolicyService启动过程分析

经过前面小节的学习我们知道android音频系统中有两个服务:AudioFlinger与AudioPolicyService。该小节我们讲解AudioPolicyService,他会做哪些事情呢?比如应用程序要播放声音,那么这个声音从哪个设备播放出来,其就是通过AudioPolicyService来决定的。假设android系统中有两个声卡设备,如下图所示:那么他的默认声卡是谁?在声卡一上面......

2019-04-23 10:54:17 2241

原创 08.音频系统:第004课_Android音频系统详解:第003节_所涉及文件形象讲解

上小节我们讲解了:stream type, strategy, device, output, profile, module : policy,out flag的基本概念,理解了这些概念之后,我们就比较容易去分析代码了。那么我们需要去分析那些代码呢?这些代码都在那些文件呢?该小节我们讲解以下所涉及的文件:所涉及文件形象讲解系统服务APP:frameworks/av/media/medi......

2019-04-21 13:58:41 1675

原创 08.音频系统:第004课_Android音频系统详解:第002节_以例子说明几个重要概念

该小节我们以几个例子,说明几个重要的概念:stream type, strategy, device, output, profile, module : policy,out flag我们先画一个图,假设深黑色大框为我们的andriod设备:接着声卡,声卡上面有一个喇叭,以及一个耳机/麦克插孔。andriod设备还又蓝牙设备,我们也可以使用蓝牙,接上一个蓝牙耳机。还有一个HDMI接口,H......

2019-04-20 15:51:23 2404 1

原创 08.音频系统:第004课_Android音频系统详解:第001节_分析思路

在音频系统第一课时的时候,有如下一副框图。围绕这下图讲解了音频系统的框架:但是该框图不够细致,为了大家更加详细的了解音频系统,存在如下框图:后续我们将围绕这个框图进行讲解,我们先看看右边:在右边的AudioHAL下面的prmary_out,low_latency等等我们称其为output,一个output对应一个/多个设备节点(为什么是多个,我们后续进行分析),每一个output都有一个......

2019-04-20 11:41:52 4629

原创 08.音频系统:第003课_Linux音频驱动程序:第008节_DAPM的情景分析_使用过程

该小节我们讲解DAPM的情景分析的构造过程,我们先回顾一下widget上电的过程,如下是一条上电路线:从LINPUT1经过两个Mixer到达ADC,从图上可以看出,控制接口共六个部分,只要其中有一个部分没有打开(connect),则该线路的所有开关都不会打开。如果其上所有接口都开看,并且有应用程序使用这个声卡,那么图中的四个widget全部都会打开。这样就是comlete path,即满足3个......

2019-04-19 14:56:22 1242

原创 08.音频系统:第003课_Linux音频驱动程序:第008节_DAPM的情景分析_构造过程

上小节我们讲解了route_path添加过程分析,该小节我们进行DAPM的情景的情景分析,即讲解几个例子。下面是一个图示(看起来比较混乱,不过没有关系,可以当做接线部分不存在,然后再讲解的过程中慢慢观看):下面,我们将围绕上图示进行讲解:在linux系统中,其会用一个结构体去表示一个硬件,其中结构体snd_soc_card就表示我们的声卡,其中有两个链表,分别为widgets,snd_car......

2019-04-18 18:28:28 1114

原创 08.音频系统:第003课_Linux音频驱动程序:第007节_route_path添加过程分析

该小节我们讲解route与path添加过程分析。会使用一些例子,把这个过程讲解清楚。打开源码文件rt5651.c,根据之前的分析我们知道:static const struct snd_soc_dapm_route rt5651_dapm_routes[] = { ...... {"IN1P", NULL, "LDO"}, {"RECMIXL", "BST1 Switch", "BST1......

2019-04-18 14:05:19 1636

原创 08.音频系统:第003课_Linux音频驱动程序:第006节_DAPM的kcontrol注册过程

在上小节我们初步的讲解了DAPM的widget,route,path3个概念,并且猜测了DAPM对他们的使用过程,接下来的几个小节,我们根据代码讲解DAPM的调用过程:a,dapm的kcontrol注册过程b,tinymix,tinyplay,tinycap殊途同归,都会调用dapm_power_widgets函数c,dapm的核心,comlete path该小节我们先讲解第一点dapm的......

2019-04-17 17:39:53 1172

原创 08.音频系统:第003课_Linux音频驱动程序:第005节_DAPM_widget_route_path

DAPM是Dynamic Audio PowerManagement的缩写,译过来就是动态音频电源管理的意思。DAPM是为了使基于linux的移动设备上的音频驱动子系统,在任何时候都工作在最小功耗状态下。DAPM对用户空间的应用程序来说是透明的,所有与电源相关的开关都在ASoc Core中完成。用户空间的应用程序无需对代码做出修改,也无需重新编译。如果没有改系统,我们驱动程序是非常复杂了:......

2019-04-17 11:37:02 2187 2

原创 08.音频系统:第003课_Linux音频驱动程序:第004节_声卡控制之kcontrol

一个芯片之中有多个寄存器,一个寄存器里,某些位用来表示某个功能。如下,那我们要分析的kcontrol是表示一个功能,还是表示一个寄存器呢?当然使用kcontrol表示一个功能比较好,如下:在打开某个功能的时候,我们去操作某个kcontrol就可以了。显然我们找到了kcontrol的核心,寄存器的某些位来表示一个功能,其可能是一个位,也可能是多个位,显然这些位的读写函数都是各不相同。kcontr......

2019-04-16 18:16:39 2136

原创 08.音频系统:第003课_Linux音频驱动程序:第003节_RK3399声卡驱动移植_combine

该小节我们讲解一下开发板RK3399声卡rt5651的移植,主要分为4个部分,platfrom,codec,machine,dts(设备树)。首先我们从设备树开始讲起,当然在讲解之前,我们先来体验下声卡的效果,第一种方法,就不多说了,直操作系统的录音软件。第二中方法是通过命令录音,播音:录音(tinycap):用法:tinycap file.wav [-D card] [-d devic......

2019-04-16 16:39:24 3749

原创 08.音频系统:第003课_Linux音频驱动程序:第002节_ASoC音频驱动框架

通过上小节alsa音频驱动框架的分析,知道如果要去写一个声卡驱动,我们需要分配,设置,注册snd_card结构体:定义一个struct snd_card *card;snd_card_new //里面会创建控制接口snd_pcm_new //里面会创建playback,capture接口snd_card_register(card) //对于嵌入式操......

2019-04-13 17:10:52 4536 1

原创 08.音频系统:第003课_Linux音频驱动程序:第001节_alsa音频驱动框架

在上小节我们分析了Adndroid系统音频的框架,这么一个复杂的系统我们怎么去学习呢?我们从下往上学,先分析音频的驱动程序,看看linux系统中驱动程序是怎么编写的,他的结构是怎么样的,然后在琢磨Tinyalsa,是如何去播放,录制声音的。在该课时接下来的所有小节都会讲解linux音频驱动程序。该小节先讲解一下alsa音频驱动的框架:在编写应用程序的时候,我们都是使用标准的open,read,......

2019-04-13 13:19:31 3516

原创 08.音频系统:第002节_Android音频系统框架简述

该小节我们来讲解Android音频系统框架,了解了框架之后,我们才能更加容易的去查看以及分析源码,有了框架才不会遗失方向。下面是一个大框图,该小节我们将围绕下面的图示进行讲解:以前总提到,写应用程序的人,不应该关心应用的实现,所以我们会给硬件写一个驱动,然后写应用程序的人直接调用驱动就可以访问硬件了如下:简单的应用程序使用这种方法是没问题的,但是一些复杂的硬件还是不行,应用程序需要了解很......

2019-04-13 09:13:48 2369 5

原创 05.Binder系统:第8课第6节_Binder系统_JAVA实现_内部机制_Server端

该小节我们讲解Binder系统使用java实现Server端的机制,下面是指向讲解的binder系统的分成图示:在这幅图中有3个疑问:1.java的client端怎么发送数据给驱动程序,驱动只能和C或者C++代码对接。2.Server端怎么从驱动程序读取数据。3.Server端读取到数据之后,其如何调用到IHelloService.cpp中的onTransact方法。在上小节中,我们已......

2019-04-12 10:29:41 393

原创 05.Binder系统:第8课第5节_Binder系统_JAVA实现_内部机制_Client端

上小节讲解了Binder系统的分层,该小节我们讲解Binder系统的内部机制,在上小节我们遗留了很多问题没有接到。1.应用程序是java编写的,binder系统是C程序,那么java程序是如何调用C程序的呢?我们先来回到这个问题,即这个小节需要讲解的内容:从上图我们可以看到:TestServer首先通过addservice向service_manager注册服务:这个时候TestServ......

2019-04-11 14:33:13 363

原创 05.Binder系统:第8课第4节_Binder系统_分层

该小节我们开始讲解Binder在Java中的实现机制,我们先来回顾一下binder系统的运行过程。bingder系统回顾在binder的应用程序中,他会涉及3个应用程序,如下图所示:如上所示,这三个程序分别为server,service_manager,client。一般流程如下:server: 1.通过addservice(“heelo”,xxx),添加服务。 2.驱动生成一个对应......

2019-04-11 10:43:55 372

原创 07.显示系统:第005课_Vsync机制:第007节_rebuildLayerStacks源码分析

前面讲解了那么多的基础知识,现在 我们可以进入界面合成流程的分析了。下面是一个手机APP的界面图:在其中有很多个应用程序,从图上的标记,我们就知道了4个APP,那么这些APP的界面时怎么合成的呢?有两种方法:1.在FrameBuffer上一次画出每个APP,然后在FrameBuffer上显示出来。比如这对这四个APP:先获得一个FrameBuffer,先画出分别画出APP1,2,3,如下:......

2019-04-10 15:34:31 704

原创 05.Binder系统:第8课第3节_Binder系统_JAVA实现_hello服务_测试

下面的是上小节编写的程序,经过修改并且编译成功能正常运行的代码:IHelloService.aidl/** {@hide} */interface IHelloService{ void sayhello(); int sayhello_to(String name);}HelloService.javaimport android.util.Slog;/* 实现Hell......

2019-04-10 12:44:21 244

原创 05.Binder系统:第8课第2节_Binder系统_JAVA实现_hello服务_编程

该小节我们将使用java实现一个hello服务,曾经我们讲解硬件访问服务的时候,实现一个LED服务,那个时候我们只知道照葫芦画瓢,并不知道其中的原理,该小节我们写出hello服务之后,相信你对他的原理就比较了解了。c++编写先回顾一下,我们使用C++编写的Hello服务。首先定义一个IHelloService.h接口,其中有两个函数sayhello与sayhello_to,然后在server......

2019-04-09 17:55:44 397

原创 07.显示系统:第005课_Vsync机制:第007节_rebuildLayerStacks源码分析

在讲解该小节之前,我们来回顾之前编写的一个程序SurfaceTest.cpp:#include <cutils/memory.h>#include <utils/Log.h>#include <binder/IPCThreadState.h>#include <binder/ProcessState.h>#include <bin...

2019-04-09 14:02:18 414

原创 05.Binder系统:第8课第1节_Binder系统_JAVA实现_Android里java程序的编译启动

这是我们讲解binder系统的最后一个课时,会讲解binder系统java的实现,在讲解之前,我们先讲解一个基础知识。怎么在android系统中运行我们的java程序,因为后面我们会编写一些没有GUI的java程序,我们看看怎么运行他。下面是一简单的java程序:public class Hello { public static void main(String args[]) { S......

2019-04-09 10:38:51 244

原创 05.Binder系统:第7课第6节_Binder系统_c++实现_内部机制_添加服务

学习到这个我们对Binder系统以及非常的了解了,那么我们现在添加一个binder服务会不会非常的简单呢?假设现在我们添加一个服务,server端涉及一个BnGoodbyeService,client涉及一个BpGoodbyeService,其中实现两个函数saygoodbye,saygoodbye_to。BpGoodbyeService与BpGoodbyeService对使用同一个接口IGoo......

2019-04-09 09:04:17 286

原创 07.显示系统:第005课_Vsync机制:第007节_rebuildLayerStacks源码分析

通过前面小节的讲解我们知道,surfaceflinger在接收到Vsync信号之后,会执行一系列的函数,这些函数做了哪些事情呢?在之前提到SurfaceFlinger.cpp中:void SurfaceFlinger::onMessageReceived(int32_t what) { case MessageQueue::INVALIDATE: { /*处理事务,实际大部分做了一些标志位......

2019-04-08 15:56:03 603

原创 05.Binder系统:第7课第5节_Binder系统_c++实现_内部机制_数据传输

binder系统进程间的通信,其都是在驱动binder中实现的,也就是说,无论你的应用程序多么的复杂,最终还是通过ioctl这些标准的接口使用驱动程序,我们可以根据open,ioctl等等的调用过程分析C++程序的内部机制,和他的传输过程。现在我们回顾一下应用程序是怎么和binder驱动打交道了,以test_server为例,他使用驱动程序的过程:1.open:mmp2.addservice......

2019-04-08 12:01:15 467

原创 07.显示系统:第006节_基础知识_Region定义及操作

上小节我们讲解了surfaceflinger对Vsync信号的处理,现在我们来回顾一下,在android系统中存在一个或者多个应用程序,每个程序有一个或者多个Layer。surfaceflinger在对Vsync信号进行处理的时候,会对每一个Layer更新他的数据,接下来他就把这些更新了数据的个个层与Layer合并起来,在显示设备上显示出来。在讲解界面显示之前,我们先来补充一些基础知识,Regi......

2019-04-07 21:25:50 535

原创 05.Binder系统:第7课第4节_Binder系统_c++实现_内部机制_代理类BpXXX分析

在binder系统中,其主要涉及三个应用程序,以我们之前编写的C++程序为例,分别为test_server,test_client,ServiceManageer。其中test_client通过代理类BpHelloService与test_server进行通信,在最初阶段,test_server会通过addservice向ServiceManageer添加服务,test_server与Servi......

2019-04-07 16:33:19 455

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除