makepad-platform 1.0.0

Makepad platform layer
Documentation

use {
    std::sync::{Arc,Mutex},
    self::super::{
        winrt_midi::*,
        wasapi::*,
        media_foundation::*,        
    },
    crate::{
        cx::Cx,
        audio::*,
        midi::*,
        video::*,
        thread::SignalToUI,
        event::Event,
        media_api::CxMediaApi,

    }
};

#[derive(Default)]
pub struct CxWindowsMedia{
    pub (crate) winrt_midi: Option<Arc<Mutex<WinRTMidiAccess >> >,
    pub (crate) wasapi: Option<Arc<Mutex<WasapiAccess >> >,
    pub (crate) media_foundation: Option<Arc<Mutex<MediaFoundationAccess >> >,
    pub (crate) wasapi_change: SignalToUI,
    pub (crate) media_foundation_change: SignalToUI,
    pub (crate) winrt_midi_change: SignalToUI,
}

impl Cx {
    pub (crate) fn handle_media_signals(&mut self) {
        if self.os.media.winrt_midi_change.check_and_clear(){
            let descs = self.os.media.winrt_midi().lock().unwrap().get_updated_descs();
            self.call_event_handler(&Event::MidiPorts(MidiPortsEvent {
                descs,
            }));
        }
        if self.os.media.wasapi_change.check_and_clear(){
            let descs = self.os.media.wasapi().lock().unwrap().get_updated_descs();
            self.call_event_handler(&Event::AudioDevices(AudioDevicesEvent{
                descs
            }));
        }
        if self.os.media.media_foundation_change.check_and_clear(){
            let descs = self.os.media.media_foundation().lock().unwrap().get_updated_descs();
            self.call_event_handler(&Event::VideoInputs(VideoInputsEvent{
                descs
            }));
        }
    }
}

impl CxWindowsMedia {
    
    pub fn winrt_midi(&mut self) -> Arc<Mutex<WinRTMidiAccess >> {
        if self.winrt_midi.is_none() {
            self.winrt_midi = Some(WinRTMidiAccess::new(self.winrt_midi_change.clone()));
        }
        self.winrt_midi.as_ref().unwrap().clone()
    }
    
    pub fn wasapi(&mut self) -> Arc<Mutex<WasapiAccess >> {
        if self.wasapi.is_none() {
            self.wasapi = Some(WasapiAccess::new(self.wasapi_change.clone()));
        }
        self.wasapi.as_ref().unwrap().clone()
    }
    
    pub fn media_foundation(&mut self) -> Arc<Mutex<MediaFoundationAccess >> {
        if self.media_foundation.is_none() {
            self.media_foundation = Some(MediaFoundationAccess::new(self.media_foundation_change.clone()));
        }
        self.media_foundation.as_ref().unwrap().clone()
    }
}

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

    fn midi_reset(&mut self){
        self.os.media.winrt_midi().lock().unwrap().midi_reset();
    }

    fn use_midi_inputs(&mut self, ports: &[MidiPortId]) {
        self.os.media.winrt_midi().lock().unwrap().use_midi_inputs(ports);
    }
    
    fn use_midi_outputs(&mut self, ports: &[MidiPortId]) {
        self.os.media.winrt_midi().lock().unwrap().use_midi_outputs(ports);
    }

    fn use_audio_inputs(&mut self, devices: &[AudioDeviceId]) {
        self.os.media.wasapi().lock().unwrap().use_audio_inputs(devices);
    }
    
    fn use_audio_outputs(&mut self, devices: &[AudioDeviceId]) {
        self.os.media.wasapi().lock().unwrap().use_audio_outputs(devices);
    }
    
    fn audio_output_box(&mut self, index:usize, f: AudioOutputFn) {
        *self.os.media.wasapi().lock().unwrap().audio_output_cb[index].lock().unwrap() = Some(f);
    }
    
    fn audio_input_box(&mut self, index:usize, f: AudioInputFn) {
        *self.os.media.wasapi().lock().unwrap().audio_input_cb[index].lock().unwrap() = Some(f);
    }
    
    fn video_input_box(&mut self, index:usize, f: VideoInputFn){
        *self.os.media.media_foundation().lock().unwrap().video_input_cb[index].lock().unwrap() = Some(f);
    }

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

}