From 75aac82af1db32e46712e566b3d2c4187d13eb8e Mon Sep 17 00:00:00 2001 From: Colin Marc Date: Sat, 6 Jan 2024 11:02:59 +0100 Subject: [PATCH] Use associated types instead of magical names in platform_impl This reduces the exported surface area of each host implementation, and makes the impl_platform_host macro more robust. --- src/platform/mod.rs | 116 ++++++++++++++++---------------------------- 1 file changed, 41 insertions(+), 75 deletions(-) diff --git a/src/platform/mod.rs b/src/platform/mod.rs index 4827e6295..fd12eaaac 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -33,7 +33,7 @@ pub use self::platform_impl::*; /// SupportedOutputConfigs and all their necessary trait implementations. /// macro_rules! impl_platform_host { - ($($(#[cfg($feat: meta)])? $HostVariant:ident $host_mod:ident $host_name:literal),*) => { + ($($(#[cfg($feat: meta)])? $HostVariant:ident => $Host:ty),* $(,)?) => { /// All hosts supported by CPAL on this platform. pub const ALL_HOSTS: &'static [HostId] = &[ $( @@ -91,7 +91,7 @@ macro_rules! impl_platform_host { pub enum DeviceInner { $( $(#[cfg($feat)])? - $HostVariant(crate::host::$host_mod::Device), + $HostVariant(<$Host as crate::traits::HostTrait>::Device), )* } @@ -99,7 +99,7 @@ macro_rules! impl_platform_host { pub enum DevicesInner { $( $(#[cfg($feat)])? - $HostVariant(crate::host::$host_mod::Devices), + $HostVariant(<$Host as crate::traits::HostTrait>::Devices), )* } @@ -107,7 +107,7 @@ macro_rules! impl_platform_host { pub enum HostInner { $( $(#[cfg($feat)])? - $HostVariant(crate::host::$host_mod::Host), + $HostVariant($Host), )* } @@ -115,7 +115,7 @@ macro_rules! impl_platform_host { pub enum StreamInner { $( $(#[cfg($feat)])? - $HostVariant(crate::host::$host_mod::Stream), + $HostVariant(<<$Host as crate::traits::HostTrait>::Device as crate::traits::DeviceTrait>::Stream), )* } @@ -123,7 +123,7 @@ macro_rules! impl_platform_host { enum SupportedInputConfigsInner { $( $(#[cfg($feat)])? - $HostVariant(crate::host::$host_mod::SupportedInputConfigs), + $HostVariant(<<$Host as crate::traits::HostTrait>::Device as crate::traits::DeviceTrait>::SupportedInputConfigs), )* } @@ -131,7 +131,7 @@ macro_rules! impl_platform_host { enum SupportedOutputConfigsInner { $( $(#[cfg($feat)])? - $HostVariant(crate::host::$host_mod::SupportedOutputConfigs), + $HostVariant(<<$Host as crate::traits::HostTrait>::Device as crate::traits::DeviceTrait>::SupportedOutputConfigs), )* } @@ -140,7 +140,7 @@ macro_rules! impl_platform_host { match self { $( $(#[cfg($feat)])? - HostId::$HostVariant => $host_name, + HostId::$HostVariant => stringify!($HostVariant), )* } } @@ -442,7 +442,7 @@ macro_rules! impl_platform_host { fn is_available() -> bool { $( $(#[cfg($feat)])? - if crate::host::$host_mod::Host::is_available() { return true; } + if <$Host>::is_available() { return true; } )* false } @@ -531,29 +531,29 @@ macro_rules! impl_platform_host { $( $(#[cfg($feat)])? - impl From for Device { - fn from(h: crate::host::$host_mod::Device) -> Self { + impl From<<$Host as crate::traits::HostTrait>::Device> for Device { + fn from(h: <$Host as crate::traits::HostTrait>::Device) -> Self { DeviceInner::$HostVariant(h).into() } } $(#[cfg($feat)])? - impl From for Devices { - fn from(h: crate::host::$host_mod::Devices) -> Self { + impl From<<$Host as crate::traits::HostTrait>::Devices> for Devices { + fn from(h: <$Host as crate::traits::HostTrait>::Devices) -> Self { DevicesInner::$HostVariant(h).into() } } $(#[cfg($feat)])? - impl From for Host { - fn from(h: crate::host::$host_mod::Host) -> Self { + impl From<$Host> for Host { + fn from(h: $Host) -> Self { HostInner::$HostVariant(h).into() } } $(#[cfg($feat)])? - impl From for Stream { - fn from(h: crate::host::$host_mod::Stream) -> Self { + impl From<<<$Host as crate::traits::HostTrait>::Device as crate::traits::DeviceTrait>::Stream> for Stream { + fn from(h: <<$Host as crate::traits::HostTrait>::Device as crate::traits::DeviceTrait>::Stream) -> Self { StreamInner::$HostVariant(h).into() } } @@ -564,7 +564,7 @@ macro_rules! impl_platform_host { let mut host_ids = vec![]; $( $(#[cfg($feat)])? - if ::is_available() { + if <$Host as crate::traits::HostTrait>::is_available() { host_ids.push(HostId::$HostVariant); } )* @@ -577,7 +577,7 @@ macro_rules! impl_platform_host { $( $(#[cfg($feat)])? HostId::$HostVariant => { - crate::host::$host_mod::Host::new() + <$Host>::new() .map(HostInner::$HostVariant) .map(Host::from) } @@ -601,19 +601,14 @@ macro_rules! impl_platform_host { target_os = "netbsd" ))] mod platform_impl { - pub use crate::host::alsa::{ - Device as AlsaDevice, Devices as AlsaDevices, Host as AlsaHost, Stream as AlsaStream, - SupportedInputConfigs as AlsaSupportedInputConfigs, - SupportedOutputConfigs as AlsaSupportedOutputConfigs, - }; + pub use crate::host::alsa::Host as AlsaHost; #[cfg(feature = "jack")] - pub use crate::host::jack::{ - Device as JackDevice, Devices as JackDevices, Host as JackHost, Stream as JackStream, - SupportedInputConfigs as JackSupportedInputConfigs, - SupportedOutputConfigs as JackSupportedOutputConfigs, - }; + pub use crate::host::jack::Host as JackHost; - impl_platform_host!(#[cfg(feature = "jack")] Jack jack "JACK", Alsa alsa "ALSA"); + impl_platform_host!( + #[cfg(feature = "jack")] Jack => JackHost, + Alsa => AlsaHost, + ); /// The default host for the current compilation target platform. pub fn default_host() -> Host { @@ -625,13 +620,8 @@ mod platform_impl { #[cfg(any(target_os = "macos", target_os = "ios"))] mod platform_impl { - pub use crate::host::coreaudio::{ - Device as CoreAudioDevice, Devices as CoreAudioDevices, Host as CoreAudioHost, - Stream as CoreAudioStream, SupportedInputConfigs as CoreAudioSupportedInputConfigs, - SupportedOutputConfigs as CoreAudioSupportedOutputConfigs, - }; - - impl_platform_host!(CoreAudio coreaudio "CoreAudio"); + pub use crate::host::coreaudio::Host as CoreAudioHost; + impl_platform_host!(CoreAudio => CoreAudioHost); /// The default host for the current compilation target platform. pub fn default_host() -> Host { @@ -643,13 +633,8 @@ mod platform_impl { #[cfg(target_os = "emscripten")] mod platform_impl { - pub use crate::host::emscripten::{ - Device as EmscriptenDevice, Devices as EmscriptenDevices, Host as EmscriptenHost, - Stream as EmscriptenStream, SupportedInputConfigs as EmscriptenSupportedInputConfigs, - SupportedOutputConfigs as EmscriptenSupportedOutputConfigs, - }; - - impl_platform_host!(Emscripten emscripten "Emscripten"); + pub use crate::host::emscripten::Host as EmscriptenHost; + impl_platform_host!(Emscripten => EmscriptenHost); /// The default host for the current compilation target platform. pub fn default_host() -> Host { @@ -661,13 +646,8 @@ mod platform_impl { #[cfg(all(target_arch = "wasm32", feature = "wasm-bindgen"))] mod platform_impl { - pub use crate::host::webaudio::{ - Device as WebAudioDevice, Devices as WebAudioDevices, Host as WebAudioHost, - Stream as WebAudioStream, SupportedInputConfigs as WebAudioSupportedInputConfigs, - SupportedOutputConfigs as WebAudioSupportedOutputConfigs, - }; - - impl_platform_host!(WebAudio webaudio "WebAudio"); + pub use crate::host::webaudio::Host as WebAudioHost; + impl_platform_host!(WebAudio => WebAudioHost); /// The default host for the current compilation target platform. pub fn default_host() -> Host { @@ -680,18 +660,13 @@ mod platform_impl { #[cfg(windows)] mod platform_impl { #[cfg(feature = "asio")] - pub use crate::host::asio::{ - Device as AsioDevice, Devices as AsioDevices, Host as AsioHost, Stream as AsioStream, - SupportedInputConfigs as AsioSupportedInputConfigs, - SupportedOutputConfigs as AsioSupportedOutputConfigs, - }; - pub use crate::host::wasapi::{ - Device as WasapiDevice, Devices as WasapiDevices, Host as WasapiHost, - Stream as WasapiStream, SupportedInputConfigs as WasapiSupportedInputConfigs, - SupportedOutputConfigs as WasapiSupportedOutputConfigs, - }; + pub use crate::host::asio::Host as AsioHost; + pub use crate::host::wasapi::Host as WasapiHost; - impl_platform_host!(#[cfg(feature = "asio")] Asio asio "ASIO", Wasapi wasapi "WASAPI"); + impl_platform_host!( + #[cfg(feature = "asio")] Asio => AsioHost, + Wasapi => WasapiHost, + ); /// The default host for the current compilation target platform. pub fn default_host() -> Host { @@ -703,13 +678,8 @@ mod platform_impl { #[cfg(target_os = "android")] mod platform_impl { - pub use crate::host::aaudio::{ - Device as AAudioDevice, Devices as AAudioDevices, Host as AAudioHost, - Stream as AAudioStream, SupportedInputConfigs as AAudioSupportedInputConfigs, - SupportedOutputConfigs as AAudioSupportedOutputConfigs, - }; - - impl_platform_host!(AAudio aaudio "AAudio"); + pub use crate::host::aaudio::Host as AAudioHost; + impl_platform_host!(AAudio => AAudioHost); /// The default host for the current compilation target platform. pub fn default_host() -> Host { @@ -732,13 +702,9 @@ mod platform_impl { all(target_arch = "wasm32", feature = "wasm-bindgen"), )))] mod platform_impl { - pub use crate::host::null::{ - Device as NullDevice, Devices as NullDevices, Host as NullHost, - SupportedInputConfigs as NullSupportedInputConfigs, - SupportedOutputConfigs as NullSupportedOutputConfigs, - }; + pub use crate::host::null::Host as NullHost; - impl_platform_host!(Null null "Null"); + impl_platform_host!(Null => NullHost); /// The default host for the current compilation target platform. pub fn default_host() -> Host {