SlimDX的DirectSound模块

摘要:
调用WaitOne方法相当于wait,使当前线程等待;调用Set方法相当于调用notify,通知线程继续执行。

网上SlimDX的资源很少,搜到了http://www.xukailun.me/article/238/这篇关于《SlimDX的DirectSound模块应用实战》的文章,备份下来以备不时之需。

1.基本的播放功能

voidCreateDirectSound(Guid deviceId, IntPtr handle)
{    
    //音频设备的Id    
    _ds = newDirectSound(deviceId);                 
  //需要使用窗口的句柄
_ds.SetCooperativeLevel(handle, CooperativeLevel.Normal); 
}             
void Play(stringfile)
 {     
    SecondarySoundBuffer snd = null;     
    //读取wav音频文件     
    using (WaveStream ws = newWaveStream(file))
     {         
        var desc = newSoundBufferDescription();
            desc.Format =ws.Format;         
        desc.Flags = BufferFlags.GlobalFocus | BufferFlags.ControlVolume | BufferFlags.ControlPositionNotify |BufferFlags.GetCurrentPosition2;
            desc.SizeInBytes = (int)ws.Length;                     
        //为声音建立二级缓冲区          
        snd = newSecondarySoundBuffer(_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,通知线程继续执行

classSoundUnit 
{     
    public int Id { get; private set; }     
    public SoundBuffer Buffer { get; private set; }     
    public AutoResetEvent Event { get; private set; }                
    publicSoundUnit(SoundBuffer buffer) 
    {         
            this.Id = ++i;         
            this.Buffer =buffer;         
            this.Event = new AutoResetEvent(false);     
    } 
}            
    void Play(stringfile) 
    {     
        SecondarySoundBuffer snd = null;     
        SoundUnit su = null;                
        //读取wav音频文件     
        using (WaveStream ws = newWaveStream(file)) 
        {         
            var desc = newSoundBufferDescription();         
            desc.Format =ws.Format;         
            desc.Flags = BufferFlags.GlobalFocus | BufferFlags.ControlVolume |             BufferFlags.ControlPositionNotify |BufferFlags.GetCurrentPosition2;         
            desc.SizeInBytes = (int)ws.Length;                    
            //为声音建立二级缓冲区          
            snd = newSecondarySoundBuffer(_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 = newSoundUnit(snd);         
            snd.SetNotificationPositions(new[]{             
            //设置播放结束后回调             
            new NotificationPosition{ Event = su.Event, Offset =DSBPN_OFFSETSTOP }         });     
        }     
        snd.Play(0, PlayFlags.None);                    
        Console.WriteLine("播放开始:" +su.Id);     
        WaitForNotification(su); 
    }            
    voidWaitForNotification(SoundUnit unit) 
    {     
        new Thread(() =>{         
        //等待播放完成         
unit.Event.WaitOne();        
         Console.WriteLine("播放结束:" +unit.Id);     }).Start(); 
    } 

免责声明:文章转载自《SlimDX的DirectSound模块》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Arduino通过L9110进行电机控制HeroM2连击技能设置和DB完整数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

websocket之四:WebSocket 的鉴权授权方案

引子 WebSocket 是个好东西,为我们提供了便捷且实时的通讯能力。然而,对于 WebSocket 客户端的鉴权,协议的 RFC 是这么说的: This protocol doesn’t prescribe any particular way that servers canauthenticate clients during the WebSoc...

解决nginx反向代理webservice的soap:address location问题

原文:https://blog.csdn.net/mn960mn/article/details/50716768 一:首先来发布一个web service package com.ws.service;public interface IUserService{ public String getUserName(String id);}package...

WebSocket 实现长连接演示代码

服务端代码(node) const WebSocket = require('ws') const ws = new WebSocket.Server({ port: 8080 },()=>{ console.log('socket start') }) // 创建服务器 // 连接监听 clinet表示已经连接的客户端对象有多个 let...

JAX-WS HandlerChain使用详解

JAX-WS的Handler和Servlet的Filter相似,可以对所有WebServicer进行拦截,在Handler中可以记录日志、权限控制、对请求的SOAP消息进行加密,解密等。JAX-WS提供两个Handler接口,LogicalHandler和SOAPHandler。LogicalHandler处理的是Message Payload,只能够访...

FastAPI WebSocket 基本使用一

FastAPI WebSocket 简单演示 下午没事看了看WebSocket,感觉这个挺好玩的,比写CRUD有意思。就复制了官网的demo演示看了看。 官方文档https://fastapi.tiangolo.com/advanced/websockets/ 效果 WebSocket 服务 使用Python FastAPI框架官网demo from t...

ajax与websocket的区别以及websocket常用使用方式

笔者近期在公司的项目中渐渐的接触了一些比较高级的业务逻辑处理,其中比较有意思的地方就是前端接受后台给与的推送问题。 一般前端与后端的交互主要是使用ajax进行异步操作调用交互,比较有趣的是这种交互方式一般都是单项交互的-- -及前端给后端发出请求后端接受请求后执行操作,即便前端可以接受后端给予的返回值,但是与后端交互的主动权始终是放在前端手里面。 而这样就...