GWT backend for libGDX enabling Java game development for web browsers through JavaScript compilation
—
The GWT backend provides comprehensive audio support through both HTML5 Audio and Web Audio API implementations. It automatically selects the best available audio backend based on browser capabilities and provides fallback mechanisms for maximum compatibility.
public interface GwtAudio extends Audio {
// Inherited from Audio interface
Music newMusic(FileHandle file);
Sound newSound(FileHandle file);
AudioDevice newAudioDevice(int samplingRate, boolean isMono);
AudioRecorder newAudioRecorder(int samplingRate, boolean isMono);
}public class DefaultGwtAudio implements GwtAudio {
// Audio creation methods
public Music newMusic(FileHandle file);
public Sound newSound(FileHandle file);
// Audio device methods (limited browser support)
public AudioDevice newAudioDevice(int samplingRate, boolean isMono);
public AudioRecorder newAudioRecorder(int samplingRate, boolean isMono); // Not supported
// Constructor
public DefaultGwtAudio();
}public class MyGame implements ApplicationListener {
private Music backgroundMusic;
private Sound jumpSound;
@Override
public void create() {
// Load audio files
backgroundMusic = Gdx.audio.newMusic(Gdx.files.internal("music/background.ogg"));
jumpSound = Gdx.audio.newSound(Gdx.files.internal("sounds/jump.wav"));
// Configure background music
backgroundMusic.setLooping(true);
backgroundMusic.setVolume(0.7f);
backgroundMusic.play();
}
public void playJumpSound() {
jumpSound.play(1.0f); // Play at full volume
}
@Override
public void dispose() {
backgroundMusic.dispose();
jumpSound.dispose();
}
}// Supported audio formats for web deployment
// OGG Vorbis - Widely supported, good compression
Music oggMusic = Gdx.audio.newMusic(Gdx.files.internal("music/track.ogg"));
// MP3 - Universal support but larger files
Music mp3Music = Gdx.audio.newMusic(Gdx.files.internal("music/track.mp3"));
// WAV - Uncompressed, large files but immediate playback
Sound wavSound = Gdx.audio.newSound(Gdx.files.internal("sounds/effect.wav"));
// M4A/AAC - Good compression, supported in most browsers
Music m4aMusic = Gdx.audio.newMusic(Gdx.files.internal("music/track.m4a"));public class WebAudioGame implements ApplicationListener {
private Music music;
private boolean audioUnlocked = false;
@Override
public void create() {
music = Gdx.audio.newMusic(Gdx.files.internal("music/background.ogg"));
// Note: Many browsers require user interaction before audio can play
// The GWT backend handles this automatically, but you may need to
// wait for the first user input before starting audio
}
@Override
public void render() {
// Check if audio context is ready (Web Audio API)
if (!audioUnlocked && Gdx.input.justTouched()) {
// First user interaction - safe to start audio
music.play();
audioUnlocked = true;
}
}
}The GWT backend handles several browser-specific audio limitations:
The backend automatically chooses between:
// Modern browsers require user interaction before audio can play
// The GWT backend queues audio operations until user interaction occurs
public class AudioManager {
private Music music;
private boolean audioStarted = false;
public void init() {
music = Gdx.audio.newMusic(Gdx.files.internal("music/bgm.ogg"));
}
public void startAudioOnUserInput() {
if (!audioStarted && (Gdx.input.justTouched() || Gdx.input.isKeyJustPressed(Input.Keys.ANY_KEY))) {
music.play();
audioStarted = true;
}
}
}// Recommended audio setup for web deployment
public void setupOptimalAudio() {
// Use OGG for music (good compression, widely supported)
Music backgroundMusic = Gdx.audio.newMusic(Gdx.files.internal("music/bg.ogg"));
// Use short WAV files for sound effects (immediate playback)
Sound shortEffect = Gdx.audio.newSound(Gdx.files.internal("sfx/click.wav"));
// Keep sound files under 1MB for instant loading
// Preload all audio files during application loading
}// Audio files should be included in preloader for optimal performance
public class MyGameGwt extends GwtApplication {
@Override
public Preloader createPreloader() {
return new Preloader("assets.txt") {
// assets.txt should include all audio files:
// music/background.ogg
// sounds/jump.wav
// sounds/explosion.wav
};
}
}Install with Tessl CLI
npx tessl i tessl/maven-com-badlogicgames-gdx--gdx-backend-gwt