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 = -200;
        byte[] buffer = new byte[desc.SizeInBytes];
        ws.Read(buffer, 0, buffer.Length);
        snd.Write<byte>(buffer, 0, LockFlags.None);
    }
    snd.Play(0, 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 = -200;
            byte[] buffer = new byte[desc.SizeInBytes];
            ws.Read(buffer, 0, buffer.Length);
            snd.Write&amp;lt;byte&amp;gt;(buffer, 0, LockFlags.None);
            su = new SoundUnit(snd);
            snd.SetNotificationPositions(new[]{
            // 设置播放结束后回调
            new NotificationPosition{ Event = su.Event, Offset = DSBPN_OFFSETSTOP }         });
        }
        snd.Play(0, PlayFlags.None);
        Console.WriteLine("播放开始:" + su.Id);
        WaitForNotification(su);
    }
    void WaitForNotification(SoundUnit unit)
    {
        new Thread(() =>{
        // 等待播放完成
        unit.Event.WaitOne();
         Console.WriteLine("播放结束:" + unit.Id);     }).Start();
    } 
时间: 2024-10-12 17:12:09

SlimDX的DirectSound模块的相关文章

DirectSound的应用

假设仅仅使用PlaySound()这个API函数来表现声音效果的话,那么就无法表现出声音的混音效果,由于PlaySound在播放还有一个声音时,必定会导致现有声音的停止.因此,使用 PlaySound()要想构建出一个包括丰富音乐与音效的游戏世界是不现实的. 而DirectSound就能够完美的解决混音问题,并且它直接针对硬件编程,最大程度上减小了游戏进程逻辑对于声音播放效果的影响. 在这篇文章里,先谈谈DirectSound的使用. 初始化工作第一步,也是全部DirectX组建初始化的必做工作

Day5 - 常用模块学习

本节大纲: 模块介绍(模块导入方法) time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 模块,用一堆代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又

c# 无法加载xxx.dll 找不到指定的模块(如何指定文件夹)

如果直接放在项目运行目录,例如bin/debug可以直接加载,但是这样比较乱. 如果在放debug里面的一个文件夹里面,有可能会报错“无法加载xxx.dll 找不到指定的模块”. 如果路径写成这样就会报错 framework/linphone 解决方法:将/ 改成"\" framework\linphone

LEDAPS1.3.0版本移植到windows平台----HuCsm云掩膜模块

这个是2012年左右放在百度空间的,谁知百度空间关闭...转移到博客园. 最近项目用到3.1.2版本的LEDAPS,新版本的使用情况会在后续文章中慢慢丰富. HuCsm是将LEDAPS项目中的TM/ETM+大气校正流程系列算法中的云掩膜模块由linux系统移植到windows下的产物,代码本身改动不大,使用接口不变. 包含文件: HuCsm.exe hd423m.dll hm423m.dll 编译程序需要包含的静态库有: gctp.lib hdfeos.lib hd423m.lib hm423m

Python学习系列----第五章 模块

5.1 如何引入模块 在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入.在调用math模块中的函数时,必须这样引用: 模块名.函数名 有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以通过语句 from 模块名 import 函数名1,函数名2.... 5.2 如何定义自己的模块 在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字. 比如有这样一个文件test.py

Python:hashlib加密模块,flask模块写登录接口

hashlib模块 主要用于加密相关的操作,(比如说加密字符串)在python3的版本里,代替了md5和sha模块,主要提供 sha1, sha224, sha256, sha384, sha512 ,md5 这些加密方式 import  hashlib m = hashlib.md5()   #用md5加密的方式(md5加密后无法解密),创建一个md5的对象 m.update(b"Hello")  #b代表二进制字节bytes,把字符串hello转成字节,然后加密:用b给一个变量转换

python如何使用pymysql模块

Python 3.x 操作MySQL的pymysql模块详解 前言pymysql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而MySQLdb不支持3.x版本. 一.安装 pip3 install pymysql 二.pymysql方法 pymysql.connect()参数说明 参数 类型 说明 host str mysql服务器地址 port int mysql服务器端口号 user str 用户名 passwd str

微控工具xp模块-开发版[微信(wechat)二次开发模块]

http://repo.xposed.info/module/com.easy.wtool 微控工具xp模块-开发版[微信(wechat)二次开发模块] 基于xposed框架的微信二次开发模块,方便开发者用微信做一些扩展功能(如微信群发.多群直播等...) 目前支持功能: 发文本消息 发图片消息 发语音消息 发视频消息 获取微信好友列表 群列表 支持群发消息 支持消息转发(目前支持文本.图片.语音.视频.图文消息转发) 群管理功能(建群.加人.踢人.设置公告.改群名.退群.解散群) [注:本模块

用ESP8266 WIFI模块连接服务器,并实现与服务器相互通讯

最近在做一个智能锁的项目,该项目要求实现在任何地方(当然是要有网络的)可以在手机上用APP开锁.而我负责的部分主要是实现底层与服务器连接,并且要能相互通讯.考虑了很多问题,最终选择了用ESP8266 WIFI模块实现了这个功能.下面向大家就简单分享一下. 工具:网络调试助手  ESP8266  STM32F1开发板 首先,用网络调试助手来虚拟一个服务器,如下: 有了服务器后,接下来我们就要用WIFI来连接这个服务器.ESP8266 有三种工作模式,由于项目要求,我选用了STA中的客户端模式.下面