- 博客(519)
- 资源 (2)
- 收藏
- 关注
原创 Android 之 AudioEffect
Java框架层:提供基础的AudioEffect控制类,不应该直接使用AudioEffect父类,而是使用具体音效实现的子类。C/C++ Native层:主要实现层,包含关键组件:• EffectModule:封装第三方音效引擎实现,控制process()/command()调用,管理音效状态机• EffectHandle:IEffect接口的具体实现,提供参数更新和状态跟踪• EffectChain:管理音效与audio session之间的关系。
2025-12-12 08:09:26
104
原创 android 之Handler消息处理
职责: 是消息循环的核心,扮演着“泵”的角色。Handler(发送者/处理者) 将 Message(消息) 投递到 MessageQueue(消息队列) 中,Looper(循环器) 不断从队列中取出消息,并回调给 Handler(处理者) 进行处理。关键点: 内部维护了一个消息池,使用 obtain() 方法可以复用消息对象,避免频繁创建对象引发GC,优化性能。2.它是一个阻塞队列:当队列为空时,调用 next() 方法取消息的线程会进入休眠状态,直到有新消息到来。一个线程有且仅有一个 Looper。
2025-12-06 13:06:30
390
原创 audioflinger 之 PatchPanel
createAudioPatch_l是 PatchPanel 的核心函数,负责创建音频链路(audio patch),支持设备到设备、设备到混音、混音到设备等多种连接方式。函数根据不同的连接场景选择硬件直连或软件桥接方案。软件桥接路径:当需要跨硬件模块或硬件不支持patch时,创建虚拟的播放和录制线程硬件直连路径:同一硬件模块内的设备间直接连接混音器到设备:播放线程输出到物理设备设备到混音器:物理设备输入到录制线程。
2025-11-19 07:50:38
335
原创 Android 之 systrace
• 作用:检查指定的 trace tag 是否启用• 用途:在需要复杂计算的 trace 前先检查,避免不必要的性能开销。
2025-11-14 07:11:10
351
原创 audiopolicymanager 之 音量调整以及设备切换
• 当音频设备(如耳机、蓝牙设备)连接或断开时,setDeviceConnectionState 函数会更新设备状态,并调用 updateCallAndOutputRouting,后者可能触发 applyStreamVolumes,从而调用 checkAndSetVolume 来重新应用音量到新设备。• 当音频策略的强制使用设置改变时(如切换到扬声器模式),setForceUse 函数会调用 updateCallAndOutputRouting,进而可能调用 checkAndSetVolume。
2025-11-12 08:09:36
505
原创 C++ SLT之 set
class set;其中:• 第一个参数 Key:元素的类型(这里是 int)• 第二个参数 Compare:比较函数的类型(这里是 DescendingCompare)// 自定义降序比较器// 降序:a > b 时 a 排在前面// 输出:9 8 5 2 1return 0;
2025-11-09 20:16:49
302
原创 安卓之 MediaSessionService
媒体控制的“管理员”和“快递员”MediaSessionService 是一个运行在 系统进程 中的核心服务,它的角色可以概括为:• MediaSessionStack:服务内部维护了一个优先级栈 来管理所有会话,而不是简单的队列。• 优先级决定因素:• 价值:这种机制确保了当用户按下媒体键时,系统总能准确地控制当前最前台、最相关的媒体应用,避免了多个应用(如音乐和播客App同时运行)之间的控制冲突。
2025-11-03 21:33:59
309
原创 audioflinger 的创建的track buffer
FrameCount(音频缓冲区中的帧数)的计算主要取决于上下文(如播放或录制)、缓冲区类型(共享缓冲区或流式缓冲区)、硬件限制以及延迟要求。在PlaybackThread::createTrack_l()函数中,根据轨道的类型(共享缓冲区或流式轨道)计算实际的frameCount。如果没有共享缓冲区,frameCount需要根据延迟要求计算最小帧数(minFrameCount),以确保足够的缓冲区深度来避免欠载(underrun)。• 缓冲区类型:共享缓冲区直接决定frameCount;
2025-10-25 20:17:25
479
原创 有序容器 vs 无序容器
有序容器要求int x, y;// 必须定义比较运算符无序容器要求int x, y;// 必须定义相等运算符// 自定义哈希函数虽然有序容器和无序容器在基本接口上有很多相似之处(如insert(), find(), erase()等),但它们的关键区别在于:元素顺序:有序容器按键排序,无序容器无序特有方法:• 有序容器支持lower_bound(), upper_bound()• 无序容器支持桶管理方法(bucket_count(), rehash()等)
2025-10-23 07:34:48
404
原创 Android Audio Patch
Audio Patch 是 Android 音频系统中用于表示音频源(source)与目标(sink)之间连接关系的机制。它允许在音频系统中创建灵活的连接路径,支持:• 将音频流从一个或多个源路由到一个或多个目标• 实现设备间的音频桥接• 支持复杂的音频路由场景。
2025-09-06 14:33:33
1173
原创 NuPlayer 之 Renderer
触发postDrainAudioQueue_l()或postDrainVideoQueue()开始渲染。解码器输出数据 → NuPlayer::Decoder::onMessageReceived。音频数据存入mAudioQueue,视频数据存入mVideoQueue。• 每次写入后通过mNotifyConsumed通知解码器。• 通过AudioSink::write()写入音频设备。• 根据VSync信号和音频时钟调整渲染时机。• 通过Surface直接提交给显示系统。
2025-09-05 07:40:35
208
原创 nuplayer 之 GenericSource
负责从媒体源(MediaSource)读取数据(视频、音频、字幕等),并将其封装成 ABuffer 存入对应的 PacketSource 队列中,供播放器后续使用。• 检查 doSeek 中 readBuffer 的 mode 参数是否为 SEEK_PREVIOUS_SYNC(优先关键帧)。• 处理格式变化(INFO_FORMAT_CHANGED)或错误(如 ERROR_END_OF_STREAM)。当某个轨道(如音频或视频)的数据队列不足时,通过 ALooper 异步请求填充数据。
2025-09-04 08:27:03
898
原创 异常频谱分析
失真类型 频谱表现 产生新频率?主要听觉感受线性失真 整体频谱形状改变(高低频衰减、频段凸起/凹陷) 否 闷、薄、不平衡、不真实非线性失真 出现新的、规则的频率峰(谐波、和频/差频) 是 破、刺耳、粗糙、有杂音。
2025-09-01 08:23:04
491
原创 Android audio之 AudioDeviceInventory
是 Android 音频系统中的一个核心类,位于。→ 用户从 A2DP 切换到 LE Audio →。,包括设备的添加、移除、状态更新以及策略应用。添加设备 → 触发 HDMI 音频输出。→ 底层音频策略生效,触发路由切换。更新设备优先级 → 音频路由切换。→ 发送广播通知应用焦点变化。检测到断开 → 发送。→ 音乐播放器暂停。
2025-08-05 23:52:59
577
原创 android audiopolicy 之 Engine
1.STRATEGY_后缀(音频策略类型)作用定义音频流的逻辑分组策略,用于决定不同音频场景(如音乐、通话、铃声)的默认设备路由和混音行为。(例如:音乐播放用扬声器,通话用听筒。常见策略类型策略名称用途说明媒体播放(音乐、视频、游戏)通话(语音通话、VoIP)系统提示音(铃声、通知音)避免打断媒体的提示音(如低优先级通知)无障碍功能(如屏幕朗读)拨号键盘音语音传输(如对讲机模式)代码中的使用场景通过为策略选择设备。在中映射属性()到策略。2.后缀(强制路由场景)作用。
2025-08-05 00:45:25
890
原创 安卓audio 架构解析
• 动态分配:当物理设备(如耳机、蓝牙设备)连接或虚拟设备(如远程submix)初始化时,AudioPolicyManager通过setDeviceConnectionState()动态分配唯一的audio_port_handle_t,并注册到系统可用设备列表(如mAvailableOutputDevices或mAvailableInputDevices)中。• 动态更新:设备状态变化(如拔出耳机)会触发路由更新,系统销毁原有绑定并重新分配audio_port_handle_t到新设备(如切换到扬声器)。
2025-08-03 15:32:01
558
原创 音频焦点 Android Audio Focus 进阶
focusLossForGainRequest 方法,用于根据请求的焦点增益类型和当前焦点状态,确定应该发送给当前焦点所有者的焦点丢失类型使用focusLossForGainRequest来确定丢失类型,然后调用handleFocusLoss实际处理焦点丢失,并返回丢失是否为永久性的。
2025-07-28 08:05:56
613
原创 安卓 Audio Thread 分析
作用: 用于实时跟踪待写入的剩余字节数。初始化时等于mCurrentWriteLength,表示本轮需写入的总量;直通模式:当需要立即写入时,mCurrentWriteLength设为mSinkBufferSize(硬件接收缓冲区大小)混音模式:threadLoop_mix()计算混音数据后,设置mCurrentWriteLength为需写入的字节数。作用: 记录从线程启动以来已写入音频设备的帧数(不包括挂起状态下的写入)作用: 记录线程在挂起(suspended)状态下模拟写入的帧数。
2025-07-24 08:27:55
334
原创 Android 之 audiotrack
由采样位宽和声道数决定)[citation:4][citation:6]。,在流式传输(非静态缓冲区)模式下尤为重要。的播放线程因缓冲区无数据而阻塞,写指针更新会触发其。作用较弱,因为数据一次性加载,无需流式更新。(用于处理环形缓冲区的位置回绕)。中管理共享内存缓冲区的核心方法,主要用于。中的一个关键状态变量,类型为。AudioFlinger消费数据。:在静态缓冲区模式(
2025-07-18 08:38:25
785
原创 audiorecord 之 抢占优先级
在 Android 系统中,不同音频源的抢占优先级由系统策略动态决定,主要基于(特权/普通)和(前台/后台)等因素综合判定。
2025-07-17 00:05:57
829
原创 仿Android智能指针示例
这个实现类似于 C++11 中的 std::unique_ptr,但更加简化.通过工厂方法 make() 创建对象并返回智能指针。禁用拷贝构造和赋值(避免多个智能指针管理同一对象)一个简单的测试类,包含构造/析构函数和一些成员函数。测试移动语义(将 obj2 移动给 obj3)这是一个模板类,可以管理任何类型 T 的指针。支持移动语义(通过移动构造和移动赋值)用于演示智能指针如何管理对象生命周期。提供指针操作符重载(-> 和 *)自动管理内存(析构时自动释放)创建智能指针管理的对象。
2025-07-16 07:33:35
384
原创 AudioPolicyManager
如果有待查询配置(mPendingReopenToQueryProfiles),关闭并重新打开输出。移除客户端(outputDesc->removeClient())处理LE广播路由(checkLeBroadcastRoutes)成功时,将输出添加到全局输出列表 (addOutput函数)调用outputDesc->start()增加活动计数。更新设备路由(setOutputDevices)当无客户端时:关闭输出(closeOutput)调用desc->open()打开底层HAL输出。
2025-07-14 22:27:15
549
原创 C++ SLT Vector
或自定义结构)间接实现类似功能。在 C++ 标准库中,std::vector。或自定义结构间接实现。若需高频按键操作,应优先选择。,但可以通过组合其他类型(如。
2025-07-11 08:26:17
668
原创 android studio 调试
dexdump 是用于分析和导出 Android 应用中 .dex 文件的工具,主要用于查看文件头信息和反编译代码。-t:指定临时文件名(默认 /sdcard/dex-temp-*)-l:输出布局(普通或 XML 格式)将APK后缀改为ZIP,然后解压。-c:验证校验码并退出。-m:仅导出寄存器映射。-f:显示文件头信息。-h:显示文件头详情。-d:反编译代码段。-i:忽略校验失败。
2025-07-07 00:13:00
335
原创 安卓之service
前台服务:高优先级、用户可见、适合长期任务,但需显示通知。后台服务:低优先级、用户不可见、适合短暂任务,但易被系统终止。决定因素:启动方式(startForegroundService() vs startService())及系统资源管理策略。
2025-07-06 17:26:51
586
原创 android stdio 工程问题
配置项作用是否必须用于入口标记为应用主入口是标记为可点击启动的界面(显示在桌面)是自定义类全局初始化(非界面入口)否其他 Activity无或仅含其他 Action 的 Activity 需通过代码跳转启动否。
2025-07-04 08:13:22
680
原创 安卓audio之Remote_Submix
是Android系统提供的内录(Internal Audio Capture)方案,用于捕获设备音频输出(如扬声器播放的声音)而非麦克风输入。
2025-07-04 07:22:08
681
原创 LE Audio
LE Audio是蓝牙技术联盟(SIG)于2020年推出的新一代蓝牙音频标准,基于蓝牙5.2及以上版本核心协议构建。其核心定位是LE Audio强制采用。
2025-07-03 08:12:01
941
原创 Android 之 AIDL
接口层├─ IXXX: 定义业务逻辑接口(如图中 IMediaPlayer)│├─ BpXXX: 客户端代理 (Proxy)│ ├─ 继承关系: public IXXX, public BpRefBase│ └─ 核心成员: mRemote (BpBinder*)│└─ BnXXX: 服务端实现 (Native)├─ 继承关系: public IXXX, public BBinder└─ 业务载体: MediaPlayerService::Client通信基类。
2025-07-01 08:34:29
876
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