PDA

View Full Version : Alsa: Low/High-Pass Filter + upmixing + samplerate converter


darkbasic
10-09-2007, 00:08
Volevo comprarmi una bellissima M-Audio Revolution 5.1, invece eccomi di nuovo a bestemmiare con alsa e la mia Creative Sound Blaster Live! 5.1 :D

Inizio col postarvi il mio .asoundrc e spiegarvi cosa fa, poi passo ai problemi veri e propri :P

defaults.pcm.rate_converter "samplerate_medium"
pcm.!default {
type plug
slave {
rate 48000
pcm 20to21
}
}

pcm.20to21 {
type plug
slave.pcm lowpass_21to21
slave.channels 3
ttable {
0.0 1 # left channel
1.1 1 # right channel
0.2 0.5 # mix left and right ...
1.2 0.5 # ... channel for subwoofer
}
}

pcm.lowpass_21to21 {
type ladspa
slave.pcm upmix_21to51
path "/usr/lib/ladspa"
channels 3
plugins {
0 {
id 1890 # Glame Highpass Filter (1890/highpass_iir)
policy none
input.bindings.0 "Input";
output.bindings.0 "Output";
input {
controls [ 200 0 ]
}
}
1 {
id 1890 # Glame Highpass Filter (1890/highpass_iir)
policy none
input.bindings.1 "Input";
output.bindings.1 "Output";
input {
controls [ 200 0 ]
}
}
2 {
id 1672 # 4 Pole Low-Pass Filter with Resonance (FCRCIA) (1672/lp4pole_fcrcia_oa)
policy none
input.bindings.2 "Input";
output.bindings.2 "Output";
input {
controls [ 350 0 ]
}
}
}
}

pcm.upmix_21to51 {
type plug
slave.pcm surround51
slave.channels 6
ttable {
0.0 1 # front left
1.1 1 # front right
0.2 1 # rear left
1.3 1 # rear right
0.4 0.5 # center
1.4 0.5 # center
2.5 1 # subwoofer
}
}

