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 22:55]
enric_mieza_sanchez [Exemple]
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 sampleRate = 44100;   // 44.1 kHz - qualitat CD 
-    float step = 0.1f;          // fragment minim de so 
-    boolean sona = true;        // determina si es genera so o no 
-    boolean running = true;     // manté el thread de so actiu 
-    AudioDevice audioDevice; 
  
-    public static float[] generaSinusoide(float frequency, float sampleRate, float 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;
-        return samples; +
-    }+
  
-    public static float[] generaSilenci(float sampleRate, float durationInSeconds) { +public static float[] generaSinusoide(float frequency, float sampleRate, float durationInSeconds) { 
-        int numSamples = (int) (sampleRate * durationInSeconds); +    int numSamples = (int) (sampleRate * durationInSeconds); 
-        float[] samples = new float[numSamples]; +    float[] samples = new float[numSamples]; 
-        for (int i = 0; i < numSamples; i++) { +    for (int i = 0; i < numSamples; i++) { 
-            samples[i] = (float) 0.0f; +        float t = i / sampleRate; 
-        } +        samples[i] = (float) Math.sin(2 * Math.PI * frequency * t);
-        return samples;+
     }     }
 +    return samples;
 +}
  
-    Thread soundThread = new Thread(() -> {+class AudioThread extends Thread 
 +    @Override 
 +    public void run() { 
 +        // creem sinusoide (un sol cop)
         float[] sineWave = generaSinusoide(freq, sampleRate, step);         float[] sineWave = generaSinusoide(freq, sampleRate, step);
-        float[] silenci = generaSilenci(sampleRate, step); 
  
         while(running) {         while(running) {
-            if( sona ) +            if( sona )
-                // enviem sinusoide al device+
                 audioDevice.writeSamples(sineWave, 0, sineWave.length);                 audioDevice.writeSamples(sineWave, 0, sineWave.length);
-            } 
             else {             else {
-                // enviem silenci (zerosal device +                // dormim una estona (la mateixa que el fragment d'àudio
-                audioDevice.writeSamples(silenci, 0, silenci.length);+                try { 
 +                    Thread.sleep((long) (step*1000) ); 
 +                } catch(Exception e) { 
 +                    e.printStackTrace(); 
 +                }
             }             }
         }         }
-    });+    } 
 +}
  
-    @Override +@Override 
-    public void create() { +public void create() { 
-        // ...+    // ...elements GUI...
  
-        // Crear un dispositiu d'àudio +    // 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() { 
-        // ...activitat GUI... +    // ...activitat GUI...
-         +
-        // al detectar un touch apaguem o activem el so +
-        if( Gdx.input.justTouched() ) { +
-            sona = ! sona; +
-        } +
-    }+
  
-    @Override +    // al detectar un touch apaguem o engeguem 
-    public void dispose() { +    ifGdx.input.justTouched() ) { 
-        // indiquem al thread de so que acabi +        sona = ! sona;
-        running = false; +
-         +
-        // destruim objectes GUI +
-        batch.dispose(); +
-        image.dispose(); +
-         +
-        // IMPORTANT: esperem a que acabi de sortir el thread d'audio +
-        try { +
-            soundThread.join()+
-        } catch(Exception e) { +
-            e.printStackTrace(); +
-        }+
     }     }
 } }
  
 +@Override
 +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.1740696932.txt.gz · Darrera modificació: 2025/02/27 22:55 per enric_mieza_sanchez