From afddd77ce873c4cdedab560838966d9a54133d6f Mon Sep 17 00:00:00 2001
From: Gwilym Inzani <email@gwilym.dev>
Date: Wed, 10 Jul 2024 09:51:06 +0100
Subject: [PATCH] Don't require leaking the track

---
 tracker/agb-tracker/src/lib.rs     | 10 +++++-----
 tracker/desktop-player/src/main.rs |  4 ++--
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/tracker/agb-tracker/src/lib.rs b/tracker/agb-tracker/src/lib.rs
index a8af2f20..d1158780 100644
--- a/tracker/agb-tracker/src/lib.rs
+++ b/tracker/agb-tracker/src/lib.rs
@@ -95,8 +95,8 @@ pub mod __private {
 pub use agb_tracker_interop::Track;
 
 /// Stores the required state in order to play tracker music.
-pub struct TrackerInner<TChannelId> {
-    track: &'static Track,
+pub struct TrackerInner<'track, TChannelId> {
+    track: &'track Track,
     channels: Vec<TrackerChannel<TChannelId>>,
     envelopes: Vec<Option<EnvelopeState>>,
 
@@ -132,9 +132,9 @@ struct GlobalSettings {
     volume: Num<i32, 8>,
 }
 
-impl<TChannelId> TrackerInner<TChannelId> {
+impl<'track, TChannelId> TrackerInner<'track, TChannelId> {
     /// Create a new tracker playing a specified track. See the [example](crate#example) for how to use the tracker.
-    pub fn new(track: &'static Track) -> Self {
+    pub fn new(track: &'track Track) -> Self {
         let mut channels = Vec::new();
         channels.resize_with(track.num_channels, Default::default);
 
@@ -586,4 +586,4 @@ impl<'gba> Mixer for agb::sound::mixer::Mixer<'gba> {
 
 #[cfg(feature = "agb")]
 /// The type to use if you're using agb-tracker with agb
-pub type Tracker = TrackerInner<agb::sound::mixer::ChannelId>;
+pub type Tracker = TrackerInner<'static, agb::sound::mixer::ChannelId>;
diff --git a/tracker/desktop-player/src/main.rs b/tracker/desktop-player/src/main.rs
index b138e935..18d108a0 100644
--- a/tracker/desktop-player/src/main.rs
+++ b/tracker/desktop-player/src/main.rs
@@ -15,10 +15,10 @@ fn main() -> Result<(), Box<dyn Error>> {
     let file_path = &args[1];
     let module = load_module_from_file(Path::new(file_path))?;
 
-    let track = Box::leak::<'static>(Box::new(agb_xm_core::parse_module(&module)));
+    let track = agb_xm_core::parse_module(&module);
 
     let mut mixer = Mixer::new();
-    let mut tracker = agb_tracker::TrackerInner::new(track);
+    let mut tracker = agb_tracker::TrackerInner::new(&track);
 
     let host = cpal::default_host();
     let device = host