Dal momento che la mia magnifica :D emu10k1 supporta solo output a 48Khz ed effettua un resampling a dir poco penoso, preferisco appoggiarmi alla libreria libsamplerate (http://www.mega-nerd.com/SRC/) per il resampling.
Successivamente l'output viene inviato a pcm.20to21, che unisce il canale destro (1) e sinistro (0) in un unico canale (2) per il subwoofer.
L'output viene a sua volta mandato a pcm.lowpass_21to21 che si occupa di tagliare le frequenze più basse ai canali sinistro e destro e a tagliare quelle più alte al canale destinato al subwoofer.
pcm.upmix_21to51 assegna i canali sinistro e destro agli speaker anteriori/posteriori sinistri e destri, allo speaker centrale spetta un mix dei due e al subwoofer il relativo canale.


aplay non ha particolari problemi a riprodurre i file e l'acrocchio sembrerebbe fare il suo dovere (alle casse arriva il range di frequenze corretto e il funzionamento del resampler è confermato da un certo aumento dell'utilizzo della cpu qualora utilizzassi saplerate_best anzichè samplerate_medium), ma in alcuni brani si sentono strani crepitii in alcuni punti! (ad essere sincero l'unico file in cui ho notato la cosa è stato Startup1_4.wav di Borealis)
C'è qualcosa che non va..
Inoltre il player di sox, play, produce orrendi stridii qualsiasi file provi a riprodurre. Cosa che non avviene se non effettuo il resampling e passo direttamente a pcm.20to21. Ancora più strano..
Amarok poi (xine backend) non vuole saperne di funzionare con il Low/High-Pass Filter, nemmeno saltando il resampling.

Per la cronaca, vi posto l'.asoundrc che utilizzo di solito e che non da problemi con nessun player:
defaults.pcm.rate_converter "samplerate_medium"

pcm.!default {
type route
slave.pcm resample
slave.channels 6
ttable.0.0 1
ttable.1.1 1
ttable.0.2 1
ttable.1.3 1
ttable.0.4 0.5
ttable.1.4 0.5
ttable.0.5 0.5
ttable.1.5 0.5
}

pcm.resample {
type plug
slave {
pcm surround51
rate 48000
channels 6
}
}
Fa le stesse cose dell'altro eccetto l'High/Low-Pass Filter (fa solo upmixing e resampling).

Qualcuno sa a cosa sono dovuti questi problemi oppure come posso risolverli?
Ciao!

ilsensine
10-09-2007, 11:56
La mia ignoranza con quelle configurazioni è abbastanza elevata (e non ti nego la mia invidia per saper utilizzare alsa in quella maniera), ma...non potrebbe essere un semplice problema di clipping durante il resampling/filtraggio? Voglio dire, hai fatto caso se quel file problematico ha un volume "particolarmente elevato" rispetto agli altri file che funzionano?

darkbasic
11-09-2007, 00:06
non potrebbe essere un semplice problema di clipping durante il resampling/filtraggio?
Il disturbo che sento sembrerebbe proprio clipping, ma dal momento che udial (http://www.hydrogenaudio.org/forums/index.php?showtopic=9772) viene riprodotto in maniera egregia non so più cosa pensare..
Ciò non toglie che quel file sia parecchio rognoso, non a livello di volume ma bensì di frequenze, ad esempio il server sonoro di kde non è mai riuscito a riprodurlo ad una qualità decente, e non solo con la mia scheda (per questo ora uso aplay per i suoni di sistema).
Eliminando il filtro passa-alto il file viene riprodotto magnificamente, quindi il colpevole è sicuramente lui..
Il mistero si infittisce..


Ho allegato il file in questione: Startup1_4.wav.tar.bz2 (http://www.quellicheilpc.com/darkbasic/Startup1_4.wav.tar.bz2) 2.5 MB

darkbasic
11-09-2007, 13:12
0 {
id 1890 # Glame Highpass Filter (1890/highpass_iir)
policy none
input.bindings.0 "Input";
output.bindings.0 "Output";
input {
controls [ 35 0 ]
}
}
1 {
id 1890 # Glame Highpass Filter (1890/highpass_iir)
policy none
input.bindings.1 "Input";
output.bindings.1 "Output";
input {
controls [ 33 0 ]
}
}
Questi sono i settaggi-limite con i quali il filtro passa alto non produce clipping (sì, il canale destro è più rognosetto del sinistro).
Inoltre, googlando ho trovato questo (http://www.soundonsound.com/sos/dec05/articles/qa1205_3.htm?print=yes).
Magari scrivendo agli sviluppatori di swh-plugins riescono a risolvere, oppure è un problema intrinseco di ogni filtro passa-alto?

ilsensine
11-09-2007, 14:11
Non ho capito dove sta il problema...prova a mettere un filtro passa-basso con frequenza di taglio elevata (~13000 Hz) prima o dopo il filtro passa-alto.

darkbasic
11-09-2007, 15:20
Nessun problema con il 4 Pole Low-Pass Filter with Resonance (FCRCIA) (1672/lp4pole_fcrcia_oa), se invece utilizzo il low pass filter di swh-plugins -Glame Lowpass Filter (1891/lowpass_iir)- e taglio a frequenze molto alte ho di nuovo problemi di clipping. Se taglio a frequenze *esageratamente* alte nessun problema.

Edit: avevo letto male il post precedente, ora faccio una prova con entrambi i filtri (passa alto e passa basso) attivi sullo stesso canale.

ilsensine
11-09-2007, 15:21
Alzo le mani, qua occorre mettere mano all'implementazione per capirci qualcosa.

darkbasic
11-09-2007, 15:34
Edit: avevo letto male il post precedente, ora faccio una prova con entrambi i filtri (passa alto e passa basso) attivi sullo stesso canale.
Ho fatto anche questa prova: finchè il 4 Pole Low-Pass Filter with Resonance (FCRCIA) (1672/lp4pole_fcrcia_oa) taglia le frequenze più alte non c'è nessun problema, se alzo a dismisura la soglia si sente di nuovo il fastidioso clipping.
Mi sa che l'unica strada percorribile è rimasta quella di cercare un altro plugin o contattare gli sviluppatori affinchè rimettano mano all'implementazione :(

ilsensine
11-09-2007, 15:36
Ho fatto anche questa prova: finchè il 4 Pole Low-Pass Filter with Resonance (FCRCIA) (1672/lp4pole_fcrcia_oa) taglia le frequenze più alte non c'è nessun problema, se alzo a dismisura la soglia si sente di nuovo il fastidioso clipping.
Potrebbe anche esserci un problema di aliasing, allora. Dovresti provare a tagliare a frequenze nell'ordine della frequenza di campionamento (anzi poco sotto).

darkbasic
11-09-2007, 16:02
Dovresti provare a tagliare a frequenze nell'ordine della frequenza di campionamento (anzi poco sotto).
Non dovrebbero essere attorno alla metà della frequenza di campionamento, a circa 20Khz?
Comunque la vedo dura che sia un problema di aliasing, perché senza nessun filtro il file si sente benissimo! E poi come si spiegherebbe che tagliando a frequenze molto alte con lp4pole_fcrcia_oa il risultato è perfetto mentre con lowpass_iir si sentono fastidiosi crepitii?

Edit: se hai voglia di dare un'occhiata all'implementazione questi sono i sorgenti
highpass_iir_1890.tar.gz (http://www.quellicheilpc.com/darkbasic/highpass_iir_1890.tar.gz) 3 KB
lowpass_iir_1891.tar.gz (http://www.quellicheilpc.com/darkbasic/lowpass_iir_1891.tar.gz) 3 KB

ilsensine
11-09-2007, 16:16
Non dovrebbero essere attorno alla metà della frequenza di campionamento, a circa 20Khz?
...sì :muro:
(intendevo comunque la frequenza di campionamento originale)

Comunque la vedo dura che sia un problema di aliasing, perché senza nessun filtro il file si sente benissimo!
Immagino che le frequenze alias compaiano durante la manipolazione del segnale...

Edit: se hai voglia di dare un'occhiata all'implementazione
Assolutamente no, non avevo elaborazione numerica nel piano di studi :D

darkbasic
11-09-2007, 16:32
(intendevo comunque la frequenza di campionamento originale)
E io con 20 Khz intendevo la frequenza a cui tagliare, non quella di campionamento :D (che è il classico 44100 Hz)


Immagino che le frequenze alias compaiano durante la manipolazione del segnale...
Così sembra, quel che è certo è che quel plugin non si limita a fare quello che dovrebbe :D


Assolutamente no, non avevo elaborazione numerica nel piano di studi :D
Azz.. vabbè, ci ho provato :P

darkbasic
12-12-2007, 11:21
Ho riprovato a rimettere in piedi tutto l'accrocchio con la nuova versione di alsa 1.0.15. Funzionaaaaaaaaaaaaaaaaaaaaaaaaaa!!!! :D
Non si sentono più i gracchi con aplay, play (sox) funziona perfettamente, totem (gstreamer) idem. L'unico che continua a _non_ funzionare è il maledetto xine (ed mplayer, ma quello funziona male anche solo attivando il surround su .asoundrc :asd: ).
Devo per forza ricompilarmi amarok con engine gstreamer? :cry:
Nessun problema nemmeno con audacious (xmms).
Edit: anche l'utilizzo di cpu è molto basso (con samplerate_best!!!) perché sono riuscito ad effettuare il resampling prima dell'upmixing, ovvero solo su due canali anziché 6!
Backtrace di amarok:
======== DEBUG INFORMATION =======
Version: 1.4.7
Engine: xine-engine
Build date: Nov 24 2007
CC version: 4.2.3 20071014 (prerelease) (Debian 4.2.2-3)
KDElibs: 3.5.8
Qt: 3.3.7
TagLib: 1.4.0
CPU count: 2
NDEBUG: true
==== file `which amarokapp` =======
/usr/bin/amarokapp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.8, dynamically linked (uses shared libs), stripped


==== (gdb) bt =====================
Using host libthread_db library "/lib/libthread_db.so.1".
[Thread debugging using libthread_db enabled]
[New Thread 0x2b9046d0cec0 (LWP 8595)]
[New Thread 0x42808950 (LWP 8607)]
[New Thread 0x42007950 (LWP 8606)]
[New Thread 0x41806950 (LWP 8605)]
[New Thread 0x41005950 (LWP 8604)]
[New Thread 0x40804950 (LWP 8603)]
0x00002b9041f7de2d in pthread_cond_timedwait@@GLIBC_2.3.2 ()
from /lib/libpthread.so.0
#0 0x00002b9041f7de2d in pthread_cond_timedwait@@GLIBC_2.3.2 ()
from /lib/libpthread.so.0
#1 0x00002aaaadbc172a in ?? () from /usr/lib/libxine.so.1
#2 0x00002aaaadbcc63f in ?? () from /usr/lib/libxine.so.1
#3 0x00002aaaadbca28d in _x_demux_flush_engine () from /usr/lib/libxine.so.1
#4 0x00002aaab6fb34e2 in ?? ()
from /usr/lib/xine/plugins/1.1.8/xineplug_dmx_audio.so
#5 0x00002aaaadbae4cb in xine_play () from /usr/lib/libxine.so.1
#6 0x00002aaaad962e6e in XineEngine::play ()
from /usr/lib/kde3/libamarok_xine-engine.so
#7 0x00002b903a1898a0 in EngineController::play ()
from /usr/lib/libamarok.so.0
#8 0x00002b903a2286ac in Playlist::activate () from /usr/lib/libamarok.so.0
#9 0x00002b903a28be62 in UrlLoader::customEvent ()
from /usr/lib/libamarok.so.0
#10 0x00002b903e0b9263 in QObject::event () from /usr/lib/libqt-mt.so.3
#11 0x00002b903e0533aa in QApplication::internalNotify ()
from /usr/lib/libqt-mt.so.3
#12 0x00002b903e055158 in QApplication::notify () from /usr/lib/libqt-mt.so.3
#13 0x00002b903b6d958d in KApplication::notify ()
from /usr/lib/libkdecore.so.4
#14 0x00002b903dfe4abe in QApplication::sendEvent ()
from /usr/lib/libqt-mt.so.3
#15 0x00002b903e0543c1 in QApplication::sendPostedEvents ()
from /usr/lib/libqt-mt.so.3
#16 0x00002b903e0544b9 in QApplication::sendPostedEvents ()
from /usr/lib/libqt-mt.so.3
#17 0x00002b903dff81b1 in QEventLoop::processEvents ()
from /usr/lib/libqt-mt.so.3
#18 0x00002b903e06d673 in QEventLoop::enterLoop () from /usr/lib/libqt-mt.so.3
#19 0x00002b903e06d35f in QEventLoop::exec () from /usr/lib/libqt-mt.so.3
#20 0x00002b903e054e8c in QApplication::exec () from /usr/lib/libqt-mt.so.3
#21 0x0000000000404b20 in ?? ()
#22 0x00002b903d93b1c4 in __libc_start_main () from /lib/libc.so.6
#23 0x00000000004044a9 in ?? ()
#24 0x00007fff70e33858 in ?? ()
#25 0x0000000000000000 in ?? ()
#0 0x00002b9041f7de2d in pthread_cond_timedwait@@GLIBC_2.3.2 ()
from /lib/libpthread.so.0
No symbol table info available.
#1 0x00002aaaadbc172a in ?? () from /usr/lib/libxine.so.1
No symbol table info available.
#2 0x00002aaaadbcc63f in ?? () from /usr/lib/libxine.so.1
No symbol table info available.
#3 0x00002aaaadbca28d in _x_demux_flush_engine () from /usr/lib/libxine.so.1
No symbol table info available.
#4 0x00002aaab6fb34e2 in ?? ()
from /usr/lib/xine/plugins/1.1.8/xineplug_dmx_audio.so
No symbol table info available.
#5 0x00002aaaadbae4cb in xine_play () from /usr/lib/libxine.so.1
No symbol table info available.
#6 0x00002aaaad962e6e in XineEngine::play ()
from /usr/lib/kde3/libamarok_xine-engine.so
No symbol table info available.
#7 0x00002b903a1898a0 in EngineController::play ()
from /usr/lib/libamarok.so.0
No symbol table info available.
#8 0x00002b903a2286ac in Playlist::activate () from /usr/lib/libamarok.so.0
No symbol table info available.
#9 0x00002b903a28be62 in UrlLoader::customEvent ()
from /usr/lib/libamarok.so.0
No symbol table info available.
#10 0x00002b903e0b9263 in QObject::event () from /usr/lib/libqt-mt.so.3
No symbol table info available.
#11 0x00002b903e0533aa in QApplication::internalNotify ()
from /usr/lib/libqt-mt.so.3
No symbol table info available.
#12 0x00002b903e055158 in QApplication::notify () from /usr/lib/libqt-mt.so.3
No symbol table info available.
#13 0x00002b903b6d958d in KApplication::notify ()
from /usr/lib/libkdecore.so.4
No symbol table info available.
#14 0x00002b903dfe4abe in QApplication::sendEvent ()
from /usr/lib/libqt-mt.so.3
No symbol table info available.
#15 0x00002b903e0543c1 in QApplication::sendPostedEvents ()
from /usr/lib/libqt-mt.so.3
No symbol table info available.
#16 0x00002b903e0544b9 in QApplication::sendPostedEvents ()
from /usr/lib/libqt-mt.so.3
No symbol table info available.
#17 0x00002b903dff81b1 in QEventLoop::processEvents ()
from /usr/lib/libqt-mt.so.3
No symbol table info available.
#18 0x00002b903e06d673 in QEventLoop::enterLoop () from /usr/lib/libqt-mt.so.3
No symbol table info available.
#19 0x00002b903e06d35f in QEventLoop::exec () from /usr/lib/libqt-mt.so.3
No symbol table info available.
#20 0x00002b903e054e8c in QApplication::exec () from /usr/lib/libqt-mt.so.3
No symbol table info available.
#21 0x0000000000404b20 in ?? ()
No symbol table info available.
#22 0x00002b903d93b1c4 in __libc_start_main () from /lib/libc.so.6
No symbol table info available.
#23 0x00000000004044a9 in ?? ()
No symbol table info available.
#24 0x00007fff70e33858 in ?? ()
No symbol table info available.
#25 0x0000000000000000 in ?? ()
No symbol table info available.
==== (gdb) thread apply all bt ====
Thread 6 (Thread 0x40804950 (LWP 8603)):
#0 0x00002b9041f7de2d in pthread_cond_timedwait@@GLIBC_2.3.2 ()
from /lib/libpthread.so.0
#1 0x00002aaaadbb1cd5 in ?? () from /usr/lib/libxine.so.1
#2 0x00002b9041f793f7 in start_thread () from /lib/libpthread.so.0
#3 0x00002b903d9f494d in clone () from /lib/libc.so.6
#4 0x0000000000000000 in ?? ()
Thread 5 (Thread 0x41005950 (LWP 8604)):
#0 0x00002b903d9ebac6 in poll () from /lib/libc.so.6
#1 0x00002aaab6070ac0 in ?? ()
from /usr/lib/xine/plugins/1.1.8/xineplug_ao_out_alsa.so
#2 0x00002b9041f793f7 in start_thread () from /lib/libpthread.so.0
#3 0x00002b903d9f494d in clone () from /lib/libc.so.6
#4 0x0000000000000000 in ?? ()
Thread 4 (Thread 0x41806950 (LWP 8605)):
#0 0x00002b903d9ba4df in waitpid () from /lib/libc.so.6
#1 0x0000000000405dd0 in Amarok::Crash::crashHandler ()
#2 <signal handler called>
#3 0x00002aaabc45a1e0 in ?? () from /usr/lib/ladspa/highpass_iir_1890.so
#4 0x00002aaaaf244449 in ?? () from /usr/lib/libasound.so.2
#5 0x00002aaaaf22583b in ?? () from /usr/lib/libasound.so.2
#6 0x00002aaab606f5f1 in ?? ()
from /usr/lib/xine/plugins/1.1.8/xineplug_ao_out_alsa.so
#7 0x00002aaaadbc1204 in ?? () from /usr/lib/libxine.so.1
#8 0x00002aaaadbc330f in ?? () from /usr/lib/libxine.so.1
#9 0x00002b9041f793f7 in start_thread () from /lib/libpthread.so.0
#10 0x00002b903d9f494d in clone () from /lib/libc.so.6
#11 0x0000000000000000 in ?? ()
Thread 3 (Thread 0x42007950 (LWP 8606)):
#0 0x00002b9041f7dba9 in pthread_cond_wait@@GLIBC_2.3.2 ()
from /lib/libpthread.so.0
#1 0x00002aaaadbb5182 in ?? () from /usr/lib/libxine.so.1
#2 0x00002aaaadbbbc2e in ?? () from /usr/lib/libxine.so.1
#3 0x00002b9041f793f7 in start_thread () from /lib/libpthread.so.0
#4 0x00002b903d9f494d in clone () from /lib/libc.so.6
#5 0x0000000000000000 in ?? ()
Thread 2 (Thread 0x42808950 (LWP 8607)):
#0 0x00002b9041f7dba9 in pthread_cond_wait@@GLIBC_2.3.2 ()
from /lib/libpthread.so.0
#1 0x00002aaaadbc482b in xine_event_wait () from /usr/lib/libxine.so.1
#2 0x00002aaaadbc48a9 in ?? () from /usr/lib/libxine.so.1
#3 0x00002b9041f793f7 in start_thread () from /lib/libpthread.so.0
#4 0x00002b903d9f494d in clone () from /lib/libc.so.6
#5 0x0000000000000000 in ?? ()
Thread 1 (Thread 0x2b9046d0cec0 (LWP 8595)):
#0 0x00002b9041f7de2d in pthread_cond_timedwait@@GLIBC_2.3.2 ()
from /lib/libpthread.so.0
#1 0x00002aaaadbc172a in ?? () from /usr/lib/libxine.so.1
#2 0x00002aaaadbcc63f in ?? () from /usr/lib/libxine.so.1
#3 0x00002aaaadbca28d in _x_demux_flush_engine () from /usr/lib/libxine.so.1
#4 0x00002aaab6fb34e2 in ?? ()
from /usr/lib/xine/plugins/1.1.8/xineplug_dmx_audio.so
#5 0x00002aaaadbae4cb in xine_play () from /usr/lib/libxine.so.1
#6 0x00002aaaad962e6e in XineEngine::play ()
from /usr/lib/kde3/libamarok_xine-engine.so
#7 0x00002b903a1898a0 in EngineController::play ()
from /usr/lib/libamarok.so.0
#8 0x00002b903a2286ac in Playlist::activate () from /usr/lib/libamarok.so.0
#9 0x00002b903a28be62 in UrlLoader::customEvent ()
from /usr/lib/libamarok.so.0
#10 0x00002b903e0b9263 in QObject::event () from /usr/lib/libqt-mt.so.3
#11 0x00002b903e0533aa in QApplication::internalNotify ()
from /usr/lib/libqt-mt.so.3
#12 0x00002b903e055158 in QApplication::notify () from /usr/lib/libqt-mt.so.3
#13 0x00002b903b6d958d in KApplication::notify ()
from /usr/lib/libkdecore.so.4
#14 0x00002b903dfe4abe in QApplication::sendEvent ()
from /usr/lib/libqt-mt.so.3
#15 0x00002b903e0543c1 in QApplication::sendPostedEvents ()
from /usr/lib/libqt-mt.so.3
#16 0x00002b903e0544b9 in QApplication::sendPostedEvents ()
from /usr/lib/libqt-mt.so.3
#17 0x00002b903dff81b1 in QEventLoop::processEvents ()
from /usr/lib/libqt-mt.so.3
#18 0x00002b903e06d673 in QEventLoop::enterLoop () from /usr/lib/libqt-mt.so.3
#19 0x00002b903e06d35f in QEventLoop::exec () from /usr/lib/libqt-mt.so.3
#20 0x00002b903e054e8c in QApplication::exec () from /usr/lib/libqt-mt.so.3
#21 0x0000000000404b20 in ?? ()
#22 0x00002b903d93b1c4 in __libc_start_main () from /lib/libc.so.6
#23 0x00000000004044a9 in ?? ()
#24 0x00007fff70e33858 in ?? ()
#25 0x0000000000000000 in ?? ()
#0 0x00002b9041f7de2d in pthread_cond_timedwait@@GLIBC_2.3.2 ()
from /lib/libpthread.so.0


==== kdBacktrace() ================









Ri-edit: non azzardetevi ad usare il fast forward o a spostarvi un determinato punto del brano perché sennò alsa si offende e crasha tutto :doh:

darkbasic
12-12-2007, 13:54
Cavolo possibile che amarok 1.4 svn ancora non supporti gstreamer 0.10? :cry:

Dane
12-12-2007, 19:58
ma hai provato ad usare il server jack?

darkbasic
12-12-2007, 20:10
Jack comunica direttamente con hw:0 e se ne infischia di .asoundrc purtroppo.

Hire
12-12-2007, 20:43
Arts? :mbe:

darkbasic
12-12-2007, 20:58
Per carità :eekk: :ops:

Hire
12-12-2007, 21:00
Ti capisco :asd:

Manda una email ai dev di xine e chiedi a loro :O