Воспроизведение одного звука за другим с помощью SDL_mixer?

У меня 4 звука. Мне нужно воспроизвести звук 1, когда он закончится, автоматически воспроизвести звук 2; когда заканчивается звук 2, автоматически воспроизводится звук 3. Звук 3 заканчивается, воспроизводится звук 4.... Я использую SDL Mixer 2.0, без звука SDL... Есть ли способ?

int main() {
    int frequencia = 22050;
    Uint16 formato = AUDIO_S16SYS;
    int canal = 2; // 1 mono; 2 = stereo;
    int buffer = 4096;
    Mix_OpenAudio(frequencia, formato, canal, buffer);

    Mix_Chunk* sound_1;
    Mix_Chunk* sound_2;
    Mix_Chunk* sound_3;
    Mix_Chunk* sound_4;

    som_1 = Mix_LoadWAV("D:\\sound1.wav");
    som_2 = Mix_LoadWAV("D:\\sound1.wav");
    som_3 = Mix_LoadWAV("D:\\sound1.wav");
    som_4 = Mix_LoadWAV("D:\\sound1.wav");

    Mix_PlayChannel(-1, sound_1, 0);
    Mix_PlayChannel(1, sound_2, 0);
    Mix_PlayChannel(2, sound_3, 0);
    Mix_PlayChannel(3, sound_4, 0);

    return 0;

}

person mrsoliver    schedule 21.04.2019    source источник
comment
Является ли эхо (эхо-эхо) в заголовке преднамеренным? Кроме того, вы загружаете один и тот же звук 4 четыре раза, не будет ли достаточно загрузить его один раз и воспроизвести четыре раза?   -  person πάντα ῥεῖ    schedule 21.04.2019
comment
Спасибо. Не преднамеренно. Это было неправильно....   -  person mrsoliver    schedule 21.04.2019
comment
Я не играю тот же звук. 4 звука разные   -  person mrsoliver    schedule 22.04.2019


Ответы (1)


Проверьте в цикле, воспроизводится ли канал, используя Mix_Playing(). , и добавьте задержку с помощью SDL_Delay(), чтобы цикл не потреблял все доступное процессорное время.

(В этом примере я изменил ваш первый вызов на Mix_PlayChannel() с -1 на 1.)

Mix_PlayChannel(1, sound_1, 0);
while (Mix_Playing(1) != 0) {
    SDL_Delay(200); // wait 200 milliseconds
}

Mix_PlayChannel(2, sound_2, 0);
while (Mix_Playing(2) != 0) {
    SDL_Delay(200); // wait 200 milliseconds
}

// etc.

Вместо этого вам, вероятно, следует обернуть это в функцию, чтобы вы не повторяли один и тот же код снова и снова:

void PlayAndWait(int channel, Mix_Chunk* chunk, int loops)
{
    channel = Mix_PlayChannel(channel, chunk, loops);
    if (channel < 0) {
        return; // error
    }
    while (Mix_Playing(channel) != 0) {
        SDL_Delay(200);
    }
}

// ...

PlayAndWait(-1, sound_1, 0);
PlayAndWait(1, sound_2, 0);
PlayAndWait(2, sound_3, 0);
PlayAndWait(3, sound_3, 0);
person Nikos C.    schedule 21.04.2019
comment
почти нормально работает... установка задержки на 0, даже в этом случае есть небольшая тишина между звуком 1 и 2... мне нужно, чтобы звук 2 проигрывался сразу после звука 1, без задержки... - person mrsoliver; 22.04.2019
comment
@mrsoliver Я не знаю, может ли SDL_mixer воспроизводить без пауз. - person Nikos C.; 22.04.2019