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

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

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

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

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

  

  ①准备工作:

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

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

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

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

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

  实现DirectSound播放的关键步骤

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

  ①创建并设置DirectSound对象

  ②打开波形音频文件

  ③创建从缓冲区

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

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

  ⑥读取数据写入从缓冲区

  ⑦关闭DirectSound设备

from;http://blog.csdn.net/yinjing8435/article/details/71105067

DirectSound学习(二)--流式缓冲区相关推荐

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

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

  2. 移动web学习(一) --- 流式布局, 视口viewpoint ,2倍图和3倍图, less

    从这章开始,学习移动web 移动web开发指的是需要适配移动设备的网页开发,和pc端没有本质的区别,还是使用html,css,js 一.学习移动web的原因 1. 使用移动设备的用户越来越多 2. 一 ...

  3. 流式传输 之二----流式传输条件

    在网络上传输音视频(A/V)等多媒体信息主要有下载和流式传输两种.流式传输包括:实时流式传输和顺序流式传输. 流式传输需要两个条件: 缓存 因为互联网进行断续的异步传输是以包传输为基础的.对于一个存储 ...

  4. java学习笔记20(Lambda表达式、函数式编程、流式计算、练习)

    文章目录 11.3 学习内容 Lambda表达式 Lambda标准格式 格式说明 省略规则 使用前提 函数式接口 预定义的函数式接口 工作内容 任务1 总结&明日计划 11.4 学习内容 流式 ...

  5. 超级实习生计划学习打卡——流式计算

    学习内容 流式计算 Stream,也就是流,也叫做流式计算.利用 Steam ,可以让 java 以声明性地迭代方式处理集合. 元素是特定类型的对象,形成一个队列. Stream并不会存储元素,而是按 ...

  6. GPU编程和流式多处理器(二)

    GPU编程和流式多处理器(二) 2. 整数支持 SM具有32位整数运算的完整补充. • 加法运算符的可选否定加法 • 乘法与乘法加法 • 整数除法 • 逻辑运算 • 条件码操作 • to/from浮点 ...

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

    转自:http://www.dataguru.cn/thread-341168-1-1.html 流式实时分布式计算系统在互联网公司占有举足轻重的地位,尤其在在线和近线的海量数据处理上.而处理这些海量 ...

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

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

  9. Flink流式计算从入门到实战 二

    文章目录 三.Flink运行架构 1.JobManager和TaskManager 2.并发度与Slots 3.开发环境搭建 4.提交到集群执行 5.并行度分析 6.Flink整体运行流程 Flink ...

  10. Steram流式计算学习笔记

    Steram流式计算 一.概述 说到Stream便容易想到 I/O Stream,而实际上,谁规定"流"就一定是"I0流"呢 ?在Java 8中,得益于Lamb ...

最新文章

  1. 画布canvas标签,并且在画布上画简单的形状
  2. 5 CrawlSpider操作
  3. 据说 99% 的人不知道 vue-devtools 还能直接打开对应组件文件?本文原理揭秘
  4. 基于SIP协议的视频通讯
  5. CentOS6.5与XP双系统安装
  6. ajax与DOM的使用,AJAX和DOM的运行经验
  7. 策略模式Strategy——坐什么车回家?
  8. 肌电信号的包络matlab程序_基于matlab的肌电信号处理程序
  9. 基于区块链的医疗供应链数据隐私保护分布式信息隐藏框架
  10. 计算机任务栏隐藏恢复,电脑任务栏不见了怎么办?如何找回?
  11. win10专业版关闭Windows Defender Antivirus
  12. 凯文·凯利:最伟大的产品还没有被创造出来
  13. 产品经理必修课(4):深挖需求
  14. winfows 切换 双屏_win10多个桌面切换快捷键 win10怎样设置双屏显示两个桌面
  15. Rasa项目实战之银行金融Financial Bot智能业务对话机器人业务功能微服务解析与调试(九十二)
  16. c语言一维数组n个元素求和,C++编程一维数组元素求和?
  17. 【Paper Reading】二值化网络——BNN
  18. 新买的苹果11如何验真假
  19. Android 安装apk流程,Android PMS(二)-Apk安装流程
  20. JS中的void 0是什么意思?

热门文章

  1. 对比企业邮箱服务的好处
  2. 面试大厂,你需要掌握这些面试技巧
  3. android定时启动 tasker,Android 神器 Tasker 个人的一些配置
  4. Protobuf 在 Ubuntu18 下的安装和使用
  5. java 重载与重写 【转】
  6. Cocos2dx和Unity3D对比
  7. NR、EN-DC等名词解释
  8. 传智java完整教学视频
  9. Drupal项目实战-公司订餐系统
  10. GCD中dispatch_semaphore(信号量)的使用方法