use crate::raw::abi::AudioServerPlugInDriverInterface;
use crate::raw::entry;
struct StaticInterface(AudioServerPlugInDriverInterface);
unsafe impl Sync for StaticInterface {}
static DRIVER_INTERFACE: StaticInterface = StaticInterface(AudioServerPlugInDriverInterface {
_reserved: core::ptr::null(),
QueryInterface: Some(entry::query_interface),
AddRef: Some(entry::add_ref),
Release: Some(entry::release),
Initialize: Some(entry::initialize),
CreateDevice: None,
DestroyDevice: None,
AddDeviceClient: Some(entry::add_device_client),
RemoveDeviceClient: Some(entry::remove_device_client),
PerformDeviceConfigurationChange: None,
AbortDeviceConfigurationChange: None,
HasProperty: Some(entry::has_property),
IsPropertySettable: Some(entry::is_property_settable),
GetPropertyDataSize: Some(entry::get_property_data_size),
GetPropertyData: Some(entry::get_property_data),
SetPropertyData: Some(entry::set_property_data),
StartIO: Some(entry::start_io),
StopIO: Some(entry::stop_io),
GetZeroTimeStamp: Some(entry::get_zero_time_stamp),
WillDoIOOperation: Some(entry::will_do_io_operation),
BeginIOOperation: Some(entry::begin_io_operation),
DoIOOperation: Some(entry::do_io_operation),
EndIOOperation: Some(entry::end_io_operation),
});
#[must_use]
pub fn driver_interface() -> &'static AudioServerPlugInDriverInterface {
&DRIVER_INTERFACE.0
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn iunknown_preamble_is_wired() {
let vtable = driver_interface();
assert!(vtable._reserved.is_null());
assert!(vtable.QueryInterface.is_some());
assert!(vtable.AddRef.is_some());
assert!(vtable.Release.is_some());
}
#[test]
fn lifecycle_property_and_io_timing_slots_are_wired() {
let vtable = driver_interface();
assert!(vtable.Initialize.is_some());
assert!(vtable.AddDeviceClient.is_some());
assert!(vtable.RemoveDeviceClient.is_some());
assert!(vtable.HasProperty.is_some());
assert!(vtable.IsPropertySettable.is_some());
assert!(vtable.GetPropertyDataSize.is_some());
assert!(vtable.GetPropertyData.is_some());
assert!(vtable.SetPropertyData.is_some());
assert!(vtable.StartIO.is_some());
assert!(vtable.StopIO.is_some());
assert!(vtable.GetZeroTimeStamp.is_some());
assert!(vtable.WillDoIOOperation.is_some());
assert!(vtable.BeginIOOperation.is_some());
assert!(vtable.DoIOOperation.is_some());
assert!(vtable.EndIOOperation.is_some());
}
#[test]
fn deferred_slots_are_none() {
let vtable = driver_interface();
assert!(vtable.CreateDevice.is_none());
assert!(vtable.DestroyDevice.is_none());
assert!(vtable.PerformDeviceConfigurationChange.is_none());
assert!(vtable.AbortDeviceConfigurationChange.is_none());
}
#[test]
fn the_table_is_a_single_shared_instance() {
assert!(core::ptr::eq(driver_interface(), driver_interface()));
}
}