DirectSound学习(二)--流式缓冲区
使用流式缓冲方式播放波形音频文件比较复杂,主要原因是在只有一个缓冲区提供给用户的前提下,这个缓冲区在提供给声卡播放数据的同是还需要用户不断的定时向其中写入数据。要注意从缓冲区这时是一个环形缓冲区,声音的播放和数据的写入都是从缓冲区中循环进行的。
波形音频数据写入到从缓冲区时需要三个因素:①写入的实践,也就是什么时候开始写入;
②写入位置,也就是要从从缓冲区的哪一个点开始写入;
③写入数据量,也就是从缓冲区有多少缓冲数据已经播放完,可以用新数据填充。
写入时机可以由用户自己预先在从缓冲区中固定位置定义一些通知事件触发点,当播放到这些位置时,就会触发相应的事件,这时我们就可以写入新的PCM格式的数据。写入位置和写入数据量都可以在这时调用DirectSoundApi函数获得。如果写入点在接近从缓冲区结束的位置上,而需要写入的数据量超过了剩余空间,这时,我们首先将数据填充从缓冲区的剩余部分,然后将剩下未写入的数据填充到从缓冲区的开始位置。

①准备工作:
在播放之前,必须先向从缓冲区填充一部分波形音频数据,否则在开始播放后和数据填充前会随机播放一些噪音。预先写入数据块的大小最大可与从缓冲区大小相等,最小不能小于所设置的第一个通知位置。
②第一次播放到通知位置I时
开始播放后,会有一个播放进度指针在缓冲区移动,当它直到通知位置I时,会触发一个事件,用户这时应负责读取新的数据填充到从缓冲区中无效的区域中,上述中填充需要分两步,首先填充从缓冲区中尾部的无效区域,然后填充从缓冲区头部的无效区域。
③第一次播放到通知位置2时
播放到通知位置2时会产生一个事件,这时用户应当负责读取新的数据填充到从缓冲区中最新无效的区域中。
实现DirectSound播放的关键步骤
DirectSound同DirectX中的其它部件一样,都是基于组件对象模型创建的,,涉及到的组件对象包括DirectSound对象的IDirectSound管理缓冲区的IDirectSoundBuffer和在不放过程中传递消息的IDirectSoundNotify这三个组件对象。通过这些对象提供的借口完成实际的操作。
①创建并设置DirectSound对象
②打开波形音频文件
③创建从缓冲区
④在从缓冲区中设置触发通知事件的位置
⑤在播放过程中处理通知事件
⑥读取数据写入从缓冲区
⑦关闭DirectSound设备
DirectSound学习(二)--流式缓冲区的更多相关文章
- StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎
StreamDM:基于Spark Streaming.支持在线学习的流式分析算法引擎 streamDM:Data Mining for Spark Streaming,华为诺亚方舟实验室开源了业界第一 ...
- JDK8新特性(二) 流式编程Stream
流式编程是1.8中的新特性,基于常用的四种函数式接口以及Lambda表达式对集合类数据进行类似流水线一般的操作 流式编程分为大概三个步骤:获取流 → 操作流 → 返回操作结果 流的获取方式 这里先了解 ...
- node学习笔记(二)流和缓冲区
内容 视频 第四章内容 菜鸟教程服务器 //复制文件 function de(x) { console.log(x); } var fs=require('fs'); fs.mkdir('stuff' ...
- Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序
Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序 XenApp可发布以下类型的资源向用户提供信息访问,这 ...
- jdk8的stream流式计算的操作
jdk8之后增加了流式计算,现在根据学习了流式计算,并把过程记录下来: Person.java的bean package com.zhang.collectordemo; /** * @program ...
- easylogging++学习记录(二):流式日志
easylogging++日志库流式日志的写入,依赖于el::base::Writer类的析构,以debug日志为例:具体代码如下: #define LOG(LEVEL) CLOG(LEVEL, EL ...
- CSS3与页面布局学习笔记(四)——页面布局大全(负边距、双飞翼、多栏、弹性、流式、瀑布流、响应式布局)
一.负边距与浮动布局 1.1.负边距 所谓的负边距就是margin取负值的情况,如margin:-100px,margin:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见的功能 ...
- JAVA基础学习day20--IO流二-缓冲流、字节流
一.缓冲流 1.1.字符流的缓冲区 缓冲区的出现是为了提高IO的读写效率 对应类 BufferedReader BufferedWriter 缓冲区要结合流才可以使用 在流的基础上对流的功能进行了增强 ...
- 从Storm和Spark 学习流式实时分布式计算的设计
0. 背景 最近我在做流式实时分布式计算系统的架构设计,而正好又要参加CSDN博文大赛的决赛.本来想就写Spark源码分析的文章吧.但是又想毕竟是决赛,要拿出一些自己的干货出来,仅仅是源码分析貌似分量 ...
随机推荐
- Python学习 之 包和模块
1.rpm -ql python #查看python在计算机中安装了哪些文件 2.模块是一个可以导入的Python脚本文件 包是一堆按目录组织的模块和子包,目录下的__init__.py文件存放了包的 ...
- Qt之遍历文件夹
关于Qt操作文件夹.文件的知识用途较多,比如遍历下一层乃至所有子孙文件.文件夹,获取它们的一些信息(大小.类型.最后更改时间等).当然,也可以进行级联删除. 首先看简单的: 一.Qt遍历文 ...
- apache配置--虚拟目录
apache在httpd-vhosts.conf中 配置二级域名或者泛域名: <VirtualHost *:80> ServerAdmin 846606478@qq.com D ...
- java_Oralce
简单范例 create or replace procedure delete_table is i number(10); begin for x in (select * from emp whe ...
- 使用js对中文进行gbk编码
使用js对中文进行gbk编码 分类: JS/JQUERY2013-02-09 11:29 436人阅读 评论(0) 收藏 举报 最近遇到一个问题,需要通过js来从一个utf-8编码的页面传递一个含中文 ...
- Helpers\GeoCode
Helpers\GeoCode This function connects to google maps and retrieves the lat/lon of the address provi ...
- DataTables warning (table id = 'myTable'): Requested unknown parameter '0' from the data source for row 0
第一种方式:不用在js里设置列Html: <table id="myTable"> <thead> <tr> <th>Title-1 ...
- JQUERY 动态时钟
<script type="text/javascript" src="script/jquery-1.8.3.min.js"></scrip ...
- [改善Java代码]子列表只是原列表的一个视图
List接口提供了subList方法,其作用是返回一个列表的子列表.这与String类的subString有点类似.但是他们的功能是否相同?看代码: import java.util.ArrayLis ...
- IP地址,子网掩码、默认网关,DNS理论解释
在网上发现的这篇文章写的非常好,有理论有示例. (一) 问题解析 001. 问: IP地址,子网掩码,默认网关,DNS服务器,有什么区别呀?我知道没有IP地址就不能上网,我也知道没设DNS就不 ...