-
Notifications
You must be signed in to change notification settings - Fork 12
4.2 Music Player Context
Relevant source files
The following files were used as context for generating this wiki page:
This document covers the MusicPlayerContext system, which serves as the central orchestrator for music playback functionality within AudioScape. The context manages playback state, queue operations, and coordinates between the UI layer and the underlying audio engine (react-native-track-player).
For information about the underlying audio engine setup and configuration, see Track Player Integration. For details about state persistence and library management, see State Management.
The MusicPlayerContext acts as the primary interface between UI components and the audio playback system. It encapsulates all playback logic and provides a consistent API for music control throughout the application.
graph TB
subgraph "UI Components"
PlayerScreen["PlayerScreen"]
FloatingPlayer["FloatingPlayer"]
MenuModal["MenuModal"]
TabScreens["Tab Navigation Screens"]
end
subgraph "MusicPlayerContext System"
MusicPlayerProvider["MusicPlayerProvider<br/>components/MusicPlayerContext.tsx:97"]
useMusicPlayer["useMusicPlayer()<br/>Hook Consumer"]
ContextState["Context State<br/>isPlaying, isLoading"]
end
subgraph "Audio Engine"
TrackPlayer["TrackPlayer<br/>react-native-track-player"]
useActiveTrack["useActiveTrack<br/>Track Player Hook"]
end
subgraph "External Systems"
ReduxStore["Redux Library Store<br/>store/library.tsx"]
YouTubeAPI["YouTube Services<br/>services/youtube"]
NetInfo["useNetInfo<br/>Network State"]
end
PlayerScreen --> useMusicPlayer
FloatingPlayer --> useMusicPlayer
MenuModal --> useMusicPlayer
TabScreens --> useMusicPlayer
useMusicPlayer --> MusicPlayerProvider
MusicPlayerProvider --> ContextState
MusicPlayerProvider --> TrackPlayer
MusicPlayerProvider --> useActiveTrack
MusicPlayerProvider --> ReduxStore
MusicPlayerProvider --> YouTubeAPI
MusicPlayerProvider --> NetInfo
TrackPlayer --> ContextState
Sources: components/MusicPlayerContext.tsx:1-840, app/(modals)/menu.tsx:25
The context exposes several key functions that handle different playback scenarios. Each operation manages both immediate playback and background queue population.
graph TD
subgraph "Public API Functions"
playAudio["playAudio(songToPlay, playlist?)<br/>components/MusicPlayerContext.tsx:507"]
playDownloadedSong["playDownloadedSong(songToPlay, playlist?)<br/>components/MusicPlayerContext.tsx:608"]
playPlaylist["playPlaylist(songs)<br/>components/MusicPlayerContext.tsx:694"]
playNext["playNext(songs)<br/>components/MusicPlayerContext.tsx:721"]
togglePlayPause["togglePlayPause()<br/>components/MusicPlayerContext.tsx:798"]
end
subgraph "Core Operations"
resetPlayerState["resetPlayerState()<br/>TrackPlayer.reset()"]
getInfo["getInfo()<br/>services/youtube"]
TrackPlayerAdd["TrackPlayer.add()"]
TrackPlayerPlay["TrackPlayer.play()"]
end
subgraph "Background Queue Operations"
addPlaylistTracksInBackground["addPlaylistTracksInBackground()<br/>components/MusicPlayerContext.tsx:135"]
addUpNextSongs["addUpNextSongs()<br/>components/MusicPlayerContext.tsx:424"]
addDownloadedPlaylistTracksInBackground["addDownloadedPlaylistTracksInBackground()<br/>components/MusicPlayerContext.tsx:282"]
end
playAudio --> resetPlayerState
playAudio --> getInfo
playAudio --> TrackPlayerAdd
playAudio --> TrackPlayerPlay
playAudio --> addPlaylistTracksInBackground
playAudio --> addUpNextSongs
playDownloadedSong --> resetPlayerState
playDownloadedSong --> TrackPlayerAdd
playDownloadedSong --> TrackPlayerPlay
playDownloadedSong --> addDownloadedPlaylistTracksInBackground
playPlaylist --> playAudio
playNext --> TrackPlayerAdd
togglePlayPause --> TrackPlayerPlay
Sources: components/MusicPlayerContext.tsx:507-600, components/MusicPlayerContext.tsx:608-688, components/MusicPlayerContext.tsx:694-713
The context maintains internal state and provides a typed interface for consumers. It tracks playback status and manages abort controllers for background operations.
| State Property | Type | Purpose |
|---|---|---|
isPlaying |
boolean |
Current playback state |
isLoading |
boolean |
Loading state during song transitions |
currentSongIdRef |
useRef<string | null> |
Reference to currently playing song ID |
backgroundQueueOperationsAbortControllerRef |
useRef<AbortController | null> |
Controls background queue operations |
The MusicPlayerContextType interface exposes these functions:
| Function | Parameters | Purpose |
|---|---|---|
playAudio |
(songToPlay: Song, playlist?: Song[]) |
Play online song with optional playlist context |
playDownloadedSong |
(songToPlay: DownloadedSongMetadata, playlist?: DownloadedSongMetadata[]) |
Play downloaded song with optional playlist context |
playPlaylist |
(songs: Song[]) |
Play entire online playlist |
playAllDownloadedSongs |
(songs: DownloadedSongMetadata[]) |
Play entire downloaded playlist |
playNext |
(songs: Song[] | null) |
Add songs to play after current track |
togglePlayPause |
() |
Toggle current playback state |
Sources: components/MusicPlayerContext.tsx:33-45, components/MusicPlayerContext.tsx:100-108
The context implements sophisticated background queue population to provide seamless playback experiences. Operations are abortable to handle rapid song changes.
graph LR
subgraph "Queue Population Triggers"
PlaylistProvided["Playlist Provided<br/>playAudio(song, playlist)"]
NoPlaylist["No Playlist<br/>playAudio(song)"]
DownloadedPlaylist["Downloaded Playlist<br/>playDownloadedSong(song, playlist)"]
end
subgraph "Background Operations"
addPlaylistTracks["addPlaylistTracksInBackground()<br/>Online Songs"]
addUpNext["addUpNextSongs()<br/>YouTube Suggestions"]
addDownloadedTracks["addDownloadedPlaylistTracksInBackground()<br/>Local Files"]
end
subgraph "Queue Building Strategy"
SplitPlaylist["Split around initial song<br/>songsBefore + songsAfter"]
ParallelAdd["Parallel addition<br/>Promise.all()"]
AbortChecks["Abort signal checks<br/>currentSongIdRef validation"]
end
PlaylistProvided --> addPlaylistTracks
NoPlaylist --> addUpNext
DownloadedPlaylist --> addDownloadedTracks
addPlaylistTracks --> SplitPlaylist
addPlaylistTracks --> ParallelAdd
addPlaylistTracks --> AbortChecks
addDownloadedTracks --> SplitPlaylist
addDownloadedTracks --> ParallelAdd
addDownloadedTracks --> AbortChecks
The background operations implement several key patterns:
-
Context Validation: Operations check
currentSongIdRef.currentto ensure they're still relevant -
Abort Signals:
AbortControllerinstances prevent stale operations from continuing -
Delay Management: Small delays (
150msfor online,50msfor downloaded) prevent API overwhelming - Duplicate Prevention: Queue state is checked before adding tracks
Sources: components/MusicPlayerContext.tsx:135-273, components/MusicPlayerContext.tsx:282-416, components/MusicPlayerContext.tsx:424-499
The context integrates with network state monitoring to handle offline scenarios gracefully.
graph TD
subgraph "Network State Monitoring"
useNetInfo["useNetInfo<br/>@react-native-community/netinfo"]
isInternetReachable["netInfo.isInternetReachable"]
end
subgraph "Playback Decision Logic"
playAudio["playAudio() called"]
NetworkCheck["Check netInfo.isInternetReachable"]
ShowAlert["Alert.alert('Network Error')"]
ProceedPlayback["Proceed with YouTube API calls"]
end
subgraph "Downloaded Song Path"
playDownloadedSong["playDownloadedSong() called"]
LocalPlayback["Direct local file playback<br/>No network required"]
end
useNetInfo --> isInternetReachable
playAudio --> NetworkCheck
NetworkCheck -->|false| ShowAlert
NetworkCheck -->|true| ProceedPlayback
playDownloadedSong --> LocalPlayback
Sources: components/MusicPlayerContext.tsx:26, components/MusicPlayerContext.tsx:509-515
The context coordinates with multiple external systems to provide comprehensive playback functionality.
| System | Integration Point | Purpose |
|---|---|---|
react-native-track-player |
Direct API calls | Core audio playback engine |
services/youtube |
getInfo(), innertube
|
Song metadata and streaming URLs |
store/library |
DownloadedSongMetadata type |
Downloaded song information |
@react-native-community/netinfo |
useNetInfo() hook |
Network connectivity monitoring |
The context uses type guards and error handling to ensure robust operation:
// Type guard for YouTube "Up Next" items
const isValidUpNextItem = (item: Helpers.YTNode): item is Helpers.YTNode & { video_id: string }Sources: components/MusicPlayerContext.tsx:66-70, components/MusicPlayerContext.tsx:18-27
The context implements comprehensive error handling with consistent logging patterns. All major operations include try-catch blocks and meaningful error messages displayed via Alert.alert().
Sources: components/MusicPlayerContext.tsx:114-116, components/MusicPlayerContext.tsx:553-560, components/MusicPlayerContext.tsx:677-685