Listen to Events
This guide covers how to subscribe to playback lifecycle events and remote control events.
Event categories
Section titled “Event categories”| Category | Namespace | Description |
|---|---|---|
| Player events | audioPlayer | Playback state, track changes, progress, errors |
| Remote events | mediaSession | Lock screen, Bluetooth, headphone controls |
Registering listeners
Section titled “Registering listeners”Using shortcut helpers (recommended)
Section titled “Using shortcut helpers (recommended)”import { onPlaybackStateChanged, onPlaybackEnded, onPlaybackProgress, onPlaybackError,} from '@ddgutierrezc/legato-capacitor';
// State changesconst unsubState = onPlaybackStateChanged(({ state }) => { console.log('State:', state);});
// Progress updatesconst unsubProgress = onPlaybackProgress(({ position, duration, bufferedPosition }) => { console.log(`Position: ${position.toFixed(1)}s / ${duration}s`);});
// Playback endedconst unsubEnded = onPlaybackEnded(({ snapshot }) => { console.log('Playback ended. Final state:', snapshot.state);});
// Errorsconst unsubError = onPlaybackError(({ error }) => { console.error('Error:', error.code, error.message);});
// Clean upawait unsubState.remove();await unsubProgress.remove();await unsubEnded.remove();await unsubError.remove();Using direct listener APIs
Section titled “Using direct listener APIs”import { audioPlayer, mediaSession, LEGATO_EVENTS } from '@ddgutierrezc/legato-capacitor';
// Player events via audioPlayerconst playerHandle = await audioPlayer.addListener('playback-state-changed', (payload) => { console.log('State:', payload.state);});
// Remote events via mediaSessionconst remoteHandle = await mediaSession.addListener('remote-play', () => { console.log('User pressed play');});
// Clean up via handleawait playerHandle.remove();await remoteHandle.remove();Using generic listener helpers
Section titled “Using generic listener helpers”import { addLegatoListener, addAudioPlayerListener, addMediaSessionListener } from '@ddgutierrezc/legato-capacitor';
// Any Legato eventconst handle1 = await addLegatoListener('playback-progress', (payload) => { console.log('Progress:', payload.position);});
// Player event onlyconst handle2 = await addAudioPlayerListener('playback-active-track-changed', (payload) => { console.log('Track:', payload.track?.title);});
// Media session onlyconst handle3 = await addMediaSessionListener('remote-seek', (payload) => { console.log('Seek to:', payload.position);});Remote control listeners
Section titled “Remote control listeners”Subscribe to system media control events:
import { onRemotePlay, onRemotePause, onRemoteNext, onRemotePrevious } from '@ddgutierrezc/legato-capacitor';
// Handle remote commandsonRemotePlay(() => { audioPlayer.play();});
onRemotePause(() => { audioPlayer.pause();});
onRemoteNext(() => { audioPlayer.skipToNext();});
onRemotePrevious(() => { audioPlayer.skipToPrevious();});Removing all listeners
Section titled “Removing all listeners”// Remove all player listenersawait audioPlayer.removeAllListeners();
// Remove all media session listenersawait mediaSession.removeAllListeners();Expected result
Section titled “Expected result”| Action | Result |
|---|---|
onPlaybackStateChanged(...) | Listener fires on every state transition |
onPlaybackProgress(...) | Listener fires periodically during playback |
onPlaybackError(...) | Listener fires when playback encounters an error |
onRemotePlay(...) | Listener fires when user taps play on remote control |
.remove() | Listener is detached and stops firing |
removeAllListeners() | All listeners for the namespace are removed |
Best practices
Section titled “Best practices”- Always clean up — Remove listeners in component unmount handlers or when no longer needed
- Use handles — Store handles from
addListener()for manual removal - Check capabilities —
remote-seekonly fires when runtime supports seek
Related pages
Section titled “Related pages”- Events Reference — for full payload documentation
- Reference: Audio Player — for player API details