Eli olin tehnyt yksinkertaista peliä, jossa täytyy painaa hiirtä ruudun taustavärin vaihtuessa. Haluaisin laittaa peliin mukaan ääniä ja yksi niistä pitäisi kuulua juuri samaan aikaan kun ruudun taustaväri vaihtuu.
Äänen saan kyllä kuuluviin, mutta se kuuluu vasta noin 0,4 sekuntin päästä ruudun värin vaihtumisesta. Ääni toistetaan sen funktion ensimmäisellä rivillä, joka vaihtaa myös näytön taustavärin, eli sen ei pitäisi olla ongelma. Äänitiedostossakaan ei hiljaisia kohtia ole ollenkaan.
Lisäksi huomasin, että kun ohjelman sulkee, niin se sulkeutuu pienellä viiveellä. Alkuperäinen ohjelma ilman ääniä sulkeutuu välittömästi.
SDL_mixerin käyttöön olen ottanut oppia oppaista löytyvän SDL-oppaan viimeisestä osasta.
Osaisiko joku auttaa?
Ethän vain lataa äänitiedostoa joka kerta, kun toistat sen?
tuomas11 kirjoitti:
Ääni toistetaan sen funktion ensimmäisellä rivillä
Funktioita on moneen lähtöön... Koodi vois selventää, jos ei tuolla selviä.
Äänitiedosto ladataan jo ohjelman käynnistyksen yhteydessä.
Funktion koodi, jolla ääni on tarkoitus toistaa on seuraava:
inline void Soita() { if(Mix_PlayChannel(0, aani, 0)==-1) { fprintf(stderr, "Virhe : %s ", Mix_GetError()); // virhe } }
Ja tässä sitä nyt käytetään:
void NaytaMerkki() { Soita(); nayta = true; aloitusaika_r = SDL_GetTicks(); ym, ym , ym...
Seuraa vähän typerä mietintä: onko soitettavan äänitiedoston alussa tyhjää tai muuten hiljaista, joka voisi aiheuttaa viiveen vaikutelman?
progo kirjoitti:
Seuraa vähän typerä mietintä: onko soitettavan äänitiedoston alussa tyhjää tai muuten hiljaista, joka voisi aiheuttaa viiveen vaikutelman?
Ei, kyllä siinä äänitiedostossa alkaa ääni heti.
Kannattaa tutkia ohjelman fps, jos kerta ohjelma myös sulkeutuu viiveellä.
Pasteamastasi koodista ei selviä koko olennaista väliä(piirtohetkestä äänentoistohetkeen), joten tuosta ei vielä voi tehdä mitään päätelmiä.
Tutkihan, kauanko kuluu aikaa piirron ja äänen toiston välillä ja vaikka kumpikin tai vain toinen mukaanlukien.
Niin joo tosiaan. Kuva siis piirretään heti tuon aloitusaika_r -rivin jälkeen. Pitää nuo fps:ät yms. jutut selvittää...
Kannattaa tarkistaa, mikä on SDL:n äänipuskurin koko. Mitä pidempi puskuri, sitä pidempi viive. Puskurin täytyy kuitenkin niin pitkä, että ohjelman FPS riittää puskurin päivitykseen.
Kyseessä on siis Mix_OpenAudio
-funktion chunksize
-parametri. Kokeile esimerkiksi arvoa 512.
Aihe on jo aika vanha, joten et voi enää vastata siihen.