Audiosink的设计,需要满足下列一些需求:

  • 良好的chain_based 支持。绝大多数简单playback pipelines都是将音频数据从decoder直接push给audiosink;

  • 良好 getrange_based支持。大部分专业的应用都是audio sink从pipeline拉取数据。典型的作法是在一个回调函数中pull N Samples,回调函数一般在一个单独的线程或者是硬件设备来调度。

  • 提供准确的时钟。必须能够提供即使samples被丢弃或在流中发现不连续时也能提供采样准确的时钟。

  • 可能的话,提供DMA支持

Design

The design is based on a set of base classes and the concept of a ringbuffer of samples.

  1. +-----------+ - provide preroll, rendering, timing
  2. + basesink + - caps nego
  3. +-----+-----+
  4. |
  5. +-----V----------+    - manages ringbuffer
  6. + audiobasesink + - manages scheduling (push/pull)
  7. +-----+----------+   - manages clock/query/seek
  8. |      - manages scheduling of samples in the ringbuffer
  9. |     - manages caps parsing
  10. |
  11. +-----V------+ - default ringbuffer implementation with a GThread
  12. + audiosink + - subclasses provide open/read/close methods
  13. +------------+

The ringbuffer is a contiguous piece of memory divided into segtotal pieces of segments. Each segment has segsize bytes.

  1. play position
  2. v
  3. +---+---+---+-------------------------------------+----------+
  4. + 0 | 1 | 2 | .... | segtotal |
  5. +---+---+---+-------------------------------------+----------+
  6. <--->
  7. segsize bytes = N samples * bytes_per_sample.

  8. 如上,环形缓冲器有一个play position,以segment表示。play position是设备正在从ringbuffer读取samples的位置。
    ringbuffer可以进入PLAYINGSTOPPED状态:
    STOPPED状态下,没有samplesput到设备,play pointer不前进。
    PLAYING状态下,samples被写入设备,并且在每个seg被写入设备之后,ringbuffer应该调用可配置的回调,
    play pointer在每个段被写入之后前进。
  9. ringbuffer的写入操作将会把新的samples放入ringbuffer中。如果ringbuffer中没有足够的空间,
    写操作将被阻塞。即使buffer为空,ringbuffer的播放也不会停止。当buffer为空时,设备会播放静音。
    ringbuffer通过无锁原子操作实现,特别是在读取端,以便尽可能地降低低延迟。
    每当一个new samplesputringbuffer,先获取read pointer,请求的write positionactural position作差值,
  1. /* get the currently processed segment */
  2. segdone = g_atomic_int_get (&buf->segdone) - buf->segbase;
  3.  
  4. /* see how far away it is from the write segment */
  5. diff = writeseg - segdone;
       
    .....
  6.  
  7.       /* segment too far ahead, writer too slow, we need to drop, hopefully UNLIKELY */
          if (G_UNLIKELY (diff < 0)) {
            /* we need to drop one segment at a time, pretend we wrote a segment. */
            skip = TRUE;
            break;
          }
  8.  
  9.       /* write segment is within writable range, we can break the loop and
           * start writing the data. */
          if (diff <= segtotal) {
            skip = FALSE;
            break;
          }
  10.  
  11.       /* else we need to wait for the segment to become writable. */
          if (!wait_segment (buf))
            goto not_started;
        }
  1.  

如果差值diff<0,则samples来太慢了,丢掉来太慢的数据。如果diff > segtotal,写入部分必须等待播放指针前进。

也就是需要设备先消耗掉ringbuffer中的数据,才能继续往ringbuffer中写入新的数据。

