Pergunta

Eu estou fazendo um programa de amostrador onde cada tecla de 1 a 9 vai fazer um som diferente. Tudo funciona bem, mas quando eu pressionar duas (ou mais) sons ao mesmo tempo, o segundo "mata" o primeiro.

Eu estou jogando os sons de .WAV, usando SoundPlayer. Como posso resolver isso?

Foi útil?

Solução

Você vai precisar usar DirectX (DirectSound) ou algum API semelhante que é projetado para permitir a reprodução de vários sons ao mesmo tempo.

Outras dicas

Há uma maneira simples de jogar vários sons ao mesmo tempo em C # ou VB.Net. Você vai ter que chamar a função mciSendString() API para jogar cada arquivo .wav. Você não vai mesmo ter de fazer multi-threading, a menos que você são loop-jogo. Aqui é um exemplo de trabalho completo de uma classe MusicPlayer criado usando mciSendString().

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

Na função acima, a chave é primeiro comando parâmetro. Contanto que você chama duas funções com um nome de comando separado, eles vão jogar 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ê pode fazer isso:

SoundPlayer suporta WAV Stream. Você poderia

  • amostras MIX você joga 'por mão' e,
  • Falso (obter o cabeçalho WAV de algum lugar, não é complicado).

E fornecer tal fluxo como um parâmetro para o construtor SoundPlayer .

Dessa forma, você não terá que usar bibliotecas DirectSound de algum modo complicado, e ainda ter de mistura (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 de "mono" que você está encontrando, desde que o Windows tem sido capaz de reproduzir vários arquivos WAV em simultâneo desde o Windows 98. O que eu acho que você está ouvindo (baseado em meu próprio uso dessa classe) não é um corte do primeiro som quando a segunda começa, mas, na verdade, uma falha que resulta de pausa de reprodução geral como o arquivo WAV é carregado a partir do disco.

Em vez de carregar uma nova instância do SoundPlayer em cada tecla pressionada, tente criar uma matriz de SoundPlayer com escopo de classe objetos e pré-carregá-los a partir do disco no evento Load do formulário. Em seguida, basta chamar método Play de cada SoundPlayer quando a tecla for pressionada. Isso pode resolver o seu problema, embora eu acho que você ainda vai ter falhas ocasionais desta forma.

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 poderia jogar dois arquivos de áudio ao mesmo tempo, a chamada na segunda track2.wav áudio não vai perturbar o jogo de track1.wav.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top