use objc::runtime::*;
use objc::*;
use crate::FileLoader;
#[derive(Debug)]
pub struct MusicApple {
player: Option<*mut Object>,
}
impl MusicApple {
pub fn new() -> Self {
Self { player: None }
}
fn load_from_slice(&mut self, slice: &[u8]) -> bool {
unsafe {
let cls_nsdata = class!(NSData);
let data: *mut Object =
msg_send![ cls_nsdata, dataWithBytes:slice.as_ptr() length:slice.len() ];
let data_len: u64 = msg_send![data, length];
dbg!(&data_len);
let cls_nserror = class!(NSError);
let error: *mut Object = msg_send![cls_nserror, alloc];
let cls_avaudioplayer = class!(AVAudioPlayer);
let player: *mut Object = msg_send![cls_avaudioplayer, alloc];
let player: *mut Object = msg_send![ player, initWithData: data error: &error ];
let prep_result: bool = msg_send![player, prepareToPlay];
if prep_result {
self.player = Some(player);
let _: () = msg_send![ player, setNumberOfLoops: -1 ];
true
} else {
self.player = None;
false
}
}
}
pub fn load(&mut self, fileloader: &mut impl FileLoader, filename: &str) -> bool {
let mut f = fileloader.open(&filename);
if f.is_valid() {
println!("Loading Music from {} ({}).", &filename, &f.name());
let mut buf = Vec::new();
while !f.eof() {
let c = f.read_u8();
buf.push(c);
}
self.load_from_slice(buf.as_slice())
} else {
println!("Couldn't read Music from {}!", &filename);
false
}
}
pub fn play(&mut self) {
if let Some(player) = self.player {
unsafe {
let _: () = msg_send![player, play];
}
}
}
pub fn pause(&mut self) {
if let Some(player) = self.player {
unsafe {
let _: () = msg_send![player, pause];
}
}
}
pub fn stop(&mut self) {
if let Some(player) = self.player {
unsafe {
let _: () = msg_send![player, stop];
}
}
}
pub fn update(&mut self, _time_step: f64) {}
}