WEBRTC源码片段分析(1)音频缓冲拷贝
源码位置
webrtc/webrtc/modules/audio_device/ios/audio_device_ios.cc
函数
OSStatus
AudioDeviceIPhone::RecordProcessImpl(
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
uint32_t inBusNumber,
uint32_t inNumberFrames)
{
...........
while (bufPos < N_REC_BUFFERS)
{
if ((_recordingLength[bufPos] > 0) && (_recordingLength[bufPos] < noSamp10ms))
{
// Found the partially full buffer
insertPos = static_cast<int16_t>(bufPos);
// Don't need to search more, quit loop
bufPos = N_REC_BUFFERS;
}
else if ((-1 == insertPos) && (0 == _recordingLength[bufPos]))
{
// Found an empty buffer
insertPos = static_cast<int16_t>(bufPos);
}
++bufPos;
}
...............
}
一开始阅读这段函数时,简单理解就是查找未使用,或者未完全填满的槽位,理解是理解了但感觉有点效率不高,故优化了下,结果理解就出了问题.
OSStatus
AudioDeviceIPhone::RecordProcessImpl(
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
uint32_t inBusNumber,
uint32_t inNumberFrames)
{
...........
bufPos = 0;
insertPos = -1;
nCopy = 0;
//查找未使用,或者未完全填满的槽位
while (bufPos < N_REC_BUFFERS)
{
if ((_recordingLength[bufPos] > 0) && (_recordingLength[bufPos] < noSamp10ms))
{
// Found the partially full buffer
insertPos = static_cast<int16_t>(bufPos);
// Don't need to search more, quit loop
break;
}
else if ((-1 == insertPos) && (0 == _recordingLength[bufPos]))
{
insertPos = static_cast<int16_t>(bufPos);
break;
}
++bufPos;
}
...............
}
相比原版,增加了两个break,结果仔细思考发现,第二个break是不对的.找到空槽位之后,仍然要考虑遍历下有没有未填满的槽位.
OSStatus
AudioDeviceIPhone::RecordProcessImpl(
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
uint32_t inBusNumber,
uint32_t inNumberFrames)
{
...........
bufPos = 0;
insertPos = -1;
nCopy = 0;
//查找未使用,或者未完全填满的槽位
while (bufPos < N_REC_BUFFERS)
{
if ((_recordingLength[bufPos] > 0) && (_recordingLength[bufPos] < noSamp10ms))
{
// Found the partially full buffer
insertPos = static_cast<int16_t>(bufPos);
// Don't need to search more, quit loop
break;
}
else if ((-1 == insertPos) && (0 == _recordingLength[bufPos]))
{
// Found an empty buffer,找到空槽后,再继续找长度不足的槽位,优先使用
insertPos = static_cast<int16_t>(bufPos);
}
++bufPos;
}
...............
}
修正后OK了,这还是要仔细阅读,理解清楚了需求.如果使用链表,就不会有问题了.
WEBRTC源码片段分析(1)音频缓冲拷贝的更多相关文章
- WebRTC 源码分析(三):安卓视频硬编码
数据怎么送进编码器? 怎么从编码器取数据? 如何做流控? 在开始之前,我们先了解一下 MediaCodec 的基本知识. MediaCodec 基础 Developer 官网 上的描述已经很清楚了,下 ...
- WebRTC源码分析四:视频模块结构
转自:http://blog.csdn.net/neustar1/article/details/19492113 本文在上篇的基础上介绍WebRTC视频部分的模块结构,以进一步了解其实现框架,只有了 ...
- 1.4、WebRTC源码
文章导读:本篇文章给读者展示WebRTC的源码目录结构,为读者构建全方位的知识体系,如果你有兴趣下载webrtc的源码来编译运行,本节内容可以作为你了解源码的简要说明书,webrtc源码非常庞大的,讲 ...
- Spring Ioc源码分析系列--Ioc源码入口分析
Spring Ioc源码分析系列--Ioc源码入口分析 本系列文章代码基于Spring Framework 5.2.x 前言 上一篇文章Spring Ioc源码分析系列--Ioc的基础知识准备介绍了I ...
- 【lwip】09-IPv4协议&超全源码实现分析
目录 前言 9.1 IP协议简述 9.2 IP地址分类 9.2.1 私有地址 9.2.2 受限广播地址 9.2.3 直接广播地址 9.2.4 多播地址 9.2.5 环回地址 9.2.6 本地链路地址 ...
- MapReduce的ReduceTask任务的运行源码级分析
MapReduce的MapTask任务的运行源码级分析 这篇文章好不容易恢复了...谢天谢地...这篇文章讲了MapTask的执行流程.咱们这一节讲解ReduceTask的执行流程.ReduceTas ...
- Activity源码简要分析总结
Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...
- MapReduce的MapTask任务的运行源码级分析
TaskTracker任务初始化及启动task源码级分析 这篇文章中分析了任务的启动,每个task都会使用一个进程占用一个JVM来执行,org.apache.hadoop.mapred.Child方法 ...
- TaskTracker任务初始化及启动task源码级分析
在监听器初始化Job.JobTracker相应TaskTracker心跳.调度器分配task源码级分析中我们分析的Tasktracker发送心跳的机制,这一节我们分析TaskTracker接受JobT ...
随机推荐
- VS2010静态编译生成.exe可执行文件
VS2010静态编译生成的.exe可执行文件,可以在其他未安装VS2010的电脑直接运行. 静态编译:就是在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到 ...
- Jmeter简单测试elasticsearch服务器
入门知识: Jmeter是一个非常好用的压力测试工具. Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好. 顾名思义:压力测试,就是 被测试的系统,在一定 ...
- NOIP2010解题报告
今天状态不错..1个小时AC了前3题,第四题第一次也拿到了80%的分数,后来换了算法才拿到全部分数.. 第一题: 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原 ...
- wcf精通1-15
随笔- 197 文章- 0 评论- 3407 十五天精通WCF——第一天 三种Binding让你KO80%的业务 转眼wcf技术已经出现很多年了,也在.net界混的风生水起,同时.net也是 ...
- IT公司100题-5-查找最小的k个元素
问题描述: 输入n 个整数,输出其中最小的k 个. 例如输入8, 7, 6, 5, 4, 3, 2, 1这8 个数字,则最小的3 个数字为3, 2, 1. 分析: 时间复杂度O(nlogn)方法: ...
- .net异常小总
1. ExecuteReader:CommandText属性尚未初始化 即:没有对sqlCommand对象的CommandText属性赋值,即没有写sql语句. 2. 由于代码已经过优化或者本机框 ...
- Navicat提示Access violation at address 004E9844 in module ‘navicat.exe’
今天在联系MySQL 数据库表的练习时,出现了一下问题: 内存越界问题,最好重新注册下Windows的动态链接库 首先“开始”—“运行”—“cmd” 在打开的dos窗口中运行“for %1 in (% ...
- C++数据结构之Queue(队列)
Queue,队列,和我们日常生活中的队列是同样的规则,"先进先出",从尾入,从首出. Queue,主要有三种基本操作,append(添加元素至队尾):serve(队首元素出列):r ...
- 数据库添加数据II及SQL语句错误
前些时候,写的代码(数据库添加数据I),往数据库添加数据都是很基本的一条一条地添加.但是平常用于测试时,总不可能一条一条地添加测试数据吧,然后我就尝试着一次性添加几百上千条,但是再次操作的时候,就出问 ...
- Drools规则文件结构说明
一.规则文件构成 package(规则文件所在包) import(导入java包) global(规则文件中的"全局变量") function(函数) query(查找) rule ...