makepad_platform/os/linux/
linux_media.rs

1
2use {
3    std::sync::{Arc, Mutex},
4    self::super::{
5        alsa_audio::AlsaAudioAccess,
6        pulse_audio::PulseAudioAccess,
7        alsa_midi::*,
8    },
9    crate::{
10        cx::Cx,
11        event::Event,
12        thread::SignalToUI,
13        audio::*,
14        midi::*,
15        video::*,
16        media_api::CxMediaApi,
17    }
18};
19
20impl Cx {
21    pub (crate) fn handle_media_signals(&mut self) {
22        if self.os.media.audio_change.check_and_clear() {
23            // alright so. if we 'failed' opening a device here
24            // what do we do. we could flag our device as 'failed' on the desc
25            let mut descs = self.os.media.alsa_audio().lock().unwrap().get_updated_descs();
26            let descs2 = self.os.media.pulse_audio().lock().unwrap().get_updated_descs();
27            descs.extend(descs2);
28            self.call_event_handler(&Event::AudioDevices(AudioDevicesEvent {
29                descs
30            }));
31        }
32        if self.os.media.alsa_midi_change.check_and_clear() {
33            let descs = self.os.media.alsa_midi().lock().unwrap().get_updated_descs();
34            self.call_event_handler(&Event::MidiPorts(MidiPortsEvent {
35                descs,
36            }));
37        }
38    }
39}
40
41#[derive(Default)]
42pub struct CxLinuxMedia {
43    pub (crate) pulse_audio: Option<Arc<Mutex<PulseAudioAccess >> >,
44    pub (crate) alsa_audio: Option<Arc<Mutex<AlsaAudioAccess >> >,
45    pub (crate) audio_change: SignalToUI,
46    pub (crate) alsa_midi: Option<Arc<Mutex<AlsaMidiAccess >> >,
47    pub (crate) alsa_midi_change: SignalToUI,
48}
49
50impl CxLinuxMedia {
51    pub fn pulse_audio(&mut self) -> Arc<Mutex<PulseAudioAccess >> {
52        if self.pulse_audio.is_none() {
53            self.pulse_audio = Some(PulseAudioAccess::new(self.audio_change.clone(), &self.alsa_audio().lock().unwrap()));
54        }
55        self.pulse_audio.as_ref().unwrap().clone()
56    }
57    
58    pub fn alsa_audio(&mut self) -> Arc<Mutex<AlsaAudioAccess >> {
59        if self.alsa_audio.is_none() {
60            self.alsa_audio = Some(AlsaAudioAccess::new(self.audio_change.clone()));
61        }
62        self.alsa_audio.as_ref().unwrap().clone()
63    }
64    
65    pub fn alsa_midi(&mut self) -> Arc<Mutex<AlsaMidiAccess >> {
66        if self.alsa_midi.is_none() {
67            self.alsa_midi = Some(AlsaMidiAccess::new(self.alsa_midi_change.clone()));
68        }
69        self.alsa_midi.as_ref().unwrap().clone()
70    }
71
72
73}
74
75impl CxMediaApi for Cx { 
76    
77    fn midi_input(&mut self) -> MidiInput {
78        self.os.media.alsa_midi().lock().unwrap().create_midi_input()
79    }
80    
81    fn midi_output(&mut self) -> MidiOutput {
82        MidiOutput(Some(OsMidiOutput(self.os.media.alsa_midi())))
83    }
84    
85    fn midi_reset(&mut self) {
86    }
87    
88    fn use_midi_inputs(&mut self, ports: &[MidiPortId]) {
89        self.os.media.alsa_midi().lock().unwrap().use_midi_inputs(ports);
90    }
91    
92    fn use_midi_outputs(&mut self, ports: &[MidiPortId]) {
93        self.os.media.alsa_midi().lock().unwrap().use_midi_outputs(ports);
94    }
95    
96    fn use_audio_inputs(&mut self, devices: &[AudioDeviceId]) {
97        self.os.media.alsa_audio().lock().unwrap().use_audio_inputs(devices);
98        self.os.media.pulse_audio().lock().unwrap().use_audio_inputs(devices);
99    }
100    
101    fn use_audio_outputs(&mut self, devices: &[AudioDeviceId]) {
102        self.os.media.alsa_audio().lock().unwrap().use_audio_outputs(devices);
103        self.os.media.pulse_audio().lock().unwrap().use_audio_outputs(devices);
104    }
105    
106    fn audio_output_box(&mut self, index: usize, f: AudioOutputFn){
107        *self.os.media.alsa_audio().lock().unwrap().audio_output_cb[index].lock().unwrap() = Some(f);
108    }
109    
110    fn audio_input_box(&mut self, index: usize, f: AudioInputFn){
111        *self.os.media.alsa_audio().lock().unwrap().audio_input_cb[index].lock().unwrap() = Some(f);
112    }    
113    
114    fn video_input_box(&mut self, _index: usize, _f: VideoInputFn){
115    }
116    
117    fn use_video_input(&mut self, _inputs: &[(VideoInputId, VideoFormatId)]) {
118    }
119}
120
121
122