calx 0.1.0

Oxidized Core Audio API
use coreaudio_sys::{
    kAudioDevicePropertyStreamConfiguration, kAudioDevicePropertyStreams,
    kAudioHardwarePropertyDefaultInputDevice, kAudioHardwarePropertyDefaultOutputDevice,
    kAudioHardwarePropertyDevices, kAudioObjectPropertyElementMaster,
    kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyScopeInput,
    kAudioObjectPropertyScopeOutput, AudioObjectPropertyAddress, AudioObjectPropertyScope,
    AudioObjectPropertySelector,
};

#[derive(Debug)]
pub enum Property {
    DefaultInputDevice,
    DefaultOutputDevice,
    Devices,
    DeviceStreams,
    StreamConfiguration,
}

impl From<Property> for AudioObjectPropertySelector {
    fn from(p: Property) -> Self {
        match p {
            Property::DefaultInputDevice => kAudioHardwarePropertyDefaultInputDevice,
            Property::DefaultOutputDevice => kAudioHardwarePropertyDefaultOutputDevice,
            Property::Devices => kAudioHardwarePropertyDevices,
            Property::DeviceStreams => kAudioDevicePropertyStreams,
            Property::StreamConfiguration => kAudioDevicePropertyStreamConfiguration,
        }
    }
}

#[derive(Debug)]
pub enum PropertyScope {
    Global,
    Input,
    Output,
}

impl From<PropertyScope> for AudioObjectPropertyScope {
    fn from(scope: PropertyScope) -> Self {
        match scope {
            PropertyScope::Global => kAudioObjectPropertyScopeGlobal,
            PropertyScope::Input => kAudioObjectPropertyScopeInput,
            PropertyScope::Output => kAudioObjectPropertyScopeOutput,
        }
    }
}

pub fn get_property_address(
    property: Property,
    scope: PropertyScope,
) -> AudioObjectPropertyAddress {
    AudioObjectPropertyAddress {
        mSelector: AudioObjectPropertySelector::from(property),
        mScope: AudioObjectPropertyScope::from(scope),
        mElement: kAudioObjectPropertyElementMaster,
    }
}