5

3 つのサウンド ファイルを再生し、各サウンド ファイルの最後でイメージのソースを変更するWindowsフォームアプリケーションを作成しています。

を使用して音を鳴らすことができますSystem.Media.SoundPlayer。ただし、別のスレッドでサウンドを再生し続けているようです。

これの最終的な効果は、最後のサウンドだけが再生され、すべてのイメージが変更されることです。

試してみましたがThread.Sleep、GUI全体がスリープし、スリープ期間の後、すべてが一度に発生し、最後に再生されたサウンドが再生されます。

アップデート

PlaySynch が機能していると思っていましたが、理想的とは言えない GUI がフリーズしているようです。他に何ができますか?

4

5 に答える 5

11

SoundPlayer.PlaySync メソッドを試しましたか? ヘルプから:

PlaySync メソッドは、現在のスレッドを使用して .wav ファイルを再生し、読み込みが完了するまでスレッドが他のメッセージを処理できないようにします。

于 2008-09-29T13:44:20.253 に答える
1

Play メソッドを使用する代わりに、PlaySyncメソッドを使用します。

于 2008-09-29T13:46:46.300 に答える
1

次のコードを使用します。

[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.
}
于 2009-05-14T21:23:38.393 に答える
0

おそらくやりたいことは、非同期サウンドを実行することですが、ユーザーの応答に応答しないように UI を無効にします。次に、サウンドが再生されたら、UI を再度有効にします。これにより、UI を通常どおりペイントできます。

于 2008-09-29T13:54:48.217 に答える
0

私はそれを行う方法を考え出しました。PlaySynch を使用しましたが、UI を描画するコードとは別のスレッドで再生を行いました。同じスレッドは、各ファイルが再生された後に UI も更新します。

于 2008-09-29T14:03:15.827 に答える