Python bindings for PortAudio library providing cross-platform audio I/O functionality with NumPy integration.
—
Functions to discover, query, and validate audio devices and host APIs. These functions are essential for configuring audio hardware, ensuring compatibility across different systems, and optimizing audio performance for specific platforms.
Query information about available audio devices, including input and output capabilities, supported sample rates, and channel configurations.
def query_devices(device=None, kind=None):
"""
Query information about available audio devices.
Parameters:
- device (int or str, optional): Device index or name to query specific device
- kind (str, optional): 'input' or 'output' to filter device types
Returns:
DeviceList or dict: List of all devices or single device information dict
"""Query information about available host APIs (audio system backends) such as ASIO, DirectSound, WASAPI, Core Audio, ALSA, and JACK.
def query_hostapis(index=None):
"""
Query information about available host APIs.
Parameters:
- index (int, optional): Host API index to query specific API
Returns:
tuple or dict: Tuple of all host APIs or single host API information dict
"""Validate input and output device settings before use, ensuring compatibility and preventing runtime errors.
def check_input_settings(device=None, channels=None, dtype=None, extra_settings=None, samplerate=None):
"""
Check if input device settings are valid.
Parameters:
- device (int or str, optional): Input device to check
- channels (int, optional): Number of input channels
- dtype (str or numpy.dtype, optional): Input data type
- extra_settings (settings object, optional): Host-API-specific settings
- samplerate (float, optional): Sample rate in Hz
Returns:
None
Raises:
PortAudioError: If settings are invalid
"""
def check_output_settings(device=None, channels=None, dtype=None, extra_settings=None, samplerate=None):
"""
Check if output device settings are valid.
Parameters:
- device (int or str, optional): Output device to check
- channels (int, optional): Number of output channels
- dtype (str or numpy.dtype, optional): Output data type
- extra_settings (settings object, optional): Host-API-specific settings
- samplerate (float, optional): Sample rate in Hz
Returns:
None
Raises:
PortAudioError: If settings are invalid
"""import sounddevice as sd
# List all available devices
devices = sd.query_devices()
print(devices)
# List only input devices
input_devices = sd.query_devices(kind='input')
print("Input devices:")
for i, device in enumerate(input_devices):
print(f" {i}: {device['name']}")
# List only output devices
output_devices = sd.query_devices(kind='output')
print("Output devices:")
for i, device in enumerate(output_devices):
print(f" {i}: {device['name']}")import sounddevice as sd
# Get information about default input device
default_input = sd.query_devices(kind='input')
print(f"Default input device: {default_input}")
# Get information about a specific device by index
device_info = sd.query_devices(device=1)
print(f"Device 1: {device_info}")
# Get information about a device by name (partial match)
usb_devices = [d for d in sd.query_devices() if 'USB' in d['name']]
if usb_devices:
print(f"USB device: {usb_devices[0]}")import sounddevice as sd
# List all available host APIs
hostapis = sd.query_hostapis()
print("Available host APIs:")
for i, api in enumerate(hostapis):
print(f" {i}: {api['name']} ({api['device_count']} devices)")
# Get information about a specific host API
if len(hostapis) > 0:
api_info = sd.query_hostapis(index=0)
print(f"Host API 0: {api_info}")import sounddevice as sd
try:
# Check if we can record from default input device
sd.check_input_settings(
channels=2,
samplerate=44100,
dtype='float32'
)
print("Input settings are valid")
# Check if we can play to default output device
sd.check_output_settings(
channels=2,
samplerate=44100,
dtype='float32'
)
print("Output settings are valid")
except sd.PortAudioError as e:
print(f"Invalid settings: {e}")import sounddevice as sd
def find_best_input_device():
"""Find the best input device with highest sample rate support."""
devices = sd.query_devices(kind='input')
best_device = None
best_samplerate = 0
for i, device in enumerate(devices):
if device['max_input_channels'] > 0:
# Test supported sample rates
for rate in [96000, 48000, 44100, 22050]:
try:
sd.check_input_settings(
device=i,
samplerate=rate,
channels=min(2, device['max_input_channels'])
)
if rate > best_samplerate:
best_device = i
best_samplerate = rate
break
except sd.PortAudioError:
continue
return best_device, best_samplerate
device_idx, samplerate = find_best_input_device()
if device_idx is not None:
device_info = sd.query_devices(device=device_idx)
print(f"Best input device: {device_info['name']} at {samplerate} Hz")Device information dictionaries contain the following keys:
{
'name': str, # Device name
'index': int, # Device index
'hostapi': int, # Host API index
'max_input_channels': int, # Maximum input channels
'max_output_channels': int, # Maximum output channels
'default_low_input_latency': float, # Low latency for input
'default_low_output_latency': float, # Low latency for output
'default_high_input_latency': float, # High latency for input
'default_high_output_latency': float, # High latency for output
'default_samplerate': float # Default sample rate
}Host API information dictionaries contain:
{
'name': str, # Host API name (e.g., 'WASAPI', 'DirectSound', 'ASIO')
'device_count': int, # Number of devices using this host API
'default_input_device': int, # Default input device index (-1 if none)
'default_output_device': int, # Default output device index (-1 if none)
'type': int # Host API type identifier
}Install with Tessl CLI
npx tessl i tessl/pypi-sounddevice