Skip to content

Commit 9b334b4

Browse files
committed
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.
1 parent c77747d commit 9b334b4

File tree

2 files changed

+47
-122
lines changed

2 files changed

+47
-122
lines changed

src/host/null/mod.rs

Lines changed: 6 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@ use crate::{
88
SupportedStreamConfigsError,
99
};
1010

11-
#[derive(Default)]
12-
pub struct Devices;
13-
1411
#[derive(Clone, Debug, PartialEq, Eq)]
1512
pub struct Device;
1613

@@ -19,27 +16,16 @@ pub struct Host;
1916
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
2017
pub struct Stream;
2118

22-
#[derive(Clone)]
23-
pub struct SupportedInputConfigs;
24-
#[derive(Clone)]
25-
pub struct SupportedOutputConfigs;
26-
2719
impl Host {
2820
#[allow(dead_code)]
2921
pub fn new() -> Result<Self, crate::HostUnavailable> {
3022
Ok(Host)
3123
}
3224
}
3325

34-
impl Devices {
35-
pub fn new() -> Result<Self, DevicesError> {
36-
Ok(Devices)
37-
}
38-
}
39-
4026
impl DeviceTrait for Device {
41-
type SupportedInputConfigs = SupportedInputConfigs;
42-
type SupportedOutputConfigs = SupportedOutputConfigs;
27+
type SupportedInputConfigs = std::iter::Empty<SupportedStreamConfigRange>;
28+
type SupportedOutputConfigs = std::iter::Empty<SupportedStreamConfigRange>;
4329
type Stream = Stream;
4430

4531
#[inline]
@@ -50,14 +36,14 @@ impl DeviceTrait for Device {
5036
#[inline]
5137
fn supported_input_configs(
5238
&self,
53-
) -> Result<SupportedInputConfigs, SupportedStreamConfigsError> {
39+
) -> Result<Self::SupportedInputConfigs, SupportedStreamConfigsError> {
5440
unimplemented!()
5541
}
5642

5743
#[inline]
5844
fn supported_output_configs(
5945
&self,
60-
) -> Result<SupportedOutputConfigs, SupportedStreamConfigsError> {
46+
) -> Result<Self::SupportedOutputConfigs, SupportedStreamConfigsError> {
6147
unimplemented!()
6248
}
6349

@@ -104,15 +90,15 @@ impl DeviceTrait for Device {
10490
}
10591

10692
impl HostTrait for Host {
107-
type Devices = Devices;
93+
type Devices = std::iter::Empty<Device>;
10894
type Device = Device;
10995

11096
fn is_available() -> bool {
11197
false
11298
}
11399

114100
fn devices(&self) -> Result<Self::Devices, DevicesError> {
115-
Devices::new()
101+
Ok(std::iter::empty())
116102
}
117103

118104
fn default_input_device(&self) -> Option<Device> {
@@ -133,30 +119,3 @@ impl StreamTrait for Stream {
133119
unimplemented!()
134120
}
135121
}
136-
137-
impl Iterator for Devices {
138-
type Item = Device;
139-
140-
#[inline]
141-
fn next(&mut self) -> Option<Device> {
142-
None
143-
}
144-
}
145-
146-
impl Iterator for SupportedInputConfigs {
147-
type Item = SupportedStreamConfigRange;
148-
149-
#[inline]
150-
fn next(&mut self) -> Option<SupportedStreamConfigRange> {
151-
None
152-
}
153-
}
154-
155-
impl Iterator for SupportedOutputConfigs {
156-
type Item = SupportedStreamConfigRange;
157-
158-
#[inline]
159-
fn next(&mut self) -> Option<SupportedStreamConfigRange> {
160-
None
161-
}
162-
}

src/platform/mod.rs

Lines changed: 41 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub use self::platform_impl::*;
3333
/// SupportedOutputConfigs and all their necessary trait implementations.
3434
///
3535
macro_rules! impl_platform_host {
36-
($($(#[cfg($feat: meta)])? $HostVariant:ident $host_mod:ident $host_name:literal),*) => {
36+
($($(#[cfg($feat: meta)])? $HostVariant:ident => $Host:ty),* $(,)?) => {
3737
/// All hosts supported by CPAL on this platform.
3838
pub const ALL_HOSTS: &'static [HostId] = &[
3939
$(
@@ -91,47 +91,47 @@ macro_rules! impl_platform_host {
9191
pub enum DeviceInner {
9292
$(
9393
$(#[cfg($feat)])?
94-
$HostVariant(crate::host::$host_mod::Device),
94+
$HostVariant(<$Host as crate::traits::HostTrait>::Device),
9595
)*
9696
}
9797

9898
/// Contains a platform specific [`Devices`] implementation.
9999
pub enum DevicesInner {
100100
$(
101101
$(#[cfg($feat)])?
102-
$HostVariant(crate::host::$host_mod::Devices),
102+
$HostVariant(<$Host as crate::traits::HostTrait>::Devices),
103103
)*
104104
}
105105

106106
/// Contains a platform specific [`Host`] implementation.
107107
pub enum HostInner {
108108
$(
109109
$(#[cfg($feat)])?
110-
$HostVariant(crate::host::$host_mod::Host),
110+
$HostVariant($Host),
111111
)*
112112
}
113113

114114
/// Contains a platform specific [`Stream`] implementation.
115115
pub enum StreamInner {
116116
$(
117117
$(#[cfg($feat)])?
118-
$HostVariant(crate::host::$host_mod::Stream),
118+
$HostVariant(<<$Host as crate::traits::HostTrait>::Device as crate::traits::DeviceTrait>::Stream),
119119
)*
120120
}
121121

122122
#[derive(Clone)]
123123
enum SupportedInputConfigsInner {
124124
$(
125125
$(#[cfg($feat)])?
126-
$HostVariant(crate::host::$host_mod::SupportedInputConfigs),
126+
$HostVariant(<<$Host as crate::traits::HostTrait>::Device as crate::traits::DeviceTrait>::SupportedInputConfigs),
127127
)*
128128
}
129129

130130
#[derive(Clone)]
131131
enum SupportedOutputConfigsInner {
132132
$(
133133
$(#[cfg($feat)])?
134-
$HostVariant(crate::host::$host_mod::SupportedOutputConfigs),
134+
$HostVariant(<<$Host as crate::traits::HostTrait>::Device as crate::traits::DeviceTrait>::SupportedInputConfigs),
135135
)*
136136
}
137137

@@ -140,7 +140,7 @@ macro_rules! impl_platform_host {
140140
match self {
141141
$(
142142
$(#[cfg($feat)])?
143-
HostId::$HostVariant => $host_name,
143+
HostId::$HostVariant => stringify!($HostVariant),
144144
)*
145145
}
146146
}
@@ -442,7 +442,7 @@ macro_rules! impl_platform_host {
442442
fn is_available() -> bool {
443443
$(
444444
$(#[cfg($feat)])?
445-
if crate::host::$host_mod::Host::is_available() { return true; }
445+
if <$Host>::is_available() { return true; }
446446
)*
447447
false
448448
}
@@ -531,29 +531,29 @@ macro_rules! impl_platform_host {
531531

532532
$(
533533
$(#[cfg($feat)])?
534-
impl From<crate::host::$host_mod::Device> for Device {
535-
fn from(h: crate::host::$host_mod::Device) -> Self {
534+
impl From<<$Host as crate::traits::HostTrait>::Device> for Device {
535+
fn from(h: <$Host as crate::traits::HostTrait>::Device) -> Self {
536536
DeviceInner::$HostVariant(h).into()
537537
}
538538
}
539539

540540
$(#[cfg($feat)])?
541-
impl From<crate::host::$host_mod::Devices> for Devices {
542-
fn from(h: crate::host::$host_mod::Devices) -> Self {
541+
impl From<<$Host as crate::traits::HostTrait>::Devices> for Devices {
542+
fn from(h: <$Host as crate::traits::HostTrait>::Devices) -> Self {
543543
DevicesInner::$HostVariant(h).into()
544544
}
545545
}
546546

547547
$(#[cfg($feat)])?
548-
impl From<crate::host::$host_mod::Host> for Host {
549-
fn from(h: crate::host::$host_mod::Host) -> Self {
548+
impl From<$Host> for Host {
549+
fn from(h: $Host) -> Self {
550550
HostInner::$HostVariant(h).into()
551551
}
552552
}
553553

554554
$(#[cfg($feat)])?
555-
impl From<crate::host::$host_mod::Stream> for Stream {
556-
fn from(h: crate::host::$host_mod::Stream) -> Self {
555+
impl From<<<$Host as crate::traits::HostTrait>::Device as crate::traits::DeviceTrait>::Stream> for Stream {
556+
fn from(h: <<$Host as crate::traits::HostTrait>::Device as crate::traits::DeviceTrait>::Stream) -> Self {
557557
StreamInner::$HostVariant(h).into()
558558
}
559559
}
@@ -564,7 +564,7 @@ macro_rules! impl_platform_host {
564564
let mut host_ids = vec![];
565565
$(
566566
$(#[cfg($feat)])?
567-
if <crate::host::$host_mod::Host as crate::traits::HostTrait>::is_available() {
567+
if <$Host as crate::traits::HostTrait>::is_available() {
568568
host_ids.push(HostId::$HostVariant);
569569
}
570570
)*
@@ -577,7 +577,7 @@ macro_rules! impl_platform_host {
577577
$(
578578
$(#[cfg($feat)])?
579579
HostId::$HostVariant => {
580-
crate::host::$host_mod::Host::new()
580+
<$Host>::new()
581581
.map(HostInner::$HostVariant)
582582
.map(Host::from)
583583
}
@@ -601,19 +601,14 @@ macro_rules! impl_platform_host {
601601
target_os = "netbsd"
602602
))]
603603
mod platform_impl {
604-
pub use crate::host::alsa::{
605-
Device as AlsaDevice, Devices as AlsaDevices, Host as AlsaHost, Stream as AlsaStream,
606-
SupportedInputConfigs as AlsaSupportedInputConfigs,
607-
SupportedOutputConfigs as AlsaSupportedOutputConfigs,
608-
};
604+
pub use crate::host::alsa::Host as AlsaHost;
609605
#[cfg(feature = "jack")]
610-
pub use crate::host::jack::{
611-
Device as JackDevice, Devices as JackDevices, Host as JackHost, Stream as JackStream,
612-
SupportedInputConfigs as JackSupportedInputConfigs,
613-
SupportedOutputConfigs as JackSupportedOutputConfigs,
614-
};
606+
pub use crate::host::jack::Host as JackHost;
615607

616-
impl_platform_host!(#[cfg(feature = "jack")] Jack jack "JACK", Alsa alsa "ALSA");
608+
impl_platform_host!(
609+
#[cfg(feature = "jack")] Jack => JackHost,
610+
Alsa => AlsaHost,
611+
);
617612

618613
/// The default host for the current compilation target platform.
619614
pub fn default_host() -> Host {
@@ -625,13 +620,8 @@ mod platform_impl {
625620

626621
#[cfg(any(target_os = "macos", target_os = "ios"))]
627622
mod platform_impl {
628-
pub use crate::host::coreaudio::{
629-
Device as CoreAudioDevice, Devices as CoreAudioDevices, Host as CoreAudioHost,
630-
Stream as CoreAudioStream, SupportedInputConfigs as CoreAudioSupportedInputConfigs,
631-
SupportedOutputConfigs as CoreAudioSupportedOutputConfigs,
632-
};
633-
634-
impl_platform_host!(CoreAudio coreaudio "CoreAudio");
623+
pub use crate::host::coreaudio::Host as CoreAudioHost;
624+
impl_platform_host!(CoreAudio => CoreAudioHost);
635625

636626
/// The default host for the current compilation target platform.
637627
pub fn default_host() -> Host {
@@ -643,13 +633,8 @@ mod platform_impl {
643633

644634
#[cfg(target_os = "emscripten")]
645635
mod platform_impl {
646-
pub use crate::host::emscripten::{
647-
Device as EmscriptenDevice, Devices as EmscriptenDevices, Host as EmscriptenHost,
648-
Stream as EmscriptenStream, SupportedInputConfigs as EmscriptenSupportedInputConfigs,
649-
SupportedOutputConfigs as EmscriptenSupportedOutputConfigs,
650-
};
651-
652-
impl_platform_host!(Emscripten emscripten "Emscripten");
636+
pub use crate::host::emscripten::Host as EmscriptenHost;
637+
impl_platform_host!(Emscripten => EmscriptenHost);
653638

654639
/// The default host for the current compilation target platform.
655640
pub fn default_host() -> Host {
@@ -661,13 +646,8 @@ mod platform_impl {
661646

662647
#[cfg(all(target_arch = "wasm32", feature = "wasm-bindgen"))]
663648
mod platform_impl {
664-
pub use crate::host::webaudio::{
665-
Device as WebAudioDevice, Devices as WebAudioDevices, Host as WebAudioHost,
666-
Stream as WebAudioStream, SupportedInputConfigs as WebAudioSupportedInputConfigs,
667-
SupportedOutputConfigs as WebAudioSupportedOutputConfigs,
668-
};
669-
670-
impl_platform_host!(WebAudio webaudio "WebAudio");
649+
pub use crate::host::webaudio::Host as WebAudioHost;
650+
impl_platform_host!(WebAudio => WebAudioHost);
671651

672652
/// The default host for the current compilation target platform.
673653
pub fn default_host() -> Host {
@@ -680,18 +660,13 @@ mod platform_impl {
680660
#[cfg(windows)]
681661
mod platform_impl {
682662
#[cfg(feature = "asio")]
683-
pub use crate::host::asio::{
684-
Device as AsioDevice, Devices as AsioDevices, Host as AsioHost, Stream as AsioStream,
685-
SupportedInputConfigs as AsioSupportedInputConfigs,
686-
SupportedOutputConfigs as AsioSupportedOutputConfigs,
687-
};
688-
pub use crate::host::wasapi::{
689-
Device as WasapiDevice, Devices as WasapiDevices, Host as WasapiHost,
690-
Stream as WasapiStream, SupportedInputConfigs as WasapiSupportedInputConfigs,
691-
SupportedOutputConfigs as WasapiSupportedOutputConfigs,
692-
};
663+
pub use crate::host::asio::Host as AsioHost;
664+
pub use crate::host::wasapi::Host as WasapiHost;
693665

694-
impl_platform_host!(#[cfg(feature = "asio")] Asio asio "ASIO", Wasapi wasapi "WASAPI");
666+
impl_platform_host!(
667+
#[cfg(feature = "asio")] Asio => AsioHost,
668+
Wasapi => WasapiHost,
669+
);
695670

696671
/// The default host for the current compilation target platform.
697672
pub fn default_host() -> Host {
@@ -703,13 +678,8 @@ mod platform_impl {
703678

704679
#[cfg(target_os = "android")]
705680
mod platform_impl {
706-
pub use crate::host::aaudio::{
707-
Device as AAudioDevice, Devices as AAudioDevices, Host as AAudioHost,
708-
Stream as AAudioStream, SupportedInputConfigs as AAudioSupportedInputConfigs,
709-
SupportedOutputConfigs as AAudioSupportedOutputConfigs,
710-
};
711-
712-
impl_platform_host!(AAudio aaudio "AAudio");
681+
pub use crate::host::aaudio::Host as AAudioHost;
682+
impl_platform_host!(AAudio => AAudioHost);
713683

714684
/// The default host for the current compilation target platform.
715685
pub fn default_host() -> Host {
@@ -732,13 +702,9 @@ mod platform_impl {
732702
all(target_arch = "wasm32", feature = "wasm-bindgen"),
733703
)))]
734704
mod platform_impl {
735-
pub use crate::host::null::{
736-
Device as NullDevice, Devices as NullDevices, Host as NullHost,
737-
SupportedInputConfigs as NullSupportedInputConfigs,
738-
SupportedOutputConfigs as NullSupportedOutputConfigs,
739-
};
705+
pub use crate::host::null::Host as NullHost;
740706

741-
impl_platform_host!(Null null "Null");
707+
impl_platform_host!(Null => NullHost);
742708

743709
/// The default host for the current compilation target platform.
744710
pub fn default_host() -> Host {

0 commit comments

Comments
 (0)