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源码分析的文章吧.但是又想毕竟是决赛,要拿出一些自己的干货出来,仅仅是源码分析貌似分量 ...
随机推荐
- SAP BW中的增强(转)
根据所了解的资料,BW中的有关增强可分为五部分,如下: 1. 数据抽取增强,即在标准数据源中加入数据源中所不存在的字段,或者标准数据源不存在所需数据而需要自定义数据源,相关的事务代码有RSO2(用于 ...
- PAT 1002
1002. A+B for Polynomials (25) This time, you are supposed to find A+B where A and B are two polynom ...
- hadoop实例---多表关联
多表关联和单表关联类似,它也是通过对原始数据进行一定的处理,从其中挖掘出关心的信息.如下 输入的是两个文件,一个代表工厂表,包含工厂名列和地址编号列:另一个代表地址表,包含地址名列和地址编号列.要求从 ...
- Gradle Goodness: Set Java Compiler Encoding--转载
原文地址:http://java.dzone.com/articles/gradle-goodness-set-java If we want to set an explicit encoding ...
- Firefox便携版
安装firefox后默认配置文件在C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox 可以在快捷方式里设置不同的配置文件,但是要注意参数的含义 ...
- 物理CPU、物理核跟逻辑核的区分
一般来说,物理CPU个数×每颗核数就应该等于逻辑CPU的个数,如果不相等的话,则表示服务器的CPU支持超线程技术 ,所以您的电脑是双核的. 一 概念① 物理CPU 实际Server中插槽上的CPU个数 ...
- hdu 4665 搜索
思路:直接搜索 #include<iostream> #include<cstdio> #include<algorithm> #include<cstrin ...
- jquery 60秒倒计时(方法二)
<script type="text/javascript">var wait=60;document.getElementById("btn"). ...
- Ehcache(2.9.x) - API Developer Guide, Cache Loaders
About Cache Loaders A CacheLoader is an interface that specifies load() and loadAll() methods with a ...
- JAVA UDP网络编程学习笔记
一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的 ...