makepad-platform 1.0.0

Makepad platform layer
Documentation

use {
    std::sync::{Arc,Mutex},
    crate::{
        cx::Cx,
        audio::*,
        event::Event,
        video::*,
        midi::*,
        thread::SignalToUI,
        media_api::CxMediaApi,
        os::apple::core_midi::*,
        os::apple::audio_unit::AudioUnitAccess,
        os::apple::av_capture::AvCaptureAccess,
    }
};

#[derive(Default)]
pub struct CxAppleMedia{
    pub (crate) core_midi: Option<Arc<Mutex<CoreMidiAccess>>>,
    pub (crate) audio_unit: Option<Arc<Mutex<AudioUnitAccess>>>,
    pub (crate) av_capture: Option<Arc<Mutex<AvCaptureAccess>>>,
    pub (crate) core_audio_change: SignalToUI,
    pub (crate) core_midi_change: SignalToUI,
    pub (crate) av_capture_change: SignalToUI,
}

impl Cx{
    pub(crate) fn handle_media_signals(&mut self){
        if self.os.media.core_midi_change.check_and_clear(){
            let descs = self.os.media.core_midi().lock().unwrap().get_updated_descs();
            self.call_event_handler(&Event::MidiPorts(MidiPortsEvent{
                descs,
            }));
        }
        if self.os.media.core_audio_change.check_and_clear(){
            let descs = self.os.media.audio_unit().lock().unwrap().get_updated_descs();
            self.call_event_handler(&Event::AudioDevices(AudioDevicesEvent{
                descs
            }));
        }
        if self.os.media.av_capture_change.check_and_clear(){
            let descs = self.os.media.av_capture().lock().unwrap().get_updated_descs();
            self.call_event_handler(&Event::VideoInputs(VideoInputsEvent{
                descs
            }));
        }
    }
    
}

impl CxAppleMedia{
    pub fn audio_unit(&mut self)->Arc<Mutex<AudioUnitAccess>>{
        if self.audio_unit.is_none(){
            self.audio_unit = Some(AudioUnitAccess::new(self.core_audio_change.clone()));
            self.core_audio_change.set();
        }
        self.audio_unit.as_ref().unwrap().clone()
    }
    
    pub fn core_midi(&mut self)->Arc<Mutex<CoreMidiAccess>>{
        if self.core_midi.is_none(){
            self.core_midi = Some(CoreMidiAccess::new(self.core_midi_change.clone()));
            self.core_midi_change.set();
        }
        self.core_midi.as_ref().unwrap().clone()
    }
    
    pub fn av_capture(&mut self)->Arc<Mutex<AvCaptureAccess>>{
        if self.av_capture.is_none(){
            self.av_capture = Some(AvCaptureAccess::new(self.av_capture_change.clone()));
            self.av_capture_change.set();
        }
        self.av_capture.as_ref().unwrap().clone()
    }
}

impl CxMediaApi for Cx {
    fn midi_input(&mut self) -> MidiInput {
        self.os.media.core_midi().lock().unwrap().create_midi_input()
    }
    
    fn midi_output(&mut self) -> MidiOutput {
        MidiOutput(Some(OsMidiOutput(self.os.media.core_midi())))
    }

    fn midi_reset(&mut self) {
        self.os.media.core_midi().lock().unwrap().midi_reset();
    }
    
    fn use_midi_inputs(&mut self, ports: &[MidiPortId]) {
        self.os.media.core_midi().lock().unwrap().use_midi_inputs(ports);
    }
    
    fn use_midi_outputs(&mut self, ports: &[MidiPortId]) {
        self.os.media.core_midi().lock().unwrap().use_midi_outputs(ports);
    }
    
    fn use_audio_inputs(&mut self, devices: &[AudioDeviceId]) {
        self.os.media.audio_unit().lock().unwrap().use_audio_inputs(devices);
    }
    
    fn use_audio_outputs(&mut self, devices: &[AudioDeviceId]) {
        self.os.media.audio_unit().lock().unwrap().use_audio_outputs(devices);
    }

    fn audio_output_box(&mut self, index:usize, f: AudioOutputFn){
        *self.os.media.audio_unit().lock().unwrap().audio_output_cb[index].lock().unwrap() = Some(f);
    }

    fn audio_input_box(&mut self, index:usize, f: AudioInputFn){
        *self.os.media.audio_unit().lock().unwrap().audio_input_cb[index].lock().unwrap() = Some(f);
    }

    fn video_input_box(&mut self, index:usize, f: VideoInputFn){
        *self.os.media.av_capture().lock().unwrap().video_input_cb[index].lock().unwrap() = Some(f);
    }

    fn use_video_input(&mut self, inputs:&[(VideoInputId, VideoFormatId)]){
        self.os.media.av_capture().lock().unwrap().use_video_input(inputs);
    }
}