makepad_platform/os/linux/
linux_media.rs1
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 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