簡體   English   中英

播放聲音,等待它完成,然后做一些事情?

[英]Play a sound, wait for it to finish and then do something?

我正在編寫一個Windows Forms應用程序,它應該播放三個聲音文件,並且在每個聲音文件的末尾,它是為了改變圖像的來源。

我可以使用System.Media.SoundPlayer來播放聲音。 然而,似乎在不同的線程中播放聲音,繼續。

這樣的凈效果是只播放最后一個聲音並且所有圖像都被改變。

我已經嘗試過Thread.Sleep ,但是它會睡眠整個GUI,在睡眠期之后,所有事情都會立刻發生,並且它會播放最后一個聲音。

UPDATE

我認為PlaySynch正在工作,但它似乎凍結了我的GUI,這不太理想。 我還可以做些什么?

你試過SoundPlayer.PlaySync方法嗎? 從幫助:

PlaySync方法使用當前線程播放.wav文件,防止線程處理其他消息,直到加載完成。

不使用Play方法,而是使用PlaySync方法。

使用此代碼:

[DllImport("WinMM.dll")]
public static extern bool  PlaySound(byte[]wfname, int fuSound);

//  flag values for SoundFlags argument on PlaySound
public static int SND_SYNC        = 0x0000;      // Play synchronously (default).
public static int SND_ASYNC       = 0x0001;      // Play asynchronously.
public static int SND_NODEFAULT   = 0x0002;      // Silence (!default) if sound not found.
public static int SND_MEMORY      = 0x0004;      // PszSound points to a memory file.
public static int SND_LOOP        = 0x0008;      // Loop the sound until next sndPlaySound.
public static int SND_NOSTOP      = 0x0010;      // Don't stop any currently playing sound.
public static int SND_NOWAIT      = 0x00002000;  // Don't wait if the driver is busy.
public static int SND_ALIAS       = 0x00010000;  // Name is a registry alias.
public static int SND_ALIAS_ID    = 0x00110000;  // Alias is a predefined ID.
public static int SND_FILENAME    = 0x00020000;  // Name is file name.
public static int SND_RESOURCE    = 0x00040004;  // Name is resource name or atom.
public static int SND_PURGE       = 0x0040;      // Purge non-static events for task.
public static int SND_APPLICATION = 0x0080;      // Look for application-specific association.
private Thread t; // used for pausing
private string bname;
private int soundFlags;

//-----------------------------------------------------------------
public void Play(string wfname, int SoundFlags)
{
    byte[] bname = new Byte[256];    //Max path length
    bname = System.Text.Encoding.ASCII.GetBytes(wfname);
            this.bname = bname;
            this.soundFlags = SoundFlags;
            t = new Thread(play);
            t.Start();
}
//-----------------------------------------------------------------

private void play()
{
    PlaySound(bname, soundFlags)
}

public void StopPlay()
{
    t.Stop();
}

public void Pause()
{
    t.Suspend(); // Yeah, I know it's obsolete, but it works.
}

public void Resume()
{
    t.Resume(); // Yeah, I know it's obsolete, but it works.
}

你可能想要做的是做一個異步聲音,但然后禁用你的UI,使其不響應用戶響應。 然后播放聲音后,重新啟用UI。 這將允許您仍然正常繪制UI。

我想出了怎么做。 我使用了PlaySynch,但是我在一個單獨的線程中播放了繪制UI的代碼。 在播放每個文件后,同一個線程也會更新UI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM