servo_media_audio/
macros.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5#[macro_export]
6macro_rules! make_message_handler(
7    (
8        $(
9            $node:ident: $handler:ident
10         ),+
11    ) => (
12        fn message_specific(&mut self, msg: $crate::node::AudioNodeMessage, sample_rate: f32) {
13            match msg {
14                $($crate::node::AudioNodeMessage::$node(m) => self.$handler(m, sample_rate)),+,
15                _ => (),
16            }
17        }
18    );
19);
20
21#[macro_export]
22macro_rules! make_state_change(
23    ($fn_name:ident, $state:ident, $render_msg:ident) => (
24        pub fn $fn_name(&self) -> StateChangeResult {
25            self.state.set(ProcessingState::$state);
26            let (tx, rx) = mpsc::channel();
27            let _ = self.sender.send(AudioRenderThreadMsg::$render_msg(tx));
28            rx.recv().unwrap()
29        }
30    );
31);
32
33#[macro_export]
34macro_rules! make_render_thread_state_change(
35    ($fn_name:ident, $state:ident, $sink_method:ident) => (
36        fn $fn_name(&mut self) -> StateChangeResult {
37            if self.state == ProcessingState::$state {
38                return Some(());
39            }
40            self.state = ProcessingState::$state;
41            self.sink.$sink_method().ok()
42        }
43    );
44);