makepad_platform/os/windows/
windows_media.rs

1
2use {
3    std::sync::{Arc,Mutex},
4    self::super::{
5        winrt_midi::*,
6        wasapi::*,
7        media_foundation::*,        
8    },
9    crate::{
10        cx::Cx,
11        audio::*,
12        midi::*,
13        video::*,
14        thread::Signal,
15        event::Event,
16        media_api::CxMediaApi,
17
18    }
19};
20
21#[derive(Default)]
22pub struct CxWindowsMedia{
23    pub (crate) winrt_midi: Option<Arc<Mutex<WinRTMidiAccess >> >,
24    pub (crate) wasapi: Option<Arc<Mutex<WasapiAccess >> >,
25    pub (crate) media_foundation: Option<Arc<Mutex<MediaFoundationAccess >> >,
26    pub (crate) wasapi_change: Signal,
27    pub (crate) media_foundation_change: Signal,
28    pub (crate) winrt_midi_change: Signal,
29}
30
31impl Cx {
32    pub (crate) fn handle_media_signals(&mut self) {
33        if self.os.media.winrt_midi_change.check_and_clear(){
34            let descs = self.os.media.winrt_midi().lock().unwrap().get_updated_descs();
35            self.call_event_handler(&Event::MidiPorts(MidiPortsEvent {
36                descs,
37            }));
38        }
39        if self.os.media.wasapi_change.check_and_clear(){
40            let descs = self.os.media.wasapi().lock().unwrap().get_updated_descs();
41            self.call_event_handler(&Event::AudioDevices(AudioDevicesEvent{
42                descs
43            }));
44        }
45        if self.os.media.media_foundation_change.check_and_clear(){
46            let descs = self.os.media.media_foundation().lock().unwrap().get_updated_descs();
47            self.call_event_handler(&Event::VideoInputs(VideoInputsEvent{
48                descs
49            }));
50        }
51    }
52}
53
54impl CxWindowsMedia {
55    
56    pub fn winrt_midi(&mut self) -> Arc<Mutex<WinRTMidiAccess >> {
57        if self.winrt_midi.is_none() {
58            self.winrt_midi = Some(WinRTMidiAccess::new(self.winrt_midi_change.clone()));
59        }
60        self.winrt_midi.as_ref().unwrap().clone()
61    }
62    
63    pub fn wasapi(&mut self) -> Arc<Mutex<WasapiAccess >> {
64        if self.wasapi.is_none() {
65            self.wasapi = Some(WasapiAccess::new(self.wasapi_change.clone()));
66        }
67        self.wasapi.as_ref().unwrap().clone()
68    }
69    
70    pub fn media_foundation(&mut self) -> Arc<Mutex<MediaFoundationAccess >> {
71        if self.media_foundation.is_none() {
72            self.media_foundation = Some(MediaFoundationAccess::new(self.media_foundation_change.clone()));
73        }
74        self.media_foundation.as_ref().unwrap().clone()
75    }
76}
77
78impl CxMediaApi for Cx {
79    
80    fn midi_input(&mut self) -> MidiInput {
81        self.os.media.winrt_midi().lock().unwrap().create_midi_input()
82    }
83    
84    fn midi_output(&mut self)->MidiOutput{
85        MidiOutput(Some(OsMidiOutput(self.os.media.winrt_midi())))
86    }
87
88    fn midi_reset(&mut self){
89        self.os.media.winrt_midi().lock().unwrap().midi_reset();
90    }
91
92    fn use_midi_inputs(&mut self, ports: &[MidiPortId]) {
93        self.os.media.winrt_midi().lock().unwrap().use_midi_inputs(ports);
94    }
95    
96    fn use_midi_outputs(&mut self, ports: &[MidiPortId]) {
97        self.os.media.winrt_midi().lock().unwrap().use_midi_outputs(ports);
98    }
99
100    fn use_audio_inputs(&mut self, devices: &[AudioDeviceId]) {
101        self.os.media.wasapi().lock().unwrap().use_audio_inputs(devices);
102    }
103    
104    fn use_audio_outputs(&mut self, devices: &[AudioDeviceId]) {
105        self.os.media.wasapi().lock().unwrap().use_audio_outputs(devices);
106    }
107    
108    fn audio_output_box(&mut self, index:usize, f: AudioOutputFn) {
109        *self.os.media.wasapi().lock().unwrap().audio_output_cb[index].lock().unwrap() = Some(f);
110    }
111    
112    fn audio_input_box(&mut self, index:usize, f: AudioInputFn) {
113        *self.os.media.wasapi().lock().unwrap().audio_input_cb[index].lock().unwrap() = Some(f);
114    }
115    
116    fn video_input_box(&mut self, index:usize, f: VideoInputFn){
117        *self.os.media.media_foundation().lock().unwrap().video_input_cb[index].lock().unwrap() = Some(f);
118    }
119
120    fn use_video_input(&mut self, inputs:&[(VideoInputId, VideoFormatId)]){
121        self.os.media.media_foundation().lock().unwrap().use_video_input(inputs);
122    }
123
124}
125
126
127