DirectX.DirectSound播放下一曲

我在使用DirectX.DirectSound进行播放音频时,发现正常播放或者同时播放多个音频都可以实现,但是当我想要同时放入多个音频文件列表进行播放时,却找不到实现的方法了。
下面是我播放音频文件的方法:

img

我希望在我想要多个音频文件按顺序播放时,能手动暂停、恢复,该用哪种方式去监听它的音频播放结束事件呢?

该回答引用ChatGPT

下面是一个使用C#实现DirectX.DirectSound播放多个音频文件的示例代码。该示例代码中使用了多线程来实现同时播放多个音频文件:


using System.Collections.Generic;
using System.Threading;
using Microsoft.DirectX.DirectSound;

public class SoundPlayer
{
    private Device device;
    private List<SecondaryBuffer> soundBuffers = new List<SecondaryBuffer>();
    private List<Thread> playingThreads = new List<Thread>();

    public SoundPlayer()
    {
        device = new Device();
        device.SetCooperativeLevel(System.Windows.Forms.Control.FromHandle(System.IntPtr.Zero), CooperativeLevel.Priority);
    }

    public void Load(string[] soundFiles)
    {
        foreach (string soundFile in soundFiles)
        {
            BufferDescription description = new BufferDescription();
            description.ControlVolume = true;
            description.GlobalFocus = true;
            description.BufferBytes = (int)(new System.IO.FileInfo(soundFile).Length);
            description.Format = new WaveFormat();
            SecondaryBuffer soundBuffer = new SecondaryBuffer(soundFile, description, device);
            soundBuffers.Add(soundBuffer);
        }
    }

    public void Play()
    {
        foreach (SecondaryBuffer soundBuffer in soundBuffers)
        {
            Thread playingThread = new Thread(() =>
            {
                soundBuffer.Play(0, BufferPlayFlags.Default);
                while (soundBuffer.Status.Playing)
                {
                    Thread.Sleep(10);
                }
            });
            playingThread.Start();
            playingThreads.Add(playingThread);
        }
    }

    public void Stop()
    {
        foreach (Thread playingThread in playingThreads)
        {
            playingThread.Abort();
        }
        playingThreads.Clear();
        foreach (SecondaryBuffer soundBuffer in soundBuffers)
        {
            soundBuffer.Stop();
            soundBuffer.Dispose();
        }
        soundBuffers.Clear();
    }
}

首先,在构造函数中,我们创建了一个DirectSound设备,并设置了它的协作级别。在Load方法中,我们读取音频文件,并使用每个文件的大小创建一个SecondaryBuffer。所有的SecondaryBuffer对象被存储在soundBuffers列表中。

在Play方法中,我们使用一个线程来播放每个SecondaryBuffer对象。我们首先启动每个播放线程,然后等待每个线程完成播放。在每个线程中,我们使用BufferPlayFlags.Default标志来播放SecondaryBuffer对象。在每个线程中,我们使用一个循环来检查SecondaryBuffer是否仍在播放。在所有播放线程完成后,我们清除playingThreads列表,并停止并销毁所有的SecondaryBuffer对象。

使用该类时,你可以按如下方式加载并播放多个音频文件:

string[] soundFiles = { "sound1.wav", "sound2.wav", "sound3.wav" };
SoundPlayer soundPlayer = new SoundPlayer();
soundPlayer.Load(soundFiles);
soundPlayer.Play();

当你想停止播放时,可以调用Stop方法:

soundPlayer.Stop();