cpal/src/error.rs

163 lines
6.4 KiB
Rust

use thiserror::Error;
/// The requested host, although supported on this platform, is unavailable.
#[derive(Clone, Debug, Error)]
#[error("the requested host is unavailable")]
pub struct HostUnavailable;
/// Some error has occurred that is specific to the backend from which it was produced.
///
/// This error is often used as a catch-all in cases where:
///
/// - It is unclear exactly what error might be produced by the backend API.
/// - It does not make sense to add a variant to the enclosing error type.
/// - No error was expected to occur at all, but we return an error to avoid the possibility of a
/// `panic!` caused by some unforseen or unknown reason.
///
/// **Note:** If you notice a `BackendSpecificError` that you believe could be better handled in a
/// cross-platform manner, please create an issue or submit a pull request with a patch that adds
/// the necessary error variant to the appropriate error enum.
#[derive(Clone, Debug, Error)]
#[error("A backend-specific error has occurred: {description}")]
pub struct BackendSpecificError {
pub description: String,
}
/// An error that might occur while attempting to enumerate the available devices on a system.
#[derive(Debug, Error)]
pub enum DevicesError {
/// See the `BackendSpecificError` docs for more information about this error variant.
#[error("{err}")]
BackendSpecific {
#[from]
err: BackendSpecificError,
},
}
/// An error that may occur while attempting to retrieve a device name.
#[derive(Debug, Error)]
pub enum DeviceNameError {
/// See the `BackendSpecificError` docs for more information about this error variant.
#[error("{err}")]
BackendSpecific {
#[from]
err: BackendSpecificError,
},
}
/// Error that can happen when enumerating the list of supported formats.
#[derive(Debug, Error)]
pub enum SupportedStreamConfigsError {
/// The device no longer exists. This can happen if the device is disconnected while the
/// program is running.
#[error("The requested device is no longer available. For example, it has been unplugged.")]
DeviceNotAvailable,
/// We called something the C-Layer did not understand
#[error(
"Invalid argument passed to the backend. For example, this happens when trying to read capture capabilities when the device does not support it."
)]
InvalidArgument,
/// See the `BackendSpecificError` docs for more information about this error variant.
#[error("{err}")]
BackendSpecific {
#[from]
err: BackendSpecificError,
},
}
/// May occur when attempting to request the default input or output stream format from a `Device`.
#[derive(Debug, Error)]
pub enum DefaultStreamConfigError {
/// The device no longer exists. This can happen if the device is disconnected while the
/// program is running.
#[error("The requested device is no longer available. For example, it has been unplugged.")]
DeviceNotAvailable,
/// Returned if e.g. the default input format was requested on an output-only audio device.
#[error("The requested stream type is not supported by the device.")]
StreamTypeNotSupported,
/// See the `BackendSpecificError` docs for more information about this error variant.
#[error("{err}")]
BackendSpecific {
#[from]
err: BackendSpecificError,
},
}
/// Error that can happen when creating a `Stream`.
#[derive(Debug, Error)]
pub enum BuildStreamError {
/// The device no longer exists. This can happen if the device is disconnected while the
/// program is running.
#[error("The requested device is no longer available. For example, it has been unplugged.")]
DeviceNotAvailable,
/// The specified stream configuration is not supported.
#[error("The requested stream configuration is not supported by the device.")]
StreamConfigNotSupported,
/// We called something the C-Layer did not understand
///
/// On ALSA device functions called with a feature they do not support will yield this. E.g.
/// Trying to use capture capabilities on an output only format yields this.
#[error("The requested device does not support this capability (invalid argument)")]
InvalidArgument,
/// Occurs if adding a new Stream ID would cause an integer overflow.
#[error("Adding a new stream ID would cause an overflow")]
StreamIdOverflow,
/// See the `BackendSpecificError` docs for more information about this error variant.
#[error("{err}")]
BackendSpecific {
#[from]
err: BackendSpecificError,
},
}
/// Errors that might occur when calling `play_stream`.
///
/// As of writing this, only macOS may immediately return an error while calling this method. This
/// is because both the alsa and wasapi backends only enqueue these commands and do not process
/// them immediately.
#[derive(Debug, Error)]
pub enum PlayStreamError {
/// The device associated with the stream is no longer available.
#[error("the device associated with the stream is no longer available")]
DeviceNotAvailable,
/// See the `BackendSpecificError` docs for more information about this error variant.
#[error("{err}")]
BackendSpecific {
#[from]
err: BackendSpecificError,
},
}
/// Errors that might occur when calling `pause_stream`.
///
/// As of writing this, only macOS may immediately return an error while calling this method. This
/// is because both the alsa and wasapi backends only enqueue these commands and do not process
/// them immediately.
#[derive(Debug, Error)]
pub enum PauseStreamError {
/// The device associated with the stream is no longer available.
#[error("the device associated with the stream is no longer available")]
DeviceNotAvailable,
/// See the `BackendSpecificError` docs for more information about this error variant.
#[error("{err}")]
BackendSpecific {
#[from]
err: BackendSpecificError,
},
}
/// Errors that might occur while a stream is running.
#[derive(Debug, Error)]
pub enum StreamError {
/// The device no longer exists. This can happen if the device is disconnected while the
/// program is running.
#[error("The requested device is no longer available. For example, it has been unplugged.")]
DeviceNotAvailable,
/// See the `BackendSpecificError` docs for more information about this error variant.
#[error("{err}")]
BackendSpecific {
#[from]
err: BackendSpecificError,
},
}