使用流式缓冲方式播放波形音频文件比较复杂,主要原因是在只有一个缓冲区提供给用户的前提下,这个缓冲区在提供给声卡播放数据的同是还需要用户不断的定时向其中写入数据。要注意从缓冲区这时是一个环形缓冲区,声音的播放和数据的写入都是从缓冲区中循环进行的。

  波形音频数据写入到从缓冲区时需要三个因素:①写入的实践,也就是什么时候开始写入;

                       ②写入位置,也就是要从从缓冲区的哪一个点开始写入;

                       ③写入数据量,也就是从缓冲区有多少缓冲数据已经播放完,可以用新数据填充。

  写入时机可以由用户自己预先在从缓冲区中固定位置定义一些通知事件触发点,当播放到这些位置时,就会触发相应的事件,这时我们就可以写入新的PCM格式的数据。写入位置和写入数据量都可以在这时调用DirectSoundApi函数获得。如果写入点在接近从缓冲区结束的位置上,而需要写入的数据量超过了剩余空间,这时,我们首先将数据填充从缓冲区的剩余部分,然后将剩下未写入的数据填充到从缓冲区的开始位置。

  

  ①准备工作:

    在播放之前,必须先向从缓冲区填充一部分波形音频数据,否则在开始播放后和数据填充前会随机播放一些噪音。预先写入数据块的大小最大可与从缓冲区大小相等,最小不能小于所设置的第一个通知位置。

  ②第一次播放到通知位置I时

    开始播放后,会有一个播放进度指针在缓冲区移动,当它直到通知位置I时,会触发一个事件,用户这时应负责读取新的数据填充到从缓冲区中无效的区域中,上述中填充需要分两步,首先填充从缓冲区中尾部的无效区域,然后填充从缓冲区头部的无效区域。

  ③第一次播放到通知位置2时

    播放到通知位置2时会产生一个事件,这时用户应当负责读取新的数据填充到从缓冲区中最新无效的区域中。

  实现DirectSound播放的关键步骤

  DirectSound同DirectX中的其它部件一样,都是基于组件对象模型创建的,,涉及到的组件对象包括DirectSound对象的IDirectSound管理缓冲区的IDirectSoundBuffer和在不放过程中传递消息的IDirectSoundNotify这三个组件对象。通过这些对象提供的借口完成实际的操作。

  ①创建并设置DirectSound对象

  ②打开波形音频文件

  ③创建从缓冲区

  ④在从缓冲区中设置触发通知事件的位置

  ⑤在播放过程中处理通知事件

  ⑥读取数据写入从缓冲区

  ⑦关闭DirectSound设备

DirectSound学习(二)--流式缓冲区的更多相关文章

  1. StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎

    StreamDM:基于Spark Streaming.支持在线学习的流式分析算法引擎 streamDM:Data Mining for Spark Streaming,华为诺亚方舟实验室开源了业界第一 ...

  2. JDK8新特性(二) 流式编程Stream

    流式编程是1.8中的新特性,基于常用的四种函数式接口以及Lambda表达式对集合类数据进行类似流水线一般的操作 流式编程分为大概三个步骤:获取流 → 操作流 → 返回操作结果 流的获取方式 这里先了解 ...

  3. node学习笔记(二)流和缓冲区

    内容 视频 第四章内容 菜鸟教程服务器 //复制文件 function de(x) { console.log(x); } var fs=require('fs'); fs.mkdir('stuff' ...

  4. Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序

                                        Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序   XenApp可发布以下类型的资源向用户提供信息访问,这 ...

  5. jdk8的stream流式计算的操作

    jdk8之后增加了流式计算,现在根据学习了流式计算,并把过程记录下来: Person.java的bean package com.zhang.collectordemo; /** * @program ...

  6. easylogging++学习记录(二):流式日志

    easylogging++日志库流式日志的写入,依赖于el::base::Writer类的析构,以debug日志为例:具体代码如下: #define LOG(LEVEL) CLOG(LEVEL, EL ...

  7. CSS3与页面布局学习笔记(四)——页面布局大全(负边距、双飞翼、多栏、弹性、流式、瀑布流、响应式布局)

    一.负边距与浮动布局 1.1.负边距 所谓的负边距就是margin取负值的情况,如margin:-100px,margin:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见的功能 ...

  8. JAVA基础学习day20--IO流二-缓冲流、字节流

    一.缓冲流 1.1.字符流的缓冲区 缓冲区的出现是为了提高IO的读写效率 对应类 BufferedReader BufferedWriter 缓冲区要结合流才可以使用 在流的基础上对流的功能进行了增强 ...

  9. 从Storm和Spark 学习流式实时分布式计算的设计

    0. 背景 最近我在做流式实时分布式计算系统的架构设计,而正好又要参加CSDN博文大赛的决赛.本来想就写Spark源码分析的文章吧.但是又想毕竟是决赛,要拿出一些自己的干货出来,仅仅是源码分析貌似分量 ...

随机推荐

  1. mysqldump原理1

  2. problem:SVN error: (501 Not Implemented)

    problem:SVN error: (501 Not Implemented)solution:The repository was moved so the URL I was using is ...

  3. 小白日记32:kali渗透测试之Web渗透-扫描工具-QWASP_ZAP

    扫描工具-QWASP_ZAP 十大安全工具之一,集成性工具,功能完善,而且强大.既可做主动扫描,也可做截断代理.开源免费跨平台,简单易用,体验相对混乱,但在主动扫描方面,相对占优.[kali集成] # ...

  4. 解决ajax回调函数无返回值得问题

    这里以编辑验证角色名为例: 首先,定义一个flag全局变量. 然后,在回调函数resp()中根据判断将flag的值设为true或false. 最后,在调用函数ckrname()中,return fla ...

  5. Android(java)学习笔记93:Android布局详解之一:FrameLayout

    FrameLayout是最简单的布局了.所有放在布局里的控件,都按照层次堆叠在屏幕的左上角.后加进来的控件覆盖前面的控件. 在FrameLayout布局里,定义任何空间的位置相关的属性都毫无意义.控件 ...

  6. Maven 仓库

    Maven仓库分为本地仓库和远程仓库(中央仓库,私服,其他公共仓库)一张图就可以很清楚的看出结构 本地仓库:本地仓库是在我们当前电脑系统盘的user-administrator-m2-reposito ...

  7. vs2010 调试C++程序 快捷键

    命令名 快捷键 说明 调试.应用代码更改 Alt + F10 启动生成操作,利用它可以通过“编辑并继续”功能应用对正在调试的代码所作的更改. 调试.自动窗口 Ctrl + D,Ctrl + A 显示“ ...

  8. Debian 7 安装 Python3.4

    Debian 7 自带的python是2.7.3,要用最新的3.4版本怎么办?我们从官网下载压缩包自己编译. 一.安装编译用的包 $ sudo apt-get install build-essent ...

  9. SRM 584 第一次玩TopCoder。。。只水题一道。。。

    第一次topcoder,以前老感觉没有资格去做tc,cf什么的,现在已经慢慢接触了. 感觉还可以,还是有让我们这些蒻菜安慰的水题. tc的确很好玩,用客户端比赛,还有各种规则,而且还是只编写一个类提交 ...

  10. 如何定位到append的当前位置,不用拉滚动条scrollIntoView方法

    var bb_mes_con = $('bb_mes_con'); var mes_html = document.createElement('div'); mes_html.setAttribut ...