繁体   English   中英

为什么我的 SDL_mixer 播放我的 wav。 文件太快?

[英]Why is my SDL_mixer playing my wav. file too fast?

从这个 Lazy Foo 教程 ( https://lazyfoo.net/tutorials/SDL/21_sound_effects_and_music/index.php ) 我写了以下代码行:

#include <SDL.h>
#include <SDL_mixer.h>

bool running = true;
int main(int argc, char** argv) {
    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
    SDL_Window* window = SDL_CreateWindow("testing musique", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    SDL_Event quit;
    Mix_Music* music;

    while (running) {
        while(SDL_PollEvent(&quit)){
            switch(quit.type) {
            case SDL_QUIT:
                running = false;
                break;
            }
        }

        Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048);
        music = Mix_LoadMUS("../pikachu/keypress_BMP/beat.wav");
        Mix_PlayMusic(music, -1);

        SDL_SetRenderDrawColor(renderer, 20, 20, 255, 255);
        SDL_RenderClear(renderer);
        SDL_RenderPresent(renderer);
    }

    Mix_FreeMusic(music);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
}

我什至使用了与 Lazy Foo 在他的教程中所做的相同的音频文件(beat.wav),但是当他的程序运行顺利时,我的播放 wav 太快了(尽管我检查了每个参数以确保我的匹配他的)。 我尝试降低 Mix_OpenAudio 中的频率参数,但是当 wav 确实变慢时,音高也变慢了,而且一开始这样做应该没有意义。 我应该怎么办?

音频子系统只能在主循环之前打开一次,同时在循环的每次迭代中打开它。 将文件加载到内存中也是如此——在循环的每次迭代中再次加载,而不是一次。 所以正确的代码结构应该是这样的:

#include <SDL.h>
#include <SDL_mixer.h>

int main(int argc, char** argv) {
    bool running = true;
    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);

    SDL_Window* window = SDL_CreateWindow("testing musique", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

    // open audio and load music file before main loop
    Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048);
    Mix_Music* music = Mix_LoadMUS("../pikachu/keypress_BMP/beat.wav");

    SDL_Event event;

    while (running) {
        while(SDL_PollEvent(&event)){
            switch(event.type) {
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym) {
                case SDLK_P:
                    Mix_PlayMusic(music, -1);
                    break;
                case SDLK_S:
                    Mix_HaltMusic();
                    break;
                }
            case SDL_QUIT:
                running = false;
                break;
            }
        }

        SDL_SetRenderDrawColor(renderer, 20, 20, 255, 255);
        SDL_RenderClear(renderer);
        SDL_RenderPresent(renderer);
    }

    // close audio and free the music after main loop
    Mix_CloseAudio();
    Mix_FreeMusic(music);

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
}

不要忘记Mix_CloseAudio和错误检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM