Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| 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: | ||
| Tenim dues opcions per tractar el so en libGDX: | Tenim dues opcions per tractar el so en libGDX: | ||
| - | * La fàcil: emprant els [[https:// | + | * La fàcil: emprant els [[https:// |
| - | * La complicada: emprant [[https:// | + | * La complicada: emprant [[https:// |
| - | {{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 # | + | Pots veure com utilitzar el sintetitzador de sons [[libGDX_JSYn|JSyn en libGDX]] en aquesta wiki. |
| + | {{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 # | ||
| - | ===== Exemple ===== | + | \\ |
| - | En la nostra aplicació libGDX: | + | ===== Exemple amb AudioDevice ===== |
| + | |||
| + | En aquest exemple generem una sinusoide (funció sinus, | ||
| + | |||
| + | Al tocar la pantalla ('' | ||
| <code java> | <code java> | ||
| - | float freq = 440.0f; | ||
| - | float sampleRate = 44100; | ||
| - | AudioDevice audioDevice; | ||
| - | | + | float freq = 440.0f; |
| - | int numSamples = (int) (sampleRate * durationInSeconds); | + | float sampleRate = 44100; |
| - | 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[] | ||
| + | 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, | ||
| + | |||
| + | while(running) { | ||
| + | if( sona ) | ||
| + | audioDevice.writeSamples(sineWave, | ||
| + | else { | ||
| + | // dormim una estona (la mateixa que el fragment d' | ||
| + | try { | ||
| + | Thread.sleep((long) (step*1000) ); | ||
| + | } catch(Exception e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | } | ||
| } | } | ||
| - | return samples; | ||
| } | } | ||
| + | } | ||
| - | Thread soundThread = new Thread(() -> { | + | @Override |
| - | float sampleRate = 44100; | + | public void create() { |
| - | float frequency = 440; // 440 Hz (La4) | + | // ...elements GUI... |
| - | int durationInSeconds = 2; // 2 segons | + | |
| - | float[] sineWave | + | // Crear un dispositiu d' |
| + | audioDevice | ||
| + | |||
| + | // creem i posem en marxa el thread d' | ||
| + | audioThread = new AudioThread(); | ||
| + | audioThread.start(); | ||
| + | } | ||
| - | audioDevice.writeSamples(sineWave, 0, sineWave.length); | + | @Override |
| - | | + | public void render() { |
| + | | ||
| - | | + | |
| - | | + | |
| - | audioDevice = Gdx.audio.newAudioDevice((int) sampleRate, true); | + | |
| - | | + | |
| } | } | ||
| - | | + | } |
| - | @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' | ||
| + | try { | ||
| + | audioThread.join(); | ||
| + | } catch(Exception e) { | ||
| + | e.printStackTrace(); | ||
| } | } | ||
| + | } | ||
| </ | </ | ||