old school music tracker audio backend

drop audio manager correctly

luca3s f39aaee0 74c12aa6

+19 -9
+7 -1
tracker-engine/src/manager.rs
··· 349 349 /// if this panics the drop implementation isn't right and the Audio Callback isn't cleaned up properly 350 350 fn drop(&mut self) { 351 351 self.deinit_audio(); 352 + let mut song = self.edit_song(); 353 + for i in 0..Song::<true>::MAX_SAMPLES { 354 + song.apply_operation(SongOperation::RemoveSample(i)).unwrap(); 355 + } 356 + song.finish(); 357 + // lock it once more to ensure that the changes were propagated 358 + self.edit_song(); 352 359 // due to async feature 353 360 #[allow(irrefutable_let_patterns)] 354 361 if let ManageCollector::Internal(ref mut collector, _) = self.gc { ··· 370 377 // need manuallyDrop because i need consume on drop behaviour 371 378 pub struct SongEdit<'a> { 372 379 song: WriteGuard<'a, Song<true>, ValidOperation>, 373 - // gc_handle: Handle, 374 380 gc: &'a mut ManageCollector, 375 381 } 376 382
+12 -8
tracker-engine/src/project/song.rs
··· 172 172 SetVolume(usize, u8), 173 173 SetPan(usize, Pan), 174 174 SetSample(usize, SampleMetaData, SampleData), 175 + RemoveSample(usize), 175 176 PatternOperation(usize, PatternOperation), 176 177 SetOrder(usize, PatternOrder), 177 178 } ··· 182 183 SetVolume(usize, u8), 183 184 SetPan(usize, Pan), 184 185 SetSample(usize, SampleMetaData, Shared<SampleData>), 186 + RemoveSample(usize), 185 187 PatternOperation(usize, PatternOperation), 186 188 SetOrder(usize, PatternOrder), 187 189 } ··· 196 198 SongOperation::SetVolume(c, _) => c < Song::<true>::MAX_CHANNELS, 197 199 SongOperation::SetPan(c, _) => c < Song::<true>::MAX_CHANNELS, 198 200 SongOperation::SetSample(idx, _, _) => idx < Song::<true>::MAX_SAMPLES, 201 + SongOperation::RemoveSample(idx) => idx < Song::<true>::MAX_SAMPLES, 199 202 SongOperation::PatternOperation(idx, op) => match song.patterns.get(idx) { 200 203 Some(pattern) => pattern.operation_is_valid(&op), 201 204 None => false, ··· 210 213 SongOperation::SetSample(i, sample_meta_data, sample_data) => { 211 214 Self::SetSample(i, sample_meta_data, Shared::new(handle, sample_data)) 212 215 } 216 + SongOperation::RemoveSample(i) => Self::RemoveSample(i), 213 217 SongOperation::PatternOperation(i, pattern_operation) => { 214 218 Self::PatternOperation(i, pattern_operation) 215 219 } ··· 249 253 .field(arg1) 250 254 .field(arg2.deref()) 251 255 .finish(), 256 + Self::RemoveSample(arg0) => f.debug_tuple("RemoveSample").field(arg0).finish(), 252 257 Self::PatternOperation(arg0, arg1) => f 253 258 .debug_tuple("PatternOperation") 254 259 .field(arg0) ··· 264 269 impl simple_left_right::Absorb<ValidOperation> for Song<true> { 265 270 fn absorb(&mut self, operation: ValidOperation) { 266 271 match operation { 267 - ValidOperation::SetVolume(chan, val) => self.volume[chan] = val, 268 - ValidOperation::SetPan(chan, val) => self.pan[chan] = val, 269 - ValidOperation::SetSample(sample, meta, data) => { 270 - self.samples[sample] = Some((meta, Sample::<true>::new(data))) 271 - } 272 - ValidOperation::PatternOperation(pattern, op) => { 273 - self.patterns[pattern].apply_operation(op) 272 + ValidOperation::SetVolume(i, val) => self.volume[i] = val, 273 + ValidOperation::SetPan(i, val) => self.pan[i] = val, 274 + ValidOperation::SetSample(i, meta, data) => { 275 + self.samples[i] = Some((meta, Sample::<true>::new(data))) 274 276 } 275 - ValidOperation::SetOrder(idx, order) => self.pattern_order[idx] = order, 277 + ValidOperation::RemoveSample(i) => self.samples[i] = None, 278 + ValidOperation::PatternOperation(i, op) => self.patterns[i].apply_operation(op), 279 + ValidOperation::SetOrder(i, order) => self.pattern_order[i] = order, 276 280 } 277 281 } 278 282 }