PDA

View Full Version : BUG AUDIO !!! Forse più dii uno...


cionci
17-11-2005, 11:46
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....

fek
17-11-2005, 12:52
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.

cionci
17-11-2005, 14:07
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 ?

cionci
17-11-2005, 14:12
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 ?

cionci
17-11-2005, 14:28
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 ?

fek
17-11-2005, 14:40
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.

cionci
17-11-2005, 14:59
Hai ragione :muro:

cionci
17-11-2005, 15:16
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...

fek
17-11-2005, 15:19
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.

cionci
17-11-2005, 15:20
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;
}
}

cionci
17-11-2005, 15:21
Scrivi del codice per creare Sound di testing all'interno di GemFactoryForTesting.
Non risolverei perchè comunque viene chiamato prima il costruttore della superclasse...

fek
17-11-2005, 15:26
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?

cionci
17-11-2005, 15:27
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...

fek
17-11-2005, 17:08
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.

cionci
17-11-2005, 18:15
Ehm...io te lo avevo chiesto su MSN se dovevo fare l'interfaccia... Probabilmente ho capito male quello che mi hai detto :D

Vifani
17-11-2005, 18:39
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.

fek
17-11-2005, 18:40
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 :(

cionci
17-11-2005, 18:44
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) :)

cionci
17-11-2005, 18:45
Allora si fa così... Per ora lascio il codice con il bug (aggiorno comunque aggiungendo l'interfaccia)...così almeno tutti lo possono testare...

cover
17-11-2005, 19:20
Aggiornato e provato...il suono si sente per tutte le gemme e non aumenta per ciascuna...
Scheda audio: audigy 2 zs pro

cionci
17-11-2005, 19:22
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).

cionci
18-11-2005, 08:47
(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...

cionci
18-11-2005, 09:29
Questa demo mi funziona perfettamente:
http://lwjgl.org/documentation_openal_03.php

cover
18-11-2005, 15:27
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:

cionci
18-11-2005, 17:44
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...

Jocchan
18-11-2005, 18:07
Io ho testato la build di ieri sera e l'audio da me va perfettamente.
Il problema è ancora il volume?

fek
18-11-2005, 18:33
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.

cionci
18-11-2005, 18:38
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...

Jocchan
18-11-2005, 18:46
Prova con il branch allora, così puoi svariare come vuoi ;)

cionci
18-11-2005, 18:52
Ok...allora la prossima settimana ci provo... :)

cionci
20-11-2005, 11:05
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

cionci
20-11-2005, 21:27
- 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...

Jocchan
20-11-2005, 21:32
Allora non è un problema, dato che il suono del diamante penso proprio che lo cambieremo ;)

fek
21-11-2005, 09:05
La classe SoundBank mi piace, la teniamo in caldo per una delle prossime storie quando Jocchano lo reputa opportuno.

cionci
21-11-2005, 09:10
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...

Jocchan
21-11-2005, 09:28
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.

cionci
21-11-2005, 09:33
Con la modifica che faccio adesso non dovrebbe dare più alcuna eccezione visto che viene utilizzato lo stesso oggetto Sound per tutte le gemme...

fek
21-11-2005, 09:41
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.

cionci
21-11-2005, 10:17
Jocchan: prova un po' la build per l'eccezione che ti si presentava dopo 32 gemme...

Jocchan
21-11-2005, 10:32
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:

Dj Zed
25-11-2005, 18:20
Edit

cionci
25-11-2005, 18:25
Ottimo, 2 messaggi e 2 spammate... Sei bannato...