bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


libgdx-so

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Següent revisió
Revisió prèvia
libgdx-so [2025/02/27 20:04]
enric_mieza_sanchez creat
libgdx-so [2025/03/02 23:26] (actual)
enric_mieza_sanchez [So en libGDX]
Línia 1: Línia 1:
 ====== So en libGDX ====== ====== So en libGDX ======
 +
 +Article de referència: [[jocs libGDX]] en aquesta wiki,
  
 Tenim dues opcions per tractar el so en libGDX: Tenim dues opcions per tractar el so en libGDX:
-  * La fàcil: emprant els [[https://libgdx.com/wiki/audio/sound-effects|objectes Sound]] (per efectes curts) o [[https://libgdx.com/wiki/audio/streaming-music||Music]] (per sons més llargs). Això carregarà els sons al //driver// d'àudio i els reproduirà sense major intervenció del programador que un simple ''audio.play()''+  * La fàcil: emprant els [[https://libgdx.com/wiki/audio/sound-effects|objectes Sound]] (per efectes curts) o [[https://libgdx.com/wiki/audio/streaming-music|Music]] (per sons més llargs). Això carregarà els sons al //driver// d'àudio i els reproduirà sense major intervenció del programador que un simple ''audio.play()''
-  * La complicada: emprant [[https://libgdx.com/wiki/audio/playing-pcm-audio|AudioDevice]] podem generar els nostres propis sons en format PCM (creant matemàticament les sinusoides o el què creguem convenient). el problema principal és que l'accés a escriure les mostres bloquejarà el //thread// i, per tant, també el GUI i tot el joc. Caldrà que el programador gestioni un ''Thread'' a part per anar generant àudio.+  * La complicada: emprant [[https://libgdx.com/wiki/audio/playing-pcm-audio|AudioDevice]] podem generar els nostres propis sons en format PCM (creant matemàticament les sinusoides o el què creguem convenient). El problema principal és que l'accés a escriure les mostres bloquejarà el //thread// i, per tant, també el GUI i tot el programa. Caldrà que el programador gestioni un ''Thread'' a part per anar generant àudio. 
 + 
 +Pots veure com utilitzar el sintetitzador de sons [[libGDX_JSYn|JSyn en libGDX]] en aquesta wiki. 
 + 
 +{{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 #DamMp08Uf03 jocs games libGDX}} 
 + 
 +\\ 
 + 
 +===== Exemple amb AudioDevice ===== 
 + 
 +En aquest exemple generem una sinusoide (funció sinus, la ona més fonamental que hi ha) i l'enviem al //thread// d'àudio, el qual la va reproduint en fragments. 
 + 
 +Al tocar la pantalla (''Gdx.input.justTouched()'') engeguem o apaguem el so. Si l'apaguem, caldrà seguir enviant dades de silenci a la sortida d'àudio, sense sortir del //thread//
 + 
 +<code java> 
 + 
 +float freq = 440.0f;        // en Hz 
 +float sampleRate = 44100;   // 44.1 kHz - qualitat CD 
 +float step = 0.1f;          // fragment minim de so 
 +boolean sona = true; 
 +boolean running = true; 
 +AudioDevice audioDevice; 
 +AudioThread audioThread; 
 + 
 +public static float[] generaSinusoide(float frequency, float sampleRate, float durationInSeconds) { 
 +    int numSamples = (int) (sampleRate * durationInSeconds); 
 +    float[] samples = new float[numSamples]; 
 +    for (int i = 0; i < numSamples; i++) { 
 +        float t = i / sampleRate; 
 +        samples[i] = (float) Math.sin(2 * Math.PI * frequency * t); 
 +    } 
 +    return samples; 
 +
 + 
 +class AudioThread extends Thread { 
 +    @Override 
 +    public void run() { 
 +        // creem sinusoide (un sol cop) 
 +        float[] sineWave = generaSinusoide(freq, sampleRate, step); 
 + 
 +        while(running) { 
 +            if( sona ) 
 +                audioDevice.writeSamples(sineWave, 0, sineWave.length); 
 +            else { 
 +                // dormim una estona (la mateixa que el fragment d'àudio) 
 +                try { 
 +                    Thread.sleep((long) (step*1000) ); 
 +                } catch(Exception e) { 
 +                    e.printStackTrace(); 
 +                } 
 +            } 
 +        } 
 +    } 
 +
 + 
 +@Override 
 +public void create() { 
 +    // ...elements GUI... 
 + 
 +    // Crear un dispositiu d'àudio 
 +    audioDevice = Gdx.audio.newAudioDevice((int) sampleRate, true); 
 +     
 +    // creem i posem en marxa el thread d'audio 
 +    audioThread = new AudioThread(); 
 +    audioThread.start(); 
 +
 + 
 +@Override 
 +public void render() { 
 +    // ...activitat GUI... 
 + 
 +    // al detectar un touch apaguem o engeguem 
 +    if( Gdx.input.justTouched() ) { 
 +        sona = ! sona; 
 +    } 
 +
 + 
 +@Override 
 +public void dispose() { 
 +    // indiquem al thread de so que acabi 
 +    running = false;
  
-{{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 #DamMp08Uf03 jocs games}}+    // destruim objectes GUI 
 +    batch.dispose(); 
 +    image.dispose();
  
 +    // IMPORTANT: esperem a que acabi de sortir el thread d'audio
 +    try {
 +        audioThread.join();
 +    } catch(Exception e) {
 +        e.printStackTrace();
 +    }
 +}
 +</code>
  
libgdx-so.1740686681.txt.gz · Darrera modificació: 2025/02/27 20:04 per enric_mieza_sanchez