源码位置
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)音频缓冲拷贝的更多相关文章

  1. WebRTC 源码分析(三):安卓视频硬编码

    数据怎么送进编码器? 怎么从编码器取数据? 如何做流控? 在开始之前,我们先了解一下 MediaCodec 的基本知识. MediaCodec 基础 Developer 官网 上的描述已经很清楚了,下 ...

  2. WebRTC源码分析四:视频模块结构

    转自:http://blog.csdn.net/neustar1/article/details/19492113 本文在上篇的基础上介绍WebRTC视频部分的模块结构,以进一步了解其实现框架,只有了 ...

  3. 1.4、WebRTC源码

    文章导读:本篇文章给读者展示WebRTC的源码目录结构,为读者构建全方位的知识体系,如果你有兴趣下载webrtc的源码来编译运行,本节内容可以作为你了解源码的简要说明书,webrtc源码非常庞大的,讲 ...

  4. Spring Ioc源码分析系列--Ioc源码入口分析

    Spring Ioc源码分析系列--Ioc源码入口分析 本系列文章代码基于Spring Framework 5.2.x 前言 上一篇文章Spring Ioc源码分析系列--Ioc的基础知识准备介绍了I ...

  5. 【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 本地链路地址 ...

  6. MapReduce的ReduceTask任务的运行源码级分析

    MapReduce的MapTask任务的运行源码级分析 这篇文章好不容易恢复了...谢天谢地...这篇文章讲了MapTask的执行流程.咱们这一节讲解ReduceTask的执行流程.ReduceTas ...

  7. Activity源码简要分析总结

    Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...

  8. MapReduce的MapTask任务的运行源码级分析

    TaskTracker任务初始化及启动task源码级分析 这篇文章中分析了任务的启动,每个task都会使用一个进程占用一个JVM来执行,org.apache.hadoop.mapred.Child方法 ...

  9. TaskTracker任务初始化及启动task源码级分析

    在监听器初始化Job.JobTracker相应TaskTracker心跳.调度器分配task源码级分析中我们分析的Tasktracker发送心跳的机制,这一节我们分析TaskTracker接受JobT ...

随机推荐

  1. win7 64位安装mongodb及管理工具mongoVUE1.6.9.0

    下载mongodb安装程序,官网地址:http://www.mongodb.org/downloads 我的是64位win7,选择: 然后双击下载的文件安装,我安装到本地的D盘里面 然后配置系统环境变 ...

  2. placeholder在IE8中兼容性问题解决

    placeholder是HTML5中的一个属性,可以在文本框中设置placeholder属性来显示一些提示性的文字,但对IE10以下的浏览器不支持,下面方法可以让placeholder能够使用在IE1 ...

  3. tabbarcontroller 内嵌导航 控制器,2层push hide tabbar 后 ,第二层直接返回根视图控制器选择tabbarcontroller的其它vc 无法显示 tabbar的 问题解决方案

    场景如标题 这样不行: [self.navigationController popToRootViewControllerAnimated:YES]; MainViewController *mai ...

  4. 租房时代,K2 BPM软件带你拥抱更好生活

    提到租房子,你的第一反应肯定就是心酸的找房路,奇葩的极品房东……但租房对于年轻人来说又是生存路上必须面对的挑战.现在有一家公司想给你一段租房时代的美好回忆,它就是优客逸家. 优客逸家,隶属于四川优客投 ...

  5. 第二周 PSP项目计划

    项目计划总结: 日期|任务 听课 编写程序 阅读相关书籍 网上查找资料   日总计 周一 2 1 2   5 周二     1    1 周三     2     2 周四 2 2     4 周五 ...

  6. php的查询数据

    php中 连接数据库,通过表格形式输出,查询数据.全选时,下面的分选项都选中;子选项取消一个时,全选按钮也取消选中. <!DOCTYPE html PUBLIC "-//W3C//DT ...

  7. BroadcastReceiver的最简单用法

    android系统下的广播: 电池电量低.电池充电完成.短信到来了.程序安装卸载.sd卡卸载安装 等 BrocastReceiverDemo.java public class BrocastRece ...

  8. App右上角数字

    IOS7: UIApplication *app = [UIApplication sharedApplication]; // 应用程序右上角数字 app.applicationIconBadgeN ...

  9. MVP架构。。。。

    Model-View-Presenter(MVP)概述    MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一度成 ...

  10. Android 对 properties文件的读写操作

    -. 放在res中的properties文件的读取,例如对放在assets目录中的setting.properties的读取:PS:之所以这里只是有读取操作,而没有写的操作,是因为我发现不能对res下 ...