Reproduce múltiples sonidos usando SoundPlayer

Estoy haciendo un progtwig de muestra en el que cada tecla del 1 al 9 emitirá un sonido diferente. Todo funciona bien, pero cuando presiono dos (o más) sonidos al mismo tiempo, el segundo “mata” al primero.

Estoy reproduciendo los sonidos de los archivos .WAV, usando SoundPlayer . ¿Como puedo resolver esto?

Tendrá que usar DirectX (DirectSound) o alguna API similar que esté diseñada para permitir la reproducción de múltiples sonidos al mismo tiempo.

Hay una manera simple de reproducir varios sonidos a la vez en C # o VB.Net. Tendrá que llamar a la mciSendString() API mciSendString() para reproducir cada archivo .wav. Ni siquiera tendrá que hacer varios subprocesos, a menos que esté jugando en bucle. Aquí hay un ejemplo de trabajo completo de una clase MusicPlayer creada usando mciSendString() .

 // Sound api functions [DllImport("winmm.dll")] static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback); 

En la función anterior, la tecla es el primer comando de parámetro. Siempre que llame a dos funciones con un nombre de comando separado, se reproducirán por separado / simultáneamente. Esto es lo que hice en uno de mis progtwigs C #:

 private void PlayWorker() { StringBuilder sb = new StringBuilder(); mciSendString("open \"" + FileName + "\" alias " + this.TrackName, sb, 0, IntPtr.Zero); mciSendString("play " + this.TrackName, sb, 0, IntPtr.Zero); IsBeingPlayed = true; } 

EDITAR: Agregó un enlace a un ejemplo de trabajo.

Podrías hacer esto:

SoundPlayer compatible con WAV Stream. Tú podrías

  • Mezcle muestras que toca ‘a mano’ y,
  • Fake (obtener el encabezado WAV de algún lado, no es complicado).

Y proporcione dicho flujo como parámetro para el constructor SoundPlayer .

De esta forma, no tendrá que utilizar bibliotecas de DirectSound algo complicadas, y aún tendrá mezclas (múltiples sonidos a la vez).

Supongo que en su evento KeyPress (o lo que sea que esté usando) está creando una nueva instancia de SoundPlayer utilizando el constructor que toma una ruta al archivo WAV y luego llama a su método Play. En teoría, esto no debería causar el efecto “mono” que estás encontrando, ya que Windows ha sido capaz de reproducir múltiples archivos WAV simultáneamente desde Windows 98. Lo que creo que estás escuchando (basado en mi propio uso de esta clase) no es un corte del primer sonido cuando comienza el segundo, sino una falla que resulta de la pausa general de reproducción cuando el archivo WAV se carga desde el disco.

En lugar de cargar una nueva instancia de SoundPlayer en cada pulsación de tecla, intente crear una matriz de objetos SoundPlayer de clase y precargarlos desde el disco en el evento Load de su formulario. Luego simplemente llame al método Play de SoundPlayer cuando se presione la tecla. Esto puede solucionar su problema, aunque creo que de todos modos obtendrá fallas ocasionales de esta manera.

 using System.Windows.Media Function void Play(string audioPath) { MediaPlayer myPlayer = new MediaPlayer(); myPlayer.Open(new System.Uri(audioPath)); myPlayer.Play(); } Play(Application.StartupPath + "\\Track1.wav"); Play(Application.StartupPath + "\\Track2.wav"); 

Este código podría reproducir dos archivos de audio simultáneamente, la llamada en el segundo audio track2.wav no perturbará la reproducción de track1.wav .