makepad_platform/os/windows/
windows_media.rs1
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