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ó

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
libgdx-so [2025/02/27 20:20]
enric_mieza_sanchez
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.
  
-{{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 #DamMp08Uf03 jocs games}}+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 =====+\\
  
-En la nostra aplicació 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> <code java>
-    float freq = 440.0f;        // en Hz 
-    float sampleRate = 44100;   // 44.1 kHz - qualitat CD 
-    AudioDevice audioDevice; 
  
-    public static float[] generateSineWave(float frequency, float sampleRate, int durationInSeconds) { +float freq = 440.0f;        // en Hz 
-        int numSamples = (int) (sampleRate * durationInSeconds); +float sampleRate = 44100;   // 44.1 kHz - qualitat CD 
-        float[] samples = new float[numSamples]; +float step = 0.1f;          // fragment minim de so 
-        for (int i = 0; i < numSamples; i++) { +boolean sona = true; 
-            float t = i / sampleRate; +boolean running = true; 
-            samples[i] = (float) Math.sin(2 * Math.PI * frequency * t);+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(); 
 +                } 
 +            }
         }         }
-        return samples; 
     }     }
 +}
  
-    Thread soundThread = new Thread(() -> +@Override 
-        float sampleRate = 44100; // 44.1 kHz +public void create() { 
-        float frequency = 440; // 440 Hz (La4) +    // ...elements GUI...
-        int durationInSeconds = 2; // 2 segons+
  
-        float[] sineWave generateSineWave(frequency, sampleRate, durationInSeconds);+    // 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(); 
 +}
  
-        audioDevice.writeSamples(sineWave, 0, sineWave.length); +@Override 
-    });+public void render() { 
 +    // ...activitat GUI...
  
-    @Override +    // al detectar un touch apaguem o engeguem 
-    public void create() { +    if( Gdx.input.justTouched() ) { 
-        audioDevice = Gdx.audio.newAudioDevice((intsampleRate, true); +        sona = ! sona;
-        soundThread.start()// el so es reproduirà en un thread a part+
     }     }
-     +
-    @Override + 
-    public void render() { +@Override 
-        // main loop: calcular i pintar amb normalitat...+public void dispose() { 
 +    // indiquem al thread de so que acabi 
 +    running = false; 
 + 
 +    // 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> </code>
  
libgdx-so.1740687659.txt.gz · Darrera modificació: 2025/02/27 20:20 per enric_mieza_sanchez