====== So en libGDX ====== Article de referència: [[jocs libGDX]] en aquesta wiki, 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 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//. 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; // 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(); } }