【问题标题】:Play one sound after another with SDL_mixer?使用 SDL_mixer 播放一个接一个的声音?
【发布时间】:2019-04-21 19:28:13
【问题描述】:

我有 4 个声音。我需要播放声音 1,完成后自动播放声音 2;当声音 2 结束时,自动播放声音 3。声音 3 结束,播放声音 4....我正在使用 SDL Mixer 2.0,没有 SDL Sound...有什么办法吗?

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;

}

【问题讨论】:

  • 标题中的回声(echo echo)是故意的吗?另外,您将相同的声音 4 加载四次,加载一次并播放四次还不够吗?
  • 谢谢。不是故意的。这是错误的......
  • 我播放的声音不一样。 4 种声音不同

标签: c++ sdl sdl-mixer


【解决方案1】:

使用Mix_Playing() 在循环中检查通道是否仍在播放,并使用SDL_Delay() 添加延迟以防止循环消耗所有可用的 CPU 时间。

(在本例中,我将您对 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);

【讨论】:

  • 几乎可以正常工作...将延迟设置为 0,即便如此,声音 1 和声音 2 之间仍有一小段静音...我需要声音 2 在声音 1 之后立即播放,没有延迟.. .
  • @mrsoliver 我不知道 SDL_mixer 是否可以进行无间隙播放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多