174 lines
5.1 KiB
Rust
174 lines
5.1 KiB
Rust
// Copyright © 2017-2018 Mozilla Foundation
|
|
//
|
|
// This program is made available under an ISC-style license. See the
|
|
// accompanying file LICENSE for details.
|
|
|
|
use callbacks::cubeb_device_collection_changed_callback;
|
|
use context::cubeb;
|
|
use std::os::raw::{c_char, c_int, c_uint, c_void};
|
|
use std::{fmt, mem};
|
|
|
|
cubeb_enum! {
|
|
pub enum cubeb_device_fmt {
|
|
CUBEB_DEVICE_FMT_S16LE = 0x0010,
|
|
CUBEB_DEVICE_FMT_S16BE = 0x0020,
|
|
CUBEB_DEVICE_FMT_F32LE = 0x1000,
|
|
CUBEB_DEVICE_FMT_F32BE = 0x2000,
|
|
}
|
|
}
|
|
|
|
#[cfg(target_endian = "big")]
|
|
pub const CUBEB_DEVICE_FMT_S16NE: cubeb_device_fmt = CUBEB_DEVICE_FMT_S16BE;
|
|
#[cfg(target_endian = "big")]
|
|
pub const CUBEB_DEVICE_FMT_F32NE: cubeb_device_fmt = CUBEB_DEVICE_FMT_F32BE;
|
|
#[cfg(target_endian = "little")]
|
|
pub const CUBEB_DEVICE_FMT_S16NE: cubeb_device_fmt = CUBEB_DEVICE_FMT_S16LE;
|
|
#[cfg(target_endian = "little")]
|
|
pub const CUBEB_DEVICE_FMT_F32NE: cubeb_device_fmt = CUBEB_DEVICE_FMT_F32LE;
|
|
|
|
pub const CUBEB_DEVICE_FMT_S16_MASK: cubeb_device_fmt =
|
|
CUBEB_DEVICE_FMT_S16LE | CUBEB_DEVICE_FMT_S16BE;
|
|
pub const CUBEB_DEVICE_FMT_F32_MASK: cubeb_device_fmt =
|
|
CUBEB_DEVICE_FMT_F32LE | CUBEB_DEVICE_FMT_F32BE;
|
|
pub const CUBEB_DEVICE_FMT_ALL: cubeb_device_fmt =
|
|
CUBEB_DEVICE_FMT_S16_MASK | CUBEB_DEVICE_FMT_F32_MASK;
|
|
|
|
cubeb_enum! {
|
|
pub enum cubeb_device_pref {
|
|
CUBEB_DEVICE_PREF_NONE = 0x00,
|
|
CUBEB_DEVICE_PREF_MULTIMEDIA = 0x01,
|
|
CUBEB_DEVICE_PREF_VOICE = 0x02,
|
|
CUBEB_DEVICE_PREF_NOTIFICATION = 0x04,
|
|
CUBEB_DEVICE_PREF_ALL = 0x0F,
|
|
}
|
|
}
|
|
|
|
cubeb_enum! {
|
|
pub enum cubeb_device_state {
|
|
CUBEB_DEVICE_STATE_DISABLED,
|
|
CUBEB_DEVICE_STATE_UNPLUGGED,
|
|
CUBEB_DEVICE_STATE_ENABLED,
|
|
}
|
|
}
|
|
cubeb_enum! {
|
|
pub enum cubeb_device_type {
|
|
CUBEB_DEVICE_TYPE_UNKNOWN,
|
|
CUBEB_DEVICE_TYPE_INPUT,
|
|
CUBEB_DEVICE_TYPE_OUTPUT,
|
|
}
|
|
}
|
|
|
|
pub type cubeb_devid = *const c_void;
|
|
|
|
#[repr(C)]
|
|
pub struct cubeb_device {
|
|
pub output_name: *mut c_char,
|
|
pub input_name: *mut c_char,
|
|
}
|
|
|
|
// Explicit Debug impl to work around bug in ctest
|
|
impl Default for cubeb_device {
|
|
fn default() -> Self {
|
|
unsafe { mem::zeroed() }
|
|
}
|
|
}
|
|
|
|
impl fmt::Debug for cubeb_device {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
f.debug_struct("cubeb_device")
|
|
.field("output_name", &self.output_name)
|
|
.field("input_name", &self.input_name)
|
|
.finish()
|
|
}
|
|
}
|
|
|
|
#[repr(C)]
|
|
pub struct cubeb_device_collection {
|
|
pub device: *mut cubeb_device_info,
|
|
pub count: usize,
|
|
}
|
|
|
|
impl Default for cubeb_device_collection {
|
|
fn default() -> Self {
|
|
unsafe { mem::zeroed() }
|
|
}
|
|
}
|
|
|
|
impl fmt::Debug for cubeb_device_collection {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
f.debug_struct("cubeb_device_collection")
|
|
.field("device", &self.device)
|
|
.field("count", &self.count)
|
|
.finish()
|
|
}
|
|
}
|
|
|
|
#[repr(C)]
|
|
pub struct cubeb_device_info {
|
|
pub devid: cubeb_devid,
|
|
pub device_id: *const c_char,
|
|
pub friendly_name: *const c_char,
|
|
pub group_id: *const c_char,
|
|
pub vendor_name: *const c_char,
|
|
|
|
pub device_type: cubeb_device_type,
|
|
pub state: cubeb_device_state,
|
|
pub preferred: cubeb_device_pref,
|
|
|
|
pub format: cubeb_device_fmt,
|
|
pub default_format: cubeb_device_fmt,
|
|
pub max_channels: c_uint,
|
|
pub default_rate: c_uint,
|
|
pub max_rate: c_uint,
|
|
pub min_rate: c_uint,
|
|
|
|
pub latency_lo: c_uint,
|
|
pub latency_hi: c_uint,
|
|
}
|
|
|
|
impl Default for cubeb_device_info {
|
|
fn default() -> Self {
|
|
unsafe { mem::zeroed() }
|
|
}
|
|
}
|
|
|
|
impl fmt::Debug for cubeb_device_info {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
f.debug_struct("cubeb_device_info")
|
|
.field("devid", &self.devid)
|
|
.field("device_id", &self.device_id)
|
|
.field("friendly_name", &self.friendly_name)
|
|
.field("group_id", &self.group_id)
|
|
.field("vendor_name", &self.vendor_name)
|
|
.field("device_type", &self.device_type)
|
|
.field("state", &self.state)
|
|
.field("preferred", &self.preferred)
|
|
.field("format", &self.format)
|
|
.field("default_format", &self.default_format)
|
|
.field("max_channels", &self.max_channels)
|
|
.field("default_rate", &self.default_rate)
|
|
.field("max_rate", &self.max_rate)
|
|
.field("min_rate", &self.min_rate)
|
|
.field("latency_lo", &self.latency_lo)
|
|
.field("latency_hi", &self.latency_hi)
|
|
.finish()
|
|
}
|
|
}
|
|
|
|
extern "C" {
|
|
pub fn cubeb_enumerate_devices(
|
|
context: *mut cubeb,
|
|
devtype: cubeb_device_type,
|
|
collection: *mut cubeb_device_collection,
|
|
) -> c_int;
|
|
pub fn cubeb_device_collection_destroy(
|
|
context: *mut cubeb,
|
|
collection: *mut cubeb_device_collection,
|
|
) -> c_int;
|
|
pub fn cubeb_register_device_collection_changed(
|
|
context: *mut cubeb,
|
|
devtype: cubeb_device_type,
|
|
callback: cubeb_device_collection_changed_callback,
|
|
user_ptr: *mut c_void,
|
|
) -> c_int;
|
|
}
|