Воспроизведение нескольких звуков одновременно с помощью mciSendString в Visual Studio (c #) - PullRequest
1 голос
/ 12 апреля 2019

Чтобы было понятно: я пытался найти решение, просматривая другие сообщения на этом форуме, но безрезультатно (возможно, из-за моих все еще слабых знаний программирования на c #).

Сейчас я занимаюсь разработкой игры для RTS. Как и в играх - они издают звуки.

В настоящее время я могу воспроизводить звуки одновременно при нажатии кнопки, используя этот код:

using System.Runtime.InteropServices;

int a = 1;

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

private void button4_Click(object sender, EventArgs e)
    {
        mciSendString(@"open 2.wav type waveaudio alias sound2" + a, null, 0, IntPtr.Zero);
        mciSendString(@"play sound2" + a, null, 0, IntPtr.Zero);
       // mciSendString("close sound2" + a, null, 0, IntPtr.Zero);
        a+=1;
    }

Это работает, но только когда каждый раз, когда псевдоним отличается от предыдущего (поэтому я использую увеличивающуюся цифру в имени). Но .. Если во время игры будут воспроизводиться звуки, скажем, 10 000 раз ... это "съест" много памяти?

Нужно ли менять код? Есть ли «лучший» вариант сделать это? Я искал код условия, который закрывает его после завершения воспроизведения, но ... Я также хочу, чтобы звук воспроизводился через 0,2 с после звука (который длится 2-10 с в зависимости от используемого звука), так что будет эхо. Я видел некоторые коды со словом Dispose, но я не знаю, как его использовать.

Когда я писал этот пост, я думал, что я нашел возможное решение:

        mciSendString("open 1.wav type waveaudio alias sound1" + a, null, 0, IntPtr.Zero);
        mciSendString("play sound1" +a, null, 0, IntPtr.Zero);
        mciSendString("close sound1" +(a-1), null, 0, IntPtr.Zero);
        a+=1;

, но первый воспроизводимый звук останавливается, прежде чем воспроизводится второй.

Есть ли более "профессиональное" решение для этого? Или это просто отлично?

Надеюсь, я четко описал свою проблему.

...