track.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. use libc::{c_int, c_char};
  2. use std::ptr::null_mut;
  3. use artist::sp_artist;
  4. use metadata::SpMetadata;
  5. use session::SpSession;
  6. use librespot::metadata::{Track, Artist};
  7. #[allow(non_camel_case_types)]
  8. pub type sp_track = SpMetadata<Track>;
  9. #[no_mangle]
  10. pub unsafe extern "C" fn sp_track_is_loaded(c_track: *mut sp_track) -> bool {
  11. let track = &*c_track;
  12. track.is_loaded()
  13. }
  14. #[no_mangle]
  15. pub unsafe extern "C" fn sp_track_name(c_track: *mut sp_track) -> *const c_char {
  16. let track = &mut *c_track;
  17. let name = track.get()
  18. .map(|metadata| &metadata.name as &str)
  19. .unwrap_or("");
  20. track.intern(name).as_ptr()
  21. }
  22. #[no_mangle]
  23. pub unsafe extern "C" fn sp_track_num_artists(c_track: *mut sp_track) -> c_int {
  24. let track = &*c_track;
  25. track.get()
  26. .map(|metadata| metadata.artists.len() as c_int)
  27. .unwrap_or(0)
  28. }
  29. #[no_mangle]
  30. pub unsafe extern "C" fn sp_track_artist(c_track: *mut sp_track, index: c_int) -> *mut sp_artist {
  31. let track = &*c_track;
  32. let session = SpSession::global();
  33. track.get()
  34. .and_then(|metadata| metadata.artists.get(index as usize).map(|x| *x))
  35. .map(|artist_id| session.session.metadata::<Artist>(artist_id))
  36. .map(|artist| Box::into_raw(Box::new(SpMetadata::from_future(artist))))
  37. .unwrap_or(null_mut())
  38. }