Reproduzir vários sons usando o SoundPlayer

Estou fazendo um programa de amostragem onde cada tecla de 1 a 9 fará um som diferente. Tudo funciona bem, mas quando eu pressiono dois (ou mais) sons ao mesmo tempo, o segundo “mata” o primeiro.

Estou tocando os sons de arquivos .WAV, usando o SoundPlayer . Como posso resolver isso?

Você precisará usar o DirectX (DirectSound) ou alguma API semelhante projetada para permitir a reprodução de vários sons ao mesmo tempo.

Existe uma maneira simples de reproduzir vários sons de uma vez em C # ou VB.Net. Você terá que chamar a function da API mciSendString() para reproduzir cada arquivo .wav. Você não precisará nem fazer multi-threading, a menos que você esteja jogando em loop. Aqui está um exemplo completo de trabalho de uma class MusicPlayer criada usando mciSendString() .

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

Na function acima, a chave é o primeiro comando de parâmetro. Contanto que você chame duas funções com um nome de comando separado, elas serão reproduzidas separadamente / simultaneamente. Isto é o que eu fiz em um dos meus programas em 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; } 

EDIT: Adicionado link para um exemplo de trabalho.

Você poderia fazer isso:

SoundPlayer suporta o WAV Stream. Você poderia

  • MIX samples que você toca ‘by hand’ e,
  • Fake (pegue o header WAV de algum lugar, não é complicado).

E forneça esse stream como um parâmetro para o construtor SoundPlayer .

Dessa forma, você não precisará usar bibliotecas do DirectSound complicadas e ainda ter mixagem (vários sons ao mesmo tempo).

Eu estou supondo que em seu evento KeyPress (ou o que você está usando) você está criando uma nova instância do SoundPlayer usando o construtor que leva um caminho para o arquivo WAV e, em seguida, chamando seu método Play. Em teoria, isso não deve causar o efeito “mono” que você está encontrando, já que o Windows é capaz de reproduzir vários arquivos WAV simultaneamente desde o Windows 98. O que eu acho que você está ouvindo (com base no meu próprio uso dessa class) não é um corte do primeiro som quando o segundo começa, mas na verdade é uma falha que resulta da pausa geral da reprodução quando o arquivo WAV é carregado do disco.

Em vez de carregar uma nova instância do SoundPlayer em cada pressionamento de tecla, tente criar uma matriz de objects SoundPlayer com escopo de class e pré-carregue-os do disco no evento Carregar do formulário. Em seguida, basta ligar para cada método de reprodução do SoundPlayer quando a tecla for pressionada. Isso pode resolver seu problema, embora eu ache que você ainda terá problemas ocasionais.

 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 pode reproduzir dois arquivos de áudio simultaneamente, a chamada no segundo audio track2.wav não afetará a reprodução de track1.wav .