So en libGDX

Article de referència: jocs libGDX en aquesta wiki,

Tenim dues opcions per tractar el so en libGDX:

Pots veure com utilitzar el sintetitzador de sons JSyn en libGDX en aquesta wiki.

, , , , , , ,


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();
    }
}