源码位置
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. Redis系列-存储篇hash主要操作函数小结

    阳光透过玻璃,洒在身上,一杯暖茶在手,说不尽的安逸自得,让我有种想再写篇blog的冲动.上篇主要谈了string,这里谈谈hash吧!hash是一些列key value(field value)的映射 ...

  2. iOS app调试的黑魔法--第三方库

    http://www.cocoachina.com/ios/20140928/9785.html

  3. [转载]Android View.onMeasure方法的理解

    2013-12-18 10:56:28 转载自http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html View在屏幕上显示出来要先经过measure( ...

  4. cmd的xcopy命令

    C#项目的PostEvent里经常会用到xcopy命令,复制目录时容易出错,如下: xcopy sourceDir targetDir,其中的2个目录最后不能有反斜杠"",而目录类 ...

  5. 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别

    本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...

  6. 自定义ImageView

    package com.example.myimageview; import android.content.Context;import android.graphics.Bitmap;impor ...

  7. SharePoint 2016 的新特性概览(一)(What's New for IT Professionals in SharePoint Server 2016)

    博客地址:http://blog.csdn.net/FoxDave 今天看霖雨大神的转的微软最新的关于SharePoint 2016的Update,正好看到了SP2016新发布的视频,整理一下发出 ...

  8. 命令行BASH

    shell 壳,把用户的指令翻译给内核kernel,真正工作的是内核 shell分为cli(command line interface)和gui(graphical user interface) ...

  9. 从github上面拷贝源码

    http://www.cnblogs.com/xing901022/p/4287064.html

  10. Mahout0.9的安装与测试

    最近想实协同过滤的MR算法,但是网上查了一下,发现hadoop的生态系统中的Mahout的项目已经实现了相应的算法,因此想先尝试着实时这个mahout的使用及效果.要想用mahout必须要部署到had ...