心澄欲遣

不践迹,亦不入于室

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

 

posted on 2014-09-28 15:55  心澄欲遣  阅读(642)  评论(0编辑  收藏  举报
欢迎第myspace graphics个访客