SDL - Langsam
-
Habe gerade folgendes Porgrämmchen geschrieben, um mal irgendwie nen Ton mit SDL zu produzieren. Funktioniert auch blendend, aber irgendwie ist dass so langsam. Bedeutet: Wenn ich auf die Taste drücke [bei DOWN wird der Chunk abgespielt], dauert es so ca. eine halbe Sekunde, bis der Ton gespielt wird. Wenn ich von der Taste runtergehe, spielt es vll. noch eine halbe sekunde nach. Irgendwas stimmt hier mit der Reaktionszeit nicht.
Hört sich jetzt so wenig an, halbe Sekunde, ich finde aber dass das extrem aufällt.
Weiß vll. jemand warum? An was kanns liegen? Ich hoff ma nich am PC, is n duo core 2 Prozessor, also dass müsste schon reichen.#include "SDL/SDL.h" #include "SDL/SDL_image.h" #include "SDL/SDL_mixer.h" #include <iostream> #include <string> using namespace std; //Variables SDL_Surface *screen = NULL; SDL_Event event; Mix_Chunk *sound1 = NULL; Mix_Chunk *sound2 = NULL; bool quit = false; //__________________ int main(int argc, char *args[]) { //Initializations if(SDL_Init(SDL_INIT_EVERYTHING) == -1) { return 1; } screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE); if(screen == NULL) { return 1; } if(Mix_OpenAudio(22050,MIX_DEFAULT_FORMAT,2,4096) == -1) { return 1; } //____________________ //Load files sound1 = Mix_LoadWAV("beep.wav"); sound2 = Mix_LoadWAV("beeplow.wav"); if((sound1 == NULL) || (sound2 == NULL)) { return 1; } //____________________ //Event loop while(quit == false) { if(SDL_PollEvent(&event)) { if(event.type == SDL_QUIT) { quit = true; } Uint8 *keystate = SDL_GetKeyState(NULL); //sound if(keystate[SDLK_DOWN]) { if(Mix_PlayChannel(1,sound1,-1) == -1) { return 1; } } else { if(Mix_HaltChannel(1) == -1) { return 1; } } } } //________________________ //Close variables Mix_FreeChunk(sound1); Mix_FreeChunk(sound2); SDL_Quit(); Mix_CloseAudio(); //_________________________ return 0; }MfG
Stromberg
-
Mix_OpenAudio(22050,MIX_DEFAULT_FORMAT,2,4096)
Versuch's mal mit 'nem kleineren Buffer.
-
ich denke, es könnte daran liegen
if(keystate[SDLK_DOWN]) { if(Mix_PlayChannel(1,sound1,-1) == -1) { return 1; } }hier wird doch solange die Taste gedrückt ist dauernd Mix_PlayChannel aufgerufen,
versuch doch mal das mit SDL_KEY_DOWN und SDL_KEY_UP und den events zu implementieren, ich denke, dann müsste es schneller laufen.
-
@hellihjb
Joa, stimmt der Buffer war viel zu groß.Wenn der Buffer eine größe von 256/512 hat läufts wie geschmiert, ohne Zeitverzögerung.
Nur ist mein problem nun, dass ich z.B. mp3 dateien, und kleine .wav Chunks im selben Programm ab spielen möchte.
Mach ich nun den Buffer groß (z.B. 4096), dann kann ich problemlos große mp3 datein abspielen, aber keine .wav Chunks, denn es kommt ja wieder die Verzögerung.
Ist der Buffer nur 256 groß, kann ich die .wav Chunks problemlos abspielen, aber keine großen .mp3 datein.
Was tun?MfG
Stromberg
-
FMOD ?
-
von mp3 dateien kannst du nicht wirklich erwarten dass sie dynamisch sind. damit kannst du ne hintergrundmusik abspielen. wav dateien dann fuer soundeffekte. ich denke damit sollte es dann keine probleme geben, oder? (anmerkung: ich kenne mich nicht spezifisch mit SDL aus)
-
Doch leider schon, eine normales mp3 Lied braucht im Durchschnitt nen Buffer von 4096 (bei Mix_OpenAudio), gut okay, somit laufen bei mir mp3 Lieder. Aber nun will ich ja gleichzeitig dazu noch Effekte mit .wav Chunks machen, geht aber nicht, bzw. hört sich kacke an, weil die .wav Chunks bei so einem "großen" Buffer total verzögert kommen -> Kacke!
Jetzt kann ich natürlich den Buffer verkleinern, auf 256 z.B. oder 512, nur kann ich dann keine mp3 Lieder mehr abspielen, da der Buffer für mp3's nun zu klein ist.
Dass ist hier die Zwickmühle.
Weiß jemand obs da in SDL vll. irgendwie n ausweg gibt? Oder soll ich Mix_OpenAudio öfter laden, immer vor mp3's und vor .wav's? Zeitaufwändig! Ich hab ka...MfG
Stromberg
-
also mir scheint es als wuerdest du hier nicht mit SDL direkt, sondern mit SDL_Audio arbeiten...
wuerde an deiner stelle mal Ogg Vorbis probieren, da hatte ich bislang auch bei kleineren buffern keine probleme. und wenn es wirklich absolut nicht hinhaut, dann kannst du ja deinen MP3-Stream in einen groesseren zwischenbuffer entpacken und von da aus in deinen kleinen buffer reinmischen.