use coremidi_sys::{
MIDIGetNumberOfDestinations, MIDIGetDestination, MIDIEndpointDispose, ItemCount
};
use std::ops::Deref;
use Object;
use Endpoint;
use Destination;
use VirtualDestination;
impl Destination {
pub fn from_index(index: usize) -> Option<Destination> {
let endpoint_ref = unsafe { MIDIGetDestination(index as ItemCount) };
match endpoint_ref {
0 => None,
_ => Some(Destination { endpoint: Endpoint { object: Object(endpoint_ref) } })
}
}
}
impl Deref for Destination {
type Target = Endpoint;
fn deref(&self) -> &Endpoint {
&self.endpoint
}
}
pub struct Destinations;
impl Destinations {
pub fn count() -> usize {
unsafe { MIDIGetNumberOfDestinations() as usize }
}
}
impl IntoIterator for Destinations {
type Item = Destination;
type IntoIter = DestinationsIterator;
fn into_iter(self) -> Self::IntoIter {
DestinationsIterator { index: 0, count: Self::count() }
}
}
pub struct DestinationsIterator {
index: usize,
count: usize
}
impl Iterator for DestinationsIterator {
type Item = Destination;
fn next(&mut self) -> Option<Destination> {
if self.index < self.count {
let destination = Destination::from_index(self.index);
self.index += 1;
destination
}
else {
None
}
}
}
impl VirtualDestination {
}
impl Deref for VirtualDestination {
type Target = Endpoint;
fn deref(&self) -> &Endpoint {
&self.endpoint
}
}
impl Drop for VirtualDestination {
fn drop(&mut self) {
unsafe { MIDIEndpointDispose(self.endpoint.object.0) };
}
}