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 23:05]
enric_mieza_sanchez [Exemple amb AudioDevice]
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}}+{{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 #DamMp08Uf03 jocs games libGDX}}
  
 +\\
  
 ===== Exemple amb AudioDevice ===== ===== Exemple amb AudioDevice =====
Línia 15: Línia 20:
  
 <code java> <code java>
 +
 float freq = 440.0f;        // en Hz float freq = 440.0f;        // en Hz
 float sampleRate = 44100;   // 44.1 kHz - qualitat CD float sampleRate = 44100;   // 44.1 kHz - qualitat CD
Línia 21: Línia 27:
 boolean running = true; boolean running = true;
 AudioDevice audioDevice; AudioDevice audioDevice;
 +AudioThread audioThread;
  
 public static float[] generaSinusoide(float frequency, float sampleRate, float durationInSeconds) { public static float[] generaSinusoide(float frequency, float sampleRate, float durationInSeconds) {
Línia 32: Línia 39:
 } }
  
-Thread soundThread = new Thread(() -> +class AudioThread extends Thread 
-    float[] sineWave = generaSinusoide(freq, sampleRate, step);+    @Override 
 +    public void run() { 
 +        // creem sinusoide (un sol cop) 
 +        float[] sineWave = generaSinusoide(freq, sampleRate, step);
  
-    while(running) { +        while(running) { 
-        if( sona ) +            if( sona ) 
-            audioDevice.writeSamples(sineWave, 0, sineWave.length); +                audioDevice.writeSamples(sineWave, 0, sineWave.length); 
-        else { +            else { 
-            // dormim una estona (la mateixa que el fragment d'àudio) +                // dormim una estona (la mateixa que el fragment d'àudio) 
-            try { +                try { 
-                Thread.sleep((long) (step*1000) ); +                    Thread.sleep((long) (step*1000) ); 
-            } catch(Exception e) { +                } catch(Exception e) { 
-                e.printStackTrace();+                    e.printStackTrace(); 
 +                }
             }             }
         }         }
     }     }
-}); +}
  
 @Override @Override
 public void create() { public void create() {
-    batch = new SpriteBatch(); +    // ...elements GUI...
-    image = new Texture("libgdx.png");+
  
-    // Crear un dispositiu d'àudio i reproduir l'ona sinusoïdal+    // Crear un dispositiu d'àudio
     audioDevice = Gdx.audio.newAudioDevice((int) sampleRate, true);     audioDevice = Gdx.audio.newAudioDevice((int) sampleRate, true);
-    // posem en marxa el thread d'audio +     
-    soundThread.start();+    // creem i posem en marxa el thread d'audio 
 +    audioThread = new AudioThread(); 
 +    audioThread.start();
 } }
  
 @Override @Override
 public void render() { public void render() {
-    // GUI +    // ...activitat GUI...
-    ScreenUtils.clear(0.15f, 0.15f, 0.2f, 1f); +
-    batch.begin(); +
-    batch.draw(image, 140, 210); +
-    batch.end();+
  
     // al detectar un touch apaguem o engeguem     // al detectar un touch apaguem o engeguem
Línia 79: Línia 86:
     // indiquem al thread de so que acabi     // indiquem al thread de so que acabi
     running = false;     running = false;
 +
     // destruim objectes GUI     // destruim objectes GUI
     batch.dispose();     batch.dispose();
     image.dispose();     image.dispose();
-    // esperem a que acabi de sortir el thread d'audio+ 
 +    // IMPORTANT: esperem a que acabi de sortir el thread d'audio
     try {     try {
-        soundThread.join();+        audioThread.join();
     } catch(Exception e) {     } catch(Exception e) {
         e.printStackTrace();         e.printStackTrace();
libgdx-so.1740697526.txt.gz · Darrera modificació: 2025/02/27 23:05 per enric_mieza_sanchez