我在使用DirectX.DirectSound进行播放音频时,发现正常播放或者同时播放多个音频都可以实现,但是当我想要同时放入多个音频文件列表进行播放时,却找不到实现的方法了。
下面是我播放音频文件的方法:
我希望在我想要多个音频文件按顺序播放时,能手动暂停、恢复,该用哪种方式去监听它的音频播放结束事件呢?
该回答引用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();