Audiosink design的更多相关文章

  1. 带你实现开发者头条APP(四)---首页优化(加入design包)

    title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...

  2. 【知识必备】一文让你搞懂design设计的CoordinatorLayout和AppbarLayout联动,让Design设计更简单~

    一.写在前面 其实博主在之前已经对design包的各个控件都做了博文说明,无奈个人觉得理解不够深入,所以有了这篇更加深入的介绍,希望各位看官拍砖~ 二.从是什么开始 1.首先我们得知道Coordina ...

  3. Android Material Design之 NavigationView侧滑界面自定义 随笔

    一.侧滑界面Menu自定义: 在menu文件夹下新建activity_main_drawer.xml文件,自定义标题和icon: <?xml version="1.0" en ...

  4. Material Design Reveal effect(揭示效果) 你可能见过但是叫不出名字的小效果

    Material Design Reveal effect(揭示效果) 你可能见过但是叫不出名字的小效果 前言: 每次写之前都会来一段(废)话.{心塞...} Google Play首页两个tab背景 ...

  5. 使用Design包实现QQ动画侧滑效果和滑动菜单导航

    Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个supp ...

  6. 安卓Design包下的TextInputLayout和FloatingActionButton的简单使用

    终于介绍到Design包的最后的东西了. 也很简单,一个是TextInputLayout. TextInputLayout作为一个父容器,包含一个新的EditText,可以给EditText添加意想不 ...

  7. 安卓Design包之AppBar和Toolbar的联用

    前面讲了Design包的的CoordinatorLayout和SnackBar的混用,现在继续理解Design包的AppBar; AppBarLayout跟它的名字一样,把容器类的组件全部作为AppB ...

  8. 安卓Design包之超强控件CoordinatorLayout与SnackBar的简单使用

    在前面的Design中,学习使用了TabLayout,NavigationView与DrawerLayout实现的神奇效果,今天就带来本次Design包中我认为最有意义的控件CoordinatorLa ...

  9. 安卓Design之NavigationView的使用

    前面讲解了Design包下的TabLayout的使用,下面将带来NavagationView和DrawLayout以及toolbar的联动. 项目已经同步至:https://github.com/na ...

随机推荐

  1. HOW TO CHECK FOR ACTIVE TRACE FLAGS ON MICROSOFT SQL SERVER

    http://crashmag.net/how-to-check-for-active-trace-flags-on-microsoft-sql-server You check for active ...

  2. IOS开发使用委托delegate在不同窗口之间传递数据

    IOS开发使用委托delegate在不同窗口之间传递数据是本文要介绍的内容,主要是来讲解如何使用委托delegate在不同窗口之间传递数据,具体内容来看详细内容.在IOS开发里两个UIView窗口之间 ...

  3. C# 7 新特性-1

    来源https://www.kenneth-truyers.net/2016/01/20/new-features-in-c-sharp-7/ Tuples What Tuples是数据的临时分组.区 ...

  4. ylbtech-dbs-m-ele(饿了么)

    ylbtech-dbs:ylbtech-m-ele(饿了么) -- =============================================-- DatabaseName:Ele - ...

  5. 【Sofa】Sofa比赛成绩记录

    最高得到过第4名,然后后面跌倒了第7名,现在追到了第6名.虽然名次还不是最高,但是很开心,今天能在一道一直困扰的题目上有突破,就是那个自行车预测的题目,开始过拟合了.后面进行了一些处理,效果很明显.继 ...

  6. VR/AR工作原理、目前存在的技术问题

    http://blog.csdn.net/liulong1567/article/details/50686558 摘要: 这些挑战,每一个都还需要很多努力才能解决.目前它们很多都还不到量变(只是需要 ...

  7. Node.js meitulu图片批量下载爬虫 1.05版(Final最终版)

    //====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...

  8. docker入门——管理容器

    除了交互式的容器(interactive container),我们也可以创建长期运行的容器.守护式容器(daemonized container)没有交互式会话,非常适合运行应用程序和服务.大多数时 ...

  9. ajax乱码解决总结

    第一,javascript沿用java的字符处理方式,内部是使用unicode来处理所有字符的,第二,utf-8是每个汉字(unicode字符)用3个字节来存储.第三,用utf-8来send数据是不会 ...

  10. DB2日期与时间

    摘选自:http://www.cnblogs.com/wanghonghu/archive/2012/05/25/2518604.html 1.db2可以通过SYSIBM.SYSDUMMY1.SYSI ...