CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-com-badlogicgames-gdx--gdx-backend-gwt

GWT backend for libGDX enabling Java game development for web browsers through JavaScript compilation

Pending
Overview
Eval results
Files

audio.mddocs/

Audio System

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.

Core Audio Interfaces

GwtAudio { .api }

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

DefaultGwtAudio { .api }

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

Usage Examples

Basic Audio Setup

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

Audio Format Support

// 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"));

Web-Specific Audio Considerations

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

Browser Audio Limitations

The GWT backend handles several browser-specific audio limitations:

Automatic Audio Backend Selection

The backend automatically chooses between:

  • Web Audio API: Modern browsers, better performance and features
  • HTML5 Audio: Fallback for older browsers or when Web Audio API is unavailable

User Interaction Requirements

// 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;
        }
    }
}

Audio Format Optimization

// 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 Preloading

// 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

docs

application.md

audio.md

files.md

graphics.md

index.md

input.md

networking.md

preloader.md

webaudio.md

widgets.md

tile.json