none
DirectSound如何關掉 離開程式自動靜音的功能 RRS feed

  • 問題

  •  

    大大

     

    我需要操控各音效卡播放音效,DirectSound是一個很好的解決方案,DShow和DMusic好像都不可以選擇對那個音效裝置輸出,

    但是DirectSound有一個致命的缺點,就是她必須設定 ds.SetCooperativeLevel HAND, DSSCL_PRIORITY

     

    設定這個目的讓程式離開遊戲時事沒有聲音的, 但是我的程式不是遊戲,常駐在背景時間到播放到指定音效卡,

    但是視窗焦點離開程式時就會自動靜音

     

     

    我試著用ds.SetCooperativeLevel GetForegroundWindow, DSSCL_PRIORITY  使用GetForegroundWindow API

    來追蹤目前使用者的目標視窗的HAND

     

    這個方法可以有效讓聲音在背景播出,但是有一個很大的缺點就是當滑鼠點住"工作列"

    點住不要放,視窗焦點切換之前 GetForegroundWindw 為 0 而讓聲音再度消失,

    很頭痛 ............................

     

    不知大大們 有什麼方法可以讓視窗焦點離開自己時 還可以繼續播放DirectSound裡的音效 且是針對不同音校卡輸出。

     

     

     

     

     

     

    2007年11月13日 上午 03:59

解答

  • DirectShow怎麼會沒辦法選擇輸出裝置?

    所有GraphEdit能做到的功能,把GraphEdit做的動作用DirectShow程式化就可以達成。

    網路上找一找範例應該很多
    2008年5月6日 下午 05:31

所有回覆

  •  

    您好~

     

    我也遇過相同的問題~

    就是在 Form 失焦時,DirectSound 會暫停播放...

     

    經過 survey 後~

    參考如下

    http://topic.csdn.net/t/20050302/11/3817872.html

     

    將 playbackBufferDescription.StickyFocus 設為 true 即可...

     

    我驗證的 code 如下(部分, C#) :

     

    // open file

    OpenFileDialog fd = new OpenFileDialog();
    fd.ShowDialog();

     

    // open file of stream

    FileStream fs = new FileStream(fd.FileName, FileMode.Open);

     

    // set video of device

    dev = new Device();
    dev.SetCooperativeLevel(this, CooperativeLevel.Priority);

     

    // create buffer of description and set stickyfocus true

    BufferDescription playbackBufferDescription = new BufferDescription();
    playbackBufferDescription.StickyFocus = true;

     

    // create second buffer for device
    SecondaryBuffer snd = new SecondaryBuffer(fs, playbackBufferDescription, dev);

     

    // play sound
    snd.Play(0, BufferPlayFlags.Looping);

    2008年4月30日 下午 02:01
  • DirectShow怎麼會沒辦法選擇輸出裝置?

    所有GraphEdit能做到的功能,把GraphEdit做的動作用DirectShow程式化就可以達成。

    網路上找一找範例應該很多
    2008年5月6日 下午 05:31