SlimDX的DirectSound模块
网上SlimDX的资源很少,搜到了http://www.xukailun.me/article/238/这篇关于《SlimDX的DirectSound模块应用实战》的文章,备份下来以备不时之需。
1.基本的播放功能
void CreateDirectSound(Guid deviceId, IntPtr handle)
{
// 音频设备的Id
_ds = new DirectSound(deviceId);
// 需要使用窗口的句柄
_ds.SetCooperativeLevel(handle, CooperativeLevel.Normal);
}
void Play(string file)
{
SecondarySoundBuffer snd = null;
// 读取wav音频文件
using (WaveStream ws = new WaveStream(file))
{
var desc = new SoundBufferDescription();
desc.Format = ws.Format;
desc.Flags = BufferFlags.GlobalFocus | BufferFlags.ControlVolume | BufferFlags.ControlPositionNotify | BufferFlags.GetCurrentPosition2;
desc.SizeInBytes = (int)ws.Length;
// 为声音建立二级缓冲区
snd = new SecondarySoundBuffer(_ds, desc);
snd.Volume = -;
byte[] buffer = new byte[desc.SizeInBytes];
ws.Read(buffer, , buffer.Length);
snd.Write<byte>(buffer, , LockFlags.None);
}
snd.Play(, PlayFlags.None);
}
2.播放中的回调
AutoResetEvent功能就类似于Java的wait/notify。调用WaitOne方法相当于wait,使当前线程等待;调用Set方法相当于调用notify,通知线程继续执行。
class SoundUnit
{
public int Id { get; private set; }
public SoundBuffer Buffer { get; private set; }
public AutoResetEvent Event { get; private set; }
public SoundUnit(SoundBuffer buffer)
{
this.Id = ++i;
this.Buffer = buffer;
this.Event = new AutoResetEvent(false);
}
}
void Play(string file)
{
SecondarySoundBuffer snd = null;
SoundUnit su = null;
// 读取wav音频文件
using (WaveStream ws = new WaveStream(file))
{
var desc = new SoundBufferDescription();
desc.Format = ws.Format;
desc.Flags = BufferFlags.GlobalFocus | BufferFlags.ControlVolume | BufferFlags.ControlPositionNotify | BufferFlags.GetCurrentPosition2;
desc.SizeInBytes = (int)ws.Length;
// 为声音建立二级缓冲区
snd = new SecondarySoundBuffer(_ds, desc);
snd.Volume = -;
byte[] buffer = new byte[desc.SizeInBytes];
ws.Read(buffer, , buffer.Length);
snd.Write&lt;byte&gt;(buffer, , LockFlags.None);
su = new SoundUnit(snd);
snd.SetNotificationPositions(new[]{
// 设置播放结束后回调
new NotificationPosition{ Event = su.Event, Offset = DSBPN_OFFSETSTOP } });
}
snd.Play(, PlayFlags.None);
Console.WriteLine("播放开始:" + su.Id);
WaitForNotification(su);
}
void WaitForNotification(SoundUnit unit)
{
new Thread(() =>{
// 等待播放完成
unit.Event.WaitOne();
Console.WriteLine("播放结束:" + unit.Id); }).Start();
}
SlimDX的DirectSound模块的更多相关文章
- DirectSound的应用
假设仅仅使用PlaySound()这个API函数来表现声音效果的话,那么就无法表现出声音的混音效果,由于PlaySound在播放还有一个声音时,必定会导致现有声音的停止.因此,使用 PlaySound ...
- DirectSound应用
只是使用的假设PlaySound()这个API函数来显示的声音效果,然后,然后,它不会出现在混合声音,因为PlaySound还有播放期间声音,这将不可避免地导致现有声音停止. 因此,使用 PlaySo ...
- npm 私有模块的管理使用
你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- ES6模块import细节
写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...
- Python标准模块--ContextManager
1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...
- Python标准模块--Unicode
1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 ...
- Python标准模块--Iterators和Generators
1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然 ...
- 自己实现一个javascript事件模块
nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...
随机推荐
- sizeof对int long double char的使用
主要针对int long char double 字节长度的识记. 1 #include <stdio.h> 2 3 int main() 4 { 5 int a[100]; 6 int ...
- 使用URLConnection获取网页信息的基本流程
参考自core java v2, chapter3 Networking. 注:URLConnection的子类HttpURLConnection被广泛用于Android网络客户端编程,它与apach ...
- css pre如果同时运用了css的border-radius、 overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡
pre如果同时运用了css的border-radius. overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡. 解决方法:去掉css中border-radius. ...
- 让PHP程序永远在后台运行
PHP里有个函数很有用.这是在最近的开发中才逐渐用到的. int ignore_user_abort ( [bool setting] ) 这个函数的作用是指示服务器端在远程客户端关闭连接后是否继续执 ...
- typecho博客出404页面修改方法
适用于typecho博客版本为:0.9 (13.12.12) typecho博客,很多时候可能安装完毕,除了首页,其他页面都是404=.= 在匹配*.php的location区域修改为以下格式: lo ...
- Prime Path(POJ 3126 BFS)
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15325 Accepted: 8634 Descr ...
- Ucenter注册后,需要二次登录才能同步登录的解决方案
1. 打开配置文件config.inc.php 在根目录data目录下最下方定义 define('DZ_DBTABLEPRE', '你的表前缀'); 2.打开uc_server/model/user. ...
- sql 添加约束
在表中添加约束,基本常用的有两种类型,一个是创建表时同时添加约束,另一个是创建好表通过修改表添加约束,在这里是创建表时同时添加约束,但是有两种不同的用写法. 在这里列举出一些创建约束的形式,共参考(均 ...
- 管理Activity,随时随地控制Activity的销毁工作
public class ActivityManager { public static List<Activity> activityList = new ArrayList<Ac ...
- SQL Server索引语法 <第四篇>
从CREATE开始 通过显式的CREATE INDEX命令 在创建约束时作为隐含的对象 随约束创建的隐含索引 当向表中添加如下两种约束之一时,就会创建隐含索引. 主键约束(聚集索引) 唯一约束(唯一索 ...