Install
$ agentstack add skill-kyu-n-gdx-claude-skills-libgdx-audio-lifecycle ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
libGDX Audio
Quick reference for libGDX audio APIs. Covers Sound, Music, platform gotchas, and common audio patterns.
Audio: Sound vs Music
| | Sound | Music | |---|---|---| | Loading | Fully into memory | Streamed from disk | | Use for | Short effects ( { // Called when music finishes playing });
bgm.dispose(); // MUST call when done
In non-trivial projects, prefer loading audio via `AssetManager` rather than raw `Gdx.audio.newMusic()`. AssetManager handles disposal via `unload()` and supports async loading.
**Gotchas:**
- **OnCompletionListener does NOT fire when looping is true.** If you need looping + completion callback, set looping=false and restart in the listener.
- libGDX **automatically pauses/resumes Music** on Android pause/resume. You do NOT need to manually pause music in `ApplicationListener.pause()`. Doing so is redundant.
- Only one OnCompletionListener per Music instance (last set wins).
- `setPosition()` is unreliable on some Android devices for MP3 — seeking uses bitrate estimation and can be off by several seconds. OGG seeking is more accurate, but OGG is unsupported on iOS. For cross-platform seeking accuracy, consider WAV (large files) or accept MP3 imprecision.
## Common Patterns
### Shared Music Across Screens
Store Music in the Game class, not in individual Screens. Dispose only in `Game.dispose()`.
```java
public class MyGame extends Game {
public Music bgm;
@Override
public void create() {
bgm = Gdx.audio.newMusic(Gdx.files.internal("theme.mp3")); // use MP3 for iOS compatibility
bgm.setLooping(true);
bgm.play();
setScreen(new MenuScreen(this));
}
@Override
public void dispose() {
bgm.dispose();
getScreen().dispose();
}
}
Platform Differences
| Behavior | Desktop (LWJGL3) | Android | iOS (RoboVM) | |---|---|---|---| | OGG support | Yes | Yes | No | | Music auto-pause | On minimize only | Yes | Yes | | Sound size limit | None | <1MB PCM | None | | MP3 seeking accuracy | Good | Unreliable | Good |
Common Mistakes
- Manually pausing Music in pause() — libGDX does this automatically. Redundant code confuses readers.
- Using Sound for long audio — Sound loads entirely into memory. Use Music for anything over a few seconds.
- Expecting OnCompletionListener with looping — It won't fire. Use looping=false + manual restart.
- Using OGG on iOS — Will fail silently or crash. Use WAV/MP3.
- Playing Sound in create() on Android — Audio system may not be ready. Defer to first
render()frame. - Relying on Music.setPosition() accuracy with MP3 on Android — Seeking can be off by seconds. Use OGG for accuracy (but not on iOS).
- Checking Sound.play() return value for failure detection — Behavior is backend-dependent. Don't rely on it.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: kyu-n
- Source: kyu-n/gdx-claude-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.