Article de referència: jocs libGDX en aquesta wiki,
Tenim dues opcions per tractar el so en libGDX:
audio.play()
.Thread
a part per anar generant àudio.Pots veure com utilitzar el sintetitzador de sons JSyn en libGDX en aquesta wiki.
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(); } }