View Full Version : BUG AUDIO !!! Forse più dii uno...
Provate questo codice:
package it.diamonds;
import it.diamonds.engine.audio.*;
public class ProvaSound
{
public static void SleepOneSecond()
{
try
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
/* Nothing to do here */
}
}
/**
* @param args
*/
public static void main(String[] args)
{
Audio audio = new Audio();
Sound sound1 = new Sound("diamond");
Sound sound2 = new Sound("diamond");
Sound sound3 = new Sound("diamond");
sound1.play();
SleepOneSecond();
sound2.play();
SleepOneSecond();
sound3.play();
SleepOneSecond();
sound2.play();
SleepOneSecond();
sound1.play();
SleepOneSecond();
}
Cosa notate ? A me sound3 viene riprodotto più forte degli altri... Se aggiungete un altro Sound, l'ultimo viene sempre riprodotto più forte !!!
Un altro bug... In pratica se il suono viene riprodotto una prima volta, la seconda non viene riprodotto...
In particolare mi riferisco al suono della gemma che tocca il fondo...
public void play()
{
if(!testing)
{
AL10.alSourcePlay(source);
}
wasPlayed = true;
}
Il programma arriva ad eseguire correttamente questa funzione, ma AL10.alSourcePlay(source) non produce alcun suono (il suono è stato istanziato in GemFactory sia per la prima che per la seconda gemma)...
Potete vederlo facilmente facendo arrivare in fondo (in colonne diverse) due gemme...
^TiGeRShArK^
17-11-2005, 12:44
ehm...
a me capita che se faccio cadere la gemma la prima non produce il suono mentre la seconda si....
Hmmm... e' un problema della libreria?
O piu' facilmente stiamo facendo noi qualcosa di sbagliato?
Nell'ordine inverso: prima assicuriamoci di pilotare la libreria in maniera corretta e poi, quando siamo sicuri che il problema non e' nostro, ricontrolliamo che stiamo pilotando la libreria in maniera corretta.
E poi, concludiamo che il problema e' loro.
ehm...
a me capita che se faccio cadere la gemma la prima non produce il suono mentre la seconda si....
Puoi testare il codice sopra ?
Ho risolto il problema, ma non ho capito il perchè si presentava...
Modificando GemFactory da così:
package it.diamonds;
import it.diamonds.engine.audio.Sound;
public class GemFactory
{
public GemFactory()
{
}
public Gem create()
{
Gem gem = new Gem("diamond");
gem.setCollisionSound(new Sound("diamond"));
return gem;
}
}
a così:
package it.diamonds;
import it.diamonds.engine.audio.Sound;
public class GemFactory
{
Sound sound;
public GemFactory()
{
sound = new Sound("diamond");
}
public Gem create()
{
Gem gem = new Gem("diamond");
gem.setCollisionSound(sound);
return gem;
}
}
il bug nel gioco è sparito...
Comuqnue il problema di fondo rimane... Come mai la prima soluzione non funzionava ?
Sono riuscito a riprodurre il problema (ovvviamente con la prima versione di GemFactory):
public static void main(String[] args)
{
Audio audio = new Audio();
GemFactory gemFactory = new GemFactory();
Gem gem = gemFactory.create();
gem.drop();
SleepOneSecond();
gem = gemFactory.create();
gem.drop();
SleepOneSecond();
gem = gemFactory.create();
gem.drop();
SleepOneSecond();
gem = gemFactory.create();
gem.drop();
SleepOneSecond();
gem = gemFactory.create();
gem.drop();
SleepOneSecond();
}
Ho fatto il commit di GemFactory corretta per eliminare il problema, conviene riportarla alla versione con il problema ? Che dite ?
C:\cruisecontrol-2.3.0.1\work\checkout\diamonds\trunk\src\it\diamonds\GemFactory.java:7:11: Variable 'sound' must be private and have accessor methods.
Lanciate lo script di build sempre e comunque prima del commit.
E che kaiser... Devo riportare il tutto alla prima versione... Altrimenti nella copia di GemFactory all'interno di GemFactoryForTesting si cerca di allocare un Sound e di conseguenza non essendo l'audio inizializzato falliscono praticaemnte tutti i test...
E che kaiser... Devo riportare il tutto alla prima versione... Altrimenti nella copia di GemFactory all'interno di GemFactoryForTesting si cerca di allocare un Sound e di conseguenza non essendo l'audio inizializzato falliscono praticaemnte tutti i test...
Scrivi del codice per creare Sound di testing all'interno di GemFactoryForTesting.
Ho fatto così, altrimenti la copia di GemFactory in GemFactoryForTesting inizializzava un sound e creava un'eccezione...ovviamente è passibile di refactoring...
package it.diamonds;
import it.diamonds.engine.audio.Sound;
public class GemFactory
{
private Sound sound = null;
public GemFactory()
{
}
public Gem create()
{
if(sound == null)
{
sound = new Sound("diamond");
}
Gem gem = new Gem("diamond");
gem.setCollisionSound(sound);
return gem;
}
}
Scrivi del codice per creare Sound di testing all'interno di GemFactoryForTesting.
Non risolverei perchè comunque viene chiamato prima il costruttore della superclasse...
Ho fatto così, altrimenti la copia di GemFactory in GemFactoryForTesting inizializzava un sound e creava un'eccezione...ovviamente è passibile di refactoring...
In che senso "la copia di GemFactory in GemFactoryForTesting"?
Puoi postare il codice di GemFactoryForTesting?
package it.diamonds;
public class GemFactoryForTesting extends GemFactory
{
public GemFactoryForTesting()
{
}
public Gem create()
{
return Gem.createForTesting();
}
}
La "copia" nel senso che essendo GemFactory la classe base, viene comunque richiamato il costruttore di GemFactory per ogni nuova istanza di GemFactoryForTesting...
package it.diamonds;
public class GemFactoryForTesting extends GemFactory
{
public GemFactoryForTesting()
{
}
public Gem create()
{
return Gem.createForTesting();
}
}
La "copia" nel senso che essendo GemFactory la classe base, viene comunque richiamato il costruttore di GemFactory per ogni nuova istanza di GemFactoryForTesting...
Malissimo. Vedi che succede se non lavori con le interfacce e fai ereditarieta' per condividere il codice?
Eredita strettamente sempre e solo per modellare relazioni "is a" che soddisfano il principio di sostituzione.
GemFactory dev'essere solo un'interfaccia, con due implementazioni:
- GameGemFactory
- GemFactoryForTesting
E non c'e' bisogno di alcun hack, perche' il tuo problema sparisce da solo.
Ehm...io te lo avevo chiesto su MSN se dovevo fare l'interfaccia... Probabilmente ho capito male quello che mi hai detto :D
Comunque è necessario fare anche un discorso relativo all'hardware. Cioè, così come per l'OpenGL, anche la scheda audio del PC deve supportare OpenAL e a dire la verità al riguardo non sono molto esperto. In ogni caso, prima di parlare di bug della libreria (decisamente improbabile visto che OpenAL è usato in Quake 4, UT2004 ed in innumerevoli titoli), sarebbe il caso di verificare il funzionamento di OpenAL con il codice dei tutorial che, teoricamente, dovrebbe essere corretto.
Ehm...io te lo avevo chiesto su MSN se dovevo fare l'interfaccia... Probabilmente ho capito male quello che mi hai detto :D
Hai ragione tu, non ero stato chiaro io in MSN :(
Comunque è necessario fare anche un discorso relativo all'hardware. Cioè, così come per l'OpenGL, anche la scheda audio del PC deve supportare OpenAL e a dire la verità al riguardo non sono molto esperto. In ogni caso, prima di parlare di bug della libreria (decisamente improbabile visto che OpenAL è usato in Quake 4, UT2004 ed in innumerevoli titoli), sarebbe il caso di verificare il funzionamento di OpenAL con il codice dei tutorial che, teoricamente, dovrebbe essere corretto.
Per ora mi basterebbe che qualcuno testasse il mio codice, magari con una scheda audio decente (io ho una ALC850 integrata) :)
Allora si fa così... Per ora lascio il codice con il bug (aggiorno comunque aggiungendo l'interfaccia)...così almeno tutti lo possono testare...
Aggiornato e provato...il suono si sente per tutte le gemme e non aumenta per ciascuna...
Scheda audio: audigy 2 zs pro
Bene a sapersi... Quindi non funziona con il mio sistema ?!?!?
BlueDragon
17-11-2005, 20:38
Qui tutto bene...nessun suono mancato o più forte dei precedenti.
Audio integrato della ABIT NF7-S (nForce2 chipset).
(decisamente improbabile visto che OpenAL è usato in Quake 4, UT2004 ed in innumerevoli titoli),
Quake4 mi funziona bene...mentre Diamonds no !!! :sofico:
Cercherò un po' in giro...
Questa demo mi funziona perfettamente:
http://lwjgl.org/documentation_openal_03.php
Quake4 mi funziona bene...mentre Diamonds no !!! :sofico:
Cercherò un po' in giro...
Bè dai...quake IV è un "giochino da poco", vuoi paragonarlo con diamond ? :Prrr: :Prrr: :Prrr:
Allora che si fa per questo bug audio ?!?!?
Potrei provare a fare uno branch che fa il preload di tutti i file audio... Nella demo sopra fanno così e sembra funzionare alla perfezione...
Io ho testato la build di ieri sera e l'audio da me va perfettamente.
Il problema è ancora il volume?
Allora che si fa per questo bug audio ?!?!?
Potrei provare a fare uno branch che fa il preload di tutti i file audio... Nella demo sopra fanno così e sembra funzionare alla perfezione...
Si', prova, e' una buona soluzione se funziona.
Io ho testato la build di ieri sera e l'audio da me va perfettamente.
Il problema è ancora il volume?
No... Il problema è che mi si sente solo la prima gemma... Per questo problema ho già trovato un workaround...ma suppongo che una soluzione a livello di motore audio sarebbe migliore...
Prova con il branch allora, così puoi svariare come vuoi ;)
Ok...allora la prossima settimana ci provo... :)
Allora...ricapitolo un po' i risultati della prova...
Ho creato test driven la classe allegata...
I risultati:
- precaricare i Sound sicuramente risolve il problema dell'audio che non si sente
- precaricare due diamond.wav identici (uno nominato diamond2.wav) non risolve comunque il problema del volume, l'ultimo caricato si sente più piano
- provando con altri suoni identici il problema non si presenta !!! Quindi mi viene da pensare che diamond.wav sia malformato...
- attualmente faccio scegliere casualmente da GameGemFactory il suono da usare, ovviamente solo per questo Spike, quindi tutti i suoni caricati verranno (prima o poi) eseguiti...
Il link per lo spike: svn://spartacus.dnsalias.net/diamonds/branches/SoundBank
- provando con altri suoni identici il problema non si presenta !!! Quindi mi viene da pensare che diamond.wav sia malformato...
A conferma di questo facendo richiamare un altro suono nel codice originale (quindi senza le mie modifiche) il suono si sente sempre correttamente...
Allora non è un problema, dato che il suono del diamante penso proprio che lo cambieremo ;)
La classe SoundBank mi piace, la teniamo in caldo per una delle prossime storie quando Jocchano lo reputa opportuno.
Inoltre per come è strutturata ora GameGemFactory se si superano 25 suoni caricati (25 diamanti) mi viene generata un'eccezione...
La cambio per rimuovere questo problema...senza inserire SoundBank, ma semplicemente passando lo stesso suono a tutte le gemme...
Da me l'exception si verifica dopo aver posizionato 32 diamanti (quando vado a piazzare il 33esimo insomma). Prima però va tutto bene, e l'audio funziona perfettamente.
Con la modifica che faccio adesso non dovrebbe dare più alcuna eccezione visto che viene utilizzato lo stesso oggetto Sound per tutte le gemme...
Con la modifica che faccio adesso non dovrebbe dare più alcuna eccezione visto che viene utilizzato lo stesso oggetto Sound per tutte le gemme...
Perfetto.
Jocchan: prova un po' la build per l'eccezione che ti si presentava dopo 32 gemme...
Jocchan: prova un po' la build per l'eccezione che ti si presentava dopo 32 gemme...
Ottimo, ho riempito l'area di gioco senza problemi ;)
Grande Cionci! :cincin:
Ottimo, 2 messaggi e 2 spammate... Sei bannato...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.