- 博客(3208)
- 资源 (98)
- 收藏
- 关注
原创 Android9.0 setStereoVolume左右声道流程(二十四)
注意:这条路其实没有走,过后会写第二篇分析到底是怎么控制AudioTrack的左右声道的。栗子:setStereoVolume()控制左右声道流程.private AudioTrack mAudioTrack;int bufferSize = AudioTrack.getMinBufferSize(mSampleRateInHz, mChannelConfig, AudioFormat....
2019-03-06 18:30:21 3690 1
原创 通过AMS分析Binder流程(Java到Kernel)
栗子:public class MainActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = new Intent(this, D...
2019-01-08 13:00:08 1203
原创 MediaPlayer到ACodec到OMX流程(十九)
********************************************************************************OpenMax(OMX)框架位置及作用1.android系统中只用openmax来做code,所以android向上抽象了一层OMXCodec,提供给上层播放器用。 播放器中音视频解码器mVideosource、mAudiosou...
2018-09-01 18:12:36 3873
原创 Android7.1 audio 播放流程(三十五)
MediaPlayer基本使用方式:播放一首MP3歌曲MediaPlayer mp = new MediaPlayer();mp.setDataSource("/sdcard/test.mp3");mp.prepare();mp.start();//这里初始化CCDeCoder解码器1. IMediaPlayer.cpp/h<1>.头文件frameworks/av/i...
2018-08-03 17:26:31 2343
原创 tshark/wireshark/tcpdump实战笔记(更新中...)
注意Wireshark表示意义:Source: 发送方IP Destination: 接收方IPProtoco: 协议Length: 这里显示的物理层(Frame)数据长度,Frame层长度最长,因为每层都要加上包头。info: 显示发送和接收数据的状态//安装tshark和wireshark# sudo apt-get install tshark# sudo apt-g...
2018-05-18 17:51:19 1830
原创 Android输入事件InputReader和InputDispatcher分析
.C++frameworks/native/services/inputflinger/InputDispatcher.cppvoid InputDispatcher::notifyKey(const NotifyKeyArgs* args) { mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);}.J
2017-08-10 17:07:25 1819 2
原创 Linux之常用命令备忘<不断更新中...>(十七)
1、模糊查找字符串# find . "*" | xargs grep "ro.hardware" -rn --color# find -name "*.rc" | xargs grep "ro.hardware" -rn --color# find -name "*.rc" | xargs grep -rn --color "ro.hardware"//过滤不想看到的字符...
2016-11-09 15:20:23 1671
原创 Android4.4之Camera2预览流程APP到Driver(十四)
1.APP调用 packages/apps/Camera2/src/com/android/camera/PhotoModule.java private void startPreview() { Log.v(TAG, "startPreview"); mCameraDevice.startPreviewAsync(); mFocu...
2016-11-03 18:59:46 3610
原创 Linux内核之查找文件系统中文件或目录:lookup_one_len用法实例(五十二)
本篇目的:Linux内核之查找文件系统中路径:lookup_one_len用法实例Linux内核中的函数是文件系统路径查找中的一个关键函数,它用于在VFS(Virtual File System)层中根据给定的路径名查找目录项(dentry)。这个函数的主要作用是在文件系统中寻找与路径名匹配的目录项,它是文件系统交互的基础之一,对于文件系统的性能和稳定性有着重要影响。在Linux系统中,每个文件或目录都有一个与之对应的目录项对象,即dentry。
2024-04-19 09:09:27 338
原创 Linux内核之引用计数器:refcount_set代码实例(五十一)
本篇目的:Linux内核之引用计数器:refcount_set代码实例是 Linux 内核中用于设置引用计数值的函数之一。引用计数是一种常见的内核机制,用于跟踪内核对象的引用次数,以确保在没有任何引用时可以安全地释放对象。其中,r是一个refcount_t类型的指针,表示要设置的引用计数器,而n是要设置的值。通常,函数在初始化内核对象的引用计数时使用,或者在需要重置引用计数器值时使用。在初始化时,它可以将引用计数设置为初始值,通常为 1,表示对象的第一个引用。
2024-04-19 07:42:28 267
原创 Linux内核之虚拟地址转物理页:virt_to_page实现代码实例(五十)
本篇目的:Linux内核之virt_to_page实现与用法实例是Linux内核中用于将虚拟地址转换为对应的页描述符(page descriptor)的函数。在Linux内核中,每个物理内存页都有一个对应的结构,该结构包含了页的详细信息,如页的状态、引用计数、映射信息等。当内核需要操作一个特定的虚拟地址时,它通常会使用来获取该虚拟地址对应的page结构。在Linux内核中,虚拟地址空间被划分为多个区域,如内核空间、用户空间等。每个区域内部又被划分为多个页,每页大小通常为4KB。
2024-04-18 10:03:20 595
原创 Linux内核之kfree如何释放内存(四十九)
本篇目的:Linux内核之kfree实现及用法实例在Linux内核中,kfree是一个用于释放内存的函数,它用于释放通过kmallockzallocvmalloc等函数分配的内存。这些分配函数在内核空间中动态地分配内存,而kfree则用于在不再需要这些内存时将其释放回系统。当一个内核函数需要一些临时内存来存储数据时,它会调用kmalloc或kzallockzalloc是kmalloc的一个变体,它会在分配内存后将其清零)。这些函数返回一个指向分配的内存的指针。
2024-04-18 07:43:54 535
原创 Linux内核之WRITE_ONCE用法实例(四十八)
本篇目的:Linux内核之WRITE_ONCE用法实例WRITE_ONCE是一个宏,它在Linux内核中用于确保对变量的写操作是原子性的,并且不会被编译器的优化重排。这个宏的主要目的是在多线程环境中提供一种安全的方式来写入共享变量,确保其他线程能够看到正确的值。WRITE_ONCE宏的实现利用了C语言的结构体和联合体的特性。首先,它定义了一个匿名联合体,其中包含一个与目标变量x类型相同的成员__val,以及一个字符数组__c。这个字符数组的大小设置为1,是为了确保联合体的大小与x的大小相同。
2024-04-17 06:00:00 565
原创 Linux内核之aligned用法实例(四十七)
本篇目的:Linux内核之aligned用法实例在Linux内核中,aligned关键字是一个编译器指令,它用于指定变量或结构体的对齐方式。对齐是指变量或结构体在内存中的起始地址与某个数的倍数对齐。对齐对于性能至关重要,特别是在处理对齐敏感的数据类型(如浮点数)或使用SIMD指令时。正确的对齐可以减少内存访问时间,提高程序的性能。在Linux内核中,aligned关键字通常与一起使用,其中n是一个整数,指定了对齐边界。n必须是2的幂,因为大多数处理器和内存系统都对齐到2的幂边界上的地址。
2024-04-17 05:00:00 802
原创 Emacs之增加/取消输入括号自动匹配(一百三十六)
本篇目的:Emacs之取消输入括号自动匹配Emacs 是一个功能强大的文本编辑器,它拥有丰富的扩展和自定义选项,能够满足各种编程和文本编辑需求。其中一个非常实用的功能就是输入括号自动匹配,也就是。是 Emacs 中的一个模式,当你在编辑器中输入一个开放括号(如等)时,Emacs 会自动为你插入一个对应的闭合括号,并将光标放在这两个括号之间。这不仅使代码看起来更加整洁,还有助于减少因遗漏或错位括号而导致的语法错误。要启用,你可以在 Emacs 的配置文件(通常是.emacs或init.el。
2024-04-16 06:15:00 1360
原创 C语言之探秘:访问结构体空指针与结构体空指针的地址的区别(九十三)
本篇目的:C语言之探秘:访问结构体空指针与结构体空指针的地址的区别在C语言中,结构体(Struct)是一种复合数据类型,它可以包含多个不同类型的数据项。指针(Pointer)是一种特殊的数据类型,用于存储变量地址。空指针(Null Pointer)是一个不指向任何有效内存地址的特殊指针。当我们谈论结构体空指针与结构体空指针的地址时,我们需要明确两个概念:结构体变量的地址和结构体指针的地址。结构体空指针:结构体空指针是指未经初始化的结构体指针,它不指向任何有效的内存地址。在C语言中,我们可以使用。
2024-04-16 04:30:00 879
原创 Android14音频进阶之Perfetto高级调试技巧(六十七)
本篇目的:Android14音频进阶之Perfetto高级调试技巧接第六十六篇:Android14音频进阶之<进阶调试>:Perfetto定位系统音频问题上一篇与读者分享如何使用谷歌新一代的性能分析工具Perfetto,可能还有些读者还是云里雾里,本文来一个dump Android各个层级trace的实战篇。Perfetto是一个很强大的性能优化和debug系统疑难杂症的工具,有了它图形化的功能,可以帮我们达到事半功倍的效果,学习它,是为了让它的能力能够释放出来,帮我们从繁杂的debug中解脱出来。
2024-04-15 07:00:00 1285
原创 C语言之哈希表节点插入与遍历学习(九十二)
本篇目的:C语言之哈希表节点插入与遍历学习哈希表(Hash Table)是一种数据结构,用于存储键值对(Key-Value Pair)的集合。它通过哈希函数将键映射到表中的一个位置,以加快查找速度。在哈希表中,数据是以数组的形式存储的,数组的索引是通过哈希函数计算得出的。哈希表的核心思想是将键通过哈希函数转换为一个整数值,然后将这个整数值作为数组索引,将对应的值存储在数组中。当我们想要查找一个键对应的值时,只需要再次使用哈希函数计算数组索引,然后直接访问数组中的对应位置即可。
2024-04-15 06:00:00 717
原创 C语言之offsetof实现分析(九十一)
本篇目的:C语言之offsetof实现分析C语言中的offsetof宏是一个非常有用的工具,它用于计算结构体中某个成员相对于结构体开头的偏移量。这个宏定义在头文件中,它是C标准库的一部分。offsetof宏的使用方法非常简单,它的原型如下:其中,type是一个结构体类型,member是type结构体中的一个成员。offsetof宏的返回值是member成员相对于type结构体开头的字节偏移量。
2024-04-15 04:45:00 700
原创 C语言之typeof用法实例(九十二)
本篇目的:C语言之typeof用法实例C语言的typeof运算符是一个编译时运算符,它用于获取表达式的类型。这个运算符是由GCC扩展引入的,不是标准C语言的一部分。typeof运算符允许我们在编写泛型代码时避免硬编码特定的数据类型,从而提高代码的灵活性和可重用性。typeof运算符的基本形式如下:其中expr是任何有效的C语言表达式。typeof运算符将返回expr的类型,这个类型可以用于定义新的变量、函数参数或者作为类型转换的目标类型。typeof运算符的一个主要优点是它提供了类型推断的能力。
2024-04-14 06:15:00 725
原创 C语言之_Generic用法实例(九十一)
本篇目的:C语言之_Generic用法实例C语言的_Generic表达式是C11标准引入的一个特性,它提供了一种在编译时基于表达式类型选择函数或值的方法。这种机制与C++中的模板元编程相似,但更为简单和受限。_Generic表达式的基本形式如下:其中expr是我们要判断的表达式,是可能的类型,是对应的类型为真时返回的值,是默认返回的值(当没有任何类型匹配时)。_Generic表达式的基本思想是,根据expr的类型,从多个候选值中选择一个。这种选择是在编译时进行的,因此_Generic。
2024-04-14 05:15:00 660
原创 Linux内核之互斥锁mutex_init和自旋锁spin_lock区别及用法实例(四十六)
本篇目的:Linux内核之互斥锁mutex_init和自旋锁spin_lock区别及用法实例在Linux内核中,mutex_init和spin_lock是两种常用的同步机制,用于在多线程或多处理器环境中保护共享资源,防止并发访问造成的数据不一致问题。mutex_init用于初始化一个互斥锁(mutex),它是一种睡眠锁。当一个线程尝试获取一个已经被其他线程持有的互斥锁时,该线程会被阻塞,进入睡眠状态,直到互斥锁被释放。互斥锁适用于那些可能造成较长时间阻塞的场景,因为线程睡眠状态不会消耗CPU资源。
2024-04-13 06:45:00 1358
原创 Linux内核之自旋锁:自旋锁初始化之spin_lock_init用法实例(四十五)
本篇目的:Linux内核之自旋锁:spin_lock_init用法实例Linux内核是一个开源的类UNIX操作系统内核,被广泛用于各种计算机系统。在Linux内核中,同步机制是确保多线程程序正确性的关键部分。是Linux内核中用于初始化自旋锁的一个函数,它用于保护内核中的临界区,防止多个线程同时访问共享资源。自旋锁(spinlock)是一种锁,当一个线程尝试获取一个已被其他线程获取的锁时,该线程将在一个循环中不断地检查锁是否已经可用。这个过程被称为“自旋”。
2024-04-13 05:15:00 826
原创 Linux内核之Binder驱动红黑树:rb_root用法实例(四十四)
本篇目的:Linux内核之Binder驱动关键结构体rb_root用法实例Binder是Android系统中实现跨进程通信(IPC)的机制,它由内核空间的Binder驱动和用户空间的Binder库组成。Binder驱动中的关键数据结构之一是rb_root,它用于管理Binder实体的高速缓存。在Binder驱动中,每个进程都有一个binder_proc结构体,用于管理该进程中的Binder实体和引用。
2024-04-12 06:30:00 823
原创 Linux内核之Binder驱动关键结构体binder_ref用法实例(四十三)
本篇目的:Linux内核之Binder驱动关键结构体binder_ref用法实例Binder是Android系统中一个非常重要的组件,它负责在进程间进行通信(IPC)。Binder驱动是Binder机制的核心部分,它工作在内核空间,负责处理跨进程的通信细节。Binder驱动通过一个名为binder_ref的数据结构来管理进程间的引用关系。在Binder驱动中,每个进程都有一个对应的binder_proc结构体,该结构体包含了进程的所有Binder相关的信息。
2024-04-12 05:45:00 1405
原创 Linux内核之Binder驱动关键结构体binder_node用法实例(四十二)
本篇目的:Linux内核之Binder驱动关键结构体binder_node用法实例是 Android Binder 驱动中用于表示 Binder 实体的核心数据结构。Binder 实体是 Binder 通信机制中的基本单元,它可以是一个服务,也可以是一个客户端句柄。每个 Binder 实体都对应一个结构,该结构包含了实体的各种信息,如引用计数、节点 ID、用户数据等。Binder 实体在 Binder 驱动中通过来管理,它是实现进程间通信(IPC)和服务管理的基础。
2024-04-11 07:45:00 698
原创 Linux内核之Binder驱动关键结构体binder_proc用法实例(四十一)
在 Android 系统中,Binder 是一个提供进程间通信(IPC)的驱动程序。它允许一个进程(称为服务器)提供服务给其他进程(称为客户端)。struct binder_proc 是 Binder 驱动中的一个关键结构体,它代表了一个使用 Binder 机制的进程。这个结构体包含了进程的 Binder 相关的所有信息,如线程池、内存分配情况、已打开的 Binder 实体等。
2024-04-11 05:45:00 1266
原创 Linux内核之等待队列wait_queue_head_t数据结构用法实例(四十)
本篇目的:Linux内核之等待队列wait_queue_head_t用法实例是 Linux 内核中用于实现等待队列的基本数据结构。在 Linux 内核中,等待队列是一种常见的机制,用于让进程在某个条件不满足时进入睡眠状态,当条件满足时被唤醒继续执行。这种机制在很多内核子系统中都有应用,如进程调度、设备驱动、同步等。结构体定义了一个等待队列的头部,它包含了等待队列的基本信息和一个用于同步的锁。等待队列实际上是一个进程列表,这些进程都在等待某个条件变为真。每个等待队列都有一个对应的结构体,用于管理这个队列。
2024-04-10 07:15:00 1371
原创 Linux内核之原子操作atomic_t用法实例(三十九)
本篇目的:Linux内核之atomic_t用法实例Linux内核中的atomic_t是一个原子操作的计数器类型,它被广泛用于多线程环境中,确保对计数器的操作是线程安全的。在Linux内核中,许多场合需要对某些值进行原子操作,例如,进程计数、互斥锁的计数器等。atomic_t提供了对这些值进行增加、减少和获取当前值的原子操作,避免了在多线程环境中由于竞态条件引起的并发问题。atomic_t的定义在头文件中,它是一个简单的整数类型(通常是32位),并提供了以下几个主要的操作函数::初始化一个。
2024-04-10 05:45:00 827
原创 Linux内核之Binder驱动内存映射实现:binder_update_page_range实例用法(三十八)
本篇目的:Linux内核之binder_update_page_range实例用法Android Binder是Android系统中用于进程间通信(IPC)的一种机制。Binder驱动程序负责实现Binder机制的核心功能,包括数据的传递、线程的管理等。在Binder驱动程序中,函数是一个重要的函数,用于处理内存映射的相关操作。函数主要处理Binder内存映射的更新。在Binder通信中,客户端与服务端通过Binder机制进行数据交换,这些数据通常存储在内核空间的内存中。
2024-04-09 10:27:29 1063
原创 Linux内核之get_vm_area分配虚拟内存地址,并映射到物理内存(三十七)
本篇目的:Linux内核之get_vm_area用法实例函数是 Linux 内核中用于申请内存区域的一个核心函数,它在内核内存管理子系统中发挥着重要作用。这个函数的主要职责是在内核地址空间中寻找一块足够大的连续虚拟内存区域,以满足内核或内核模块动态申请内存的需要。在详细介绍函数之前,有必要了解一些基本概念。在 Linux 操作系统中,每个进程都有其独立的虚拟地址空间,这个地址空间被分为用户空间和内核空间。
2024-04-09 10:09:40 879
原创 C++之realloc用法及代码实例(二百七十)
本篇目的:C++中,一个内存管理的重要函数,可以重新分配内存大小,随分享之。C++ 中的realloc函数是一个重要的内存管理函数,用于动态分配和释放内存。它可以改变已分配的内存块的大小,如果需要增加内存空间,则分配一个新的更大的内存块,然后将原内存块的内容复制到新块中,并释放原内存块。如果需要减少内存空间,则尝试将内存块的大小减少到新的大小,并返回调整后的内存块地址。realloc函数的原型为:其中,ptr是指向之前分配的内存块的指针,size是要分配的新内存块的大小(以字节为单位)。如果ptr为。
2024-04-08 17:02:00 791
原创 Android14音频进阶之<进阶调试>:Perfetto定位系统音频问题(六十六)
本篇目的:Android14音频进阶之Perfetto如何定位系统音频问题接第六十五篇:混音线程MixerThread、FastMixer、FastThread、AudioMixer到底什么关系本篇来学习如何分析音频性能?以及如何在函数级别定位问题?其实本篇不只是用于音频,也可以延伸到其他模块。我们来借助一款系统和应用的分析工具:Perfetto!在Android9.0以前,其实用的是systrace工具分析。
2024-04-08 16:48:18 1858
原创 Android14之智能指针的弱引用、强引用、弱指针、强指针用法区别及代码实例(二百零五)
本篇目的:Android源码中,理解智能指针的弱引用、强引用、弱指针、强指针的用法与区别。在 Android 的 C++ 开发中,弱引用、强引用、弱指针和强指针都是用于管理对象生命周期的工具。它们是在 Android Framework 中实现的智能指针,用于避免内存泄漏和悬空指针问题。强指针是指向对象的指针,它会增加对象的引用计数,从而延长对象的生命周期。当有一个或多个强指针指向某个对象时,该对象的引用计数会增加。只有当所有指向该对象的强指针都释放时,对象的引用计数才会减少,从而触发对象的销毁。
2024-04-07 04:30:00 925
原创 C++之链表与哈希表的作用及代码实例(二百六十九)
本篇目的:了解链表和哈希表的作用,再用C++实例说明。存储有序数据集合:链表是一种数据结构,用于存储有序的元素集合。每个元素(节点)都包含了指向下一个元素的指针,从而形成了一个有序的序列。动态内存分配:链表的节点通常可以动态分配内存,这使得链表能够在运行时动态增长和收缩,不需要预先指定存储空间的大小。插入和删除操作:链表的插入和删除操作非常高效,时间复杂度为 O(1),因为只需要修改相邻节点的指针,而不需要移动整个数据集合。实现其他数据结构:链表可以用于实现其他数据结构,如队列、栈、图的邻接表等。
2024-04-06 06:15:00 655
原创 C++之双向链表与哈希链表用法区别实例(二百六十八)
本篇目的:在阅读Linux内核代码时,发现Binder驱动中的双向链表和哈希链表的挺有意思,分享给大家。在Android的Binder区域中,双向链表(struct list_head)和哈希链表(struct hlist_node)是两种不同的数据结构,它们在实现中有一些区别和各自的作用。首先,让我们了解这两种数据结构的基本概念:双向链表(struct list_head)双向链表是一种数据结构,其中每个节点都包含指向前一个节点和后一个节点的指针。这使得在双向链表中,节点可以双向遍历。
2024-04-06 05:00:00 778
原创 XUbuntu22.04之Typora添加水印并输出pdf文件(二百二十七)
本篇目的:在XUbuntu22.04下,Typora在内容中添加水印,并输出出到pdf文件中。Typora 是一款轻量级、跨平台的Markdown编辑器,它将写作和预览融为一体,为用户提供了一种全新的文档编辑体验。自从推出以来,Typora凭借其简洁的界面、强大的功能和便捷的操作受到了广大用户的喜爱。Typora 的界面设计非常简洁,没有复杂的菜单和工具栏,让用户可以将全部注意力集中在写作上。它采用了实时预览的技术,让用户在编辑Markdown文档时能够立即看到最终的排版效果,极大地提高了写作效率。
2024-04-05 07:00:00 689
原创 Emacs之实现复制当前已打开文件buffer(一百三十五)
本篇目的:为了方便复制已打开文件的全部内容,写了两个实现,提高开发效率。是 Emacs Lisp(elisp)中的一个内置函数,用于获取缓冲区(buffer)中的文本内容,并将其作为字符串返回。在 Emacs 中,每个文件、目录或区域都有一个与之对应的缓冲区,缓冲区内部维护着这些内容的状态,包括文本内容、光标位置等。函数- 提供了一种方便的方式来访问缓冲区中的文本内容。函数的基本语法如下:其中,start和end参数分别指定了一个范围,用来截取缓冲区中的一部分文本。如果不指定这些参数,
2024-04-05 05:30:00 1610
原创 C++之std::variant关键字代码实例(二百六十七)
本篇目的:C++之std::variant关键字代码实例std::variant 是 C++17 标准库中的一个模板类,它用于表示一个可以容纳多种不同类型值的类型安全的联合(union)。std::variant 提供了一种方便的方式来处理多种可能类型的值,而无需使用复杂的继承结构或联合,同时保持了类型的安全性。
2024-04-04 07:30:00 504
H.264标准协议(官方中文版)
2020-10-28
HxD_Hex编辑器中文版.zip
2020-09-12
MultimediaFrameworkOverview.zip
2020-09-01
Gstreamer-Openmax-gst-openmax.zip
2020-08-17
GStreamer中文开发手册.zip
2020-07-22
win10removeAll.zip
2020-06-25
vcxsrv-64.1.20.8.1.zip
2020-06-20
debug_hybris_demo.zip
2020-06-03
手写Fuchsia第一个app
2020-03-16
第五代加固技术ARM VMP原理实现与应用.zip
2020-03-01
AUDIO CODEC DAPM详解.zip
2019-12-30
蓝牙Audio调试.zip
2019-12-27
Universal Serial Bus Device Class Definition for Audio Devices.zip
2019-11-16
802.11 Reason Code中文说明(全)
2019-05-21
彻底禁掉Win10 Defender自启动
2022-12-24
Elecard HEVC Analyzer_For_Windows.zip
2021-01-06
JM-H264参考手册
2020-10-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人