[英]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.