首页 > 代码库 > SlimDX的DirectSound模块

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();     } 

 

SlimDX的DirectSound模块