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源码分析的文章吧.但是又想毕竟是决赛,要拿出一些自己的干货出来,仅仅是源码分析貌似分量 ...
随机推荐
- 网络IPC:套接字之套接字选项
套接字机制提供两个套接字选项接口来控制套接字的行为.一个接口用来设置选项,另一个接口允许查询一个选项的状态.可以获取或设置的三种选项: (1)通用选项,工作在所有套接字类型上. (2)在套接字层次管理 ...
- focuskye 学习及下载
学习:http://www.focusky.com.cn/tutorials/ 下载:http://www.focusky.com.cn/download/
- C#_ajax fileupload
@{ ViewBag.Title = "Index"; Layout = null; } <h2>Index</h2> <script src=&qu ...
- BFS-hdu-1226-超级密码
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1226 题目意思: 给一个N,给nn个jj进制的数字,问最小的不超过500位的由这些数字组成的jj进制 ...
- Windows Service 之 详解(二)
一.创建 Windows 服务程序 1.文件 → 新建 → 项目 → 选择 Windows 服务模板,创建 WinService 项目: 选择这个服务的属性,可以打开属性对话框.可配置如下值: [1] ...
- 泛型类型转为DataTable类型
public static DataTable ConvertToDatatable<T>(IEnumerable<T> data) { PropertyDescriptorC ...
- [改善Java代码]避免在构造函数中初始化其他类
建议35: 避免在构造函数中初始化其他类 构造函数是一个类初始化必须执行的代码,它决定着类的初始化效率,如果构造函数比较复杂,而且还关联了其他类,则可能产生意想不到的问题,我们来看如下代码: publ ...
- poj 3352 边连通分量
思路与poj3177一模一样. #include<iostream> #include<cstdio> #include<cstring> #include< ...
- webView中支持input的file的选择和alert弹出
alert()弹出 input的file现选择(特别说明:不同的android版本弹出的样式不同,选择文件后自动上传) webView.setWebChromeClient(new WebChrome ...
- Jersey(1.19.1) - Client API, Ease of use and reusing JAX-RS artifacts
Since a resource is represented as a Java type it makes it easy to configure, pass around and inject ...