Skip to main content

Cross-platform audio device mapping with UID support

Project description

AudioMap

Python Version Platform

Cross-platform audio device mapping library for macOS, Windows, and Linux with comprehensive device UID support for both input and output audio devices.

Features

  • 🔍 Cross-platform: Support for macOS, Windows, and Linux
  • 🎤 Input Device Detection: Detect microphones, line inputs, and other audio input devices
  • 🔊 Output Device Detection: Detect speakers, headphones, and other audio output devices
  • 🆔 Device UID Support: Get unique device identifiers (UIDs) for precise device targeting
  • 📝 Unified API: Same API interface across all platforms
  • 🛠️ Native Implementation:
    • macOS: Uses CoreAudio API with native UID support
    • Windows: Uses pycaw + comtypes with device ID extraction
    • Linux: Uses ALSA tools with device identifier mapping
  • 🎯 Lightweight: Minimal dependencies, high performance
  • 📱 Command Line Tool: Built-in CLI interface

Installation

Basic Installation

pip install audiomap

Platform-specific Dependencies

Windows:

pip install audiomap[windows]

Development:

pip install audiomap[dev]

Platform-specific Dependencies

Windows users need additional packages:

pip install audiomap[windows]

Developer installation:

pip install audiomap[dev]

Quick Start

Basic Usage

from audiomap import list_audio_input_devices, list_audio_output_devices

# List all input devices
input_devices = list_audio_input_devices()
for device in input_devices:
    print(f"Input device: {device['name']} (UID: {device['id']})")

# List all output devices
output_devices = list_audio_output_devices()
for device in output_devices:
    print(f"Output device: {device['name']} (UID: {device['id']})")

Using Class Interface

from audiomap import AudioDeviceDetector

detector = AudioDeviceDetector()

# Get all devices with UIDs
all_devices = detector.list_all_devices()
print(f"Input devices: {len(all_devices['input'])}")
print(f"Output devices: {len(all_devices['output'])}")

# Display device information including UIDs
for device in all_devices['input']:
    print(f"Input: {device['name']} (UID: {device['id']})")
    
for device in all_devices['output']:
    print(f"Output: {device['name']} (UID: {device['id']})")

# Find specific devices by name
macbook_devices = detector.find_device_by_name("MacBook")
for device in macbook_devices:
    print(f"Found device: {device['name']} - UID: {device['id']}")

# Get device statistics
stats = detector.get_device_count()
print(f"Total: {stats['total']} audio devices")

Command Line Usage

# List all devices with UIDs
audiomap

# List input devices only
audiomap --input-only

# List output devices only
audiomap --output-only

# JSON format output with UIDs
audiomap --json

# Find devices containing "MacBook"
audiomap --find "MacBook"

# Show device count only
audiomap --count-only

API Documentation

Utility Functions

list_audio_input_devices()

Returns a list of all audio input devices with their unique identifiers.

Returns:

  • List[Dict[str, str]]: Device list, each device contains:
    • id: Device unique identifier (UID) - platform-specific format
    • name: Human-readable device name
    • platform: Platform name ("Windows", "Darwin", "Linux")

list_audio_output_devices()

Returns a list of all audio output devices with their unique identifiers.

Returns:

  • List[Dict[str, str]]: Device list (same format as above)

AudioDeviceDetector Class

list_input_devices()

List all audio input devices.

list_output_devices()

List all audio output devices.

list_all_devices()

List all audio devices.

Returns:

{
    "input": List[Dict[str, str]],
    "output": List[Dict[str, str]]
}

get_device_count()

Get device count statistics.

Returns:

{
    "input": int,    # Number of input devices
    "output": int,   # Number of output devices  
    "total": int     # Total number of devices
}

find_device_by_name(name, device_type="both")

Find devices by name.

Parameters:

  • name (str): Device name (supports partial matching)
  • device_type (str): Device type, options: "input", "output", "both"

Platform Requirements

macOS

  • No additional dependencies (uses built-in CoreAudio)
  • Supports all audio device types
  • UID Format: CoreAudio device UID (e.g., "BuiltInSpeakers", "AppleUSBAudioEngine:...")

Windows

  • Requires installation: pip install pycaw comtypes
  • Supports WASAPI devices
  • UID Format: Windows device ID (e.g., "{0.0.0.00000000}.{12345678-...}")

Linux

  • Requires ALSA tools: sudo apt-get install alsa-utils
  • Supports ALSA and PulseAudio/PipeWire devices
  • UID Format: ALSA device name (e.g., "default", "hw:0,0", "pulse")

Device UID Support

AudioMap provides comprehensive device UID support across all platforms:

What are Device UIDs?

Device UIDs (Unique Identifiers) are platform-specific strings that uniquely identify audio devices. Unlike device names which can change or be duplicated, UIDs provide a reliable way to target specific audio hardware.

Platform-Specific UID Implementation

  • macOS: Uses CoreAudio's native device UID system
  • Windows: Extracts Windows device IDs through WASAPI
  • Linux: Uses ALSA device identifiers

Using UIDs in Your Application

devices = list_audio_input_devices()
for device in devices:
    uid = device['id']          # Platform-specific unique identifier
    name = device['name']       # Human-readable name
    platform = device['platform']  # Platform identifier
    
    print(f"Device: {name}")
    print(f"UID: {uid}")
    print(f"Platform: {platform}")

Error Handling

from audiomap import AudioDeviceDetector
from audiomap.exceptions import AudioDetectionError, DependencyMissingError

try:
    detector = AudioDeviceDetector()
    devices = detector.list_input_devices()
except DependencyMissingError as e:
    print(f"Missing dependency: {e}")
except AudioDetectionError as e:
    print(f"Detection error: {e}")

Output Examples

macOS Output Example

=== Audio Input Devices ===
Found 3 input devices:
  1. MacBook Pro Microphone (UID: BuiltInMicrophoneDevice)
  2. WH-1000XM6 (UID: 58-18-62-13-51-61:input)
  3. BlackHole 2ch (UID: BlackHole2ch_UID)

=== Audio Output Devices ===
Found 4 output devices:
  1. MacBook Pro Speakers (UID: BuiltInSpeakerDevice)
  2. WH-1000XM6 (UID: 58-18-62-13-51-61:output)
  3. BlackHole 2ch (UID: BlackHole2ch_UID)
  4. Multi-Output Device (UID: ~:AMS2_StackedOutput:0)

Development

Setup Development Environment

git clone https://github.com/yourusername/audiomap.git
cd audiomap
pip install -e .[dev]

Run Tests

pytest tests/

Build Package

python -m build

License

MIT License - see LICENSE file for details.

Contributing

Issues and Pull Requests are welcome!

Changelog

v1.0.0

  • Initial release
  • Support for macOS, Windows, and Linux
  • Command line tool included
  • Complete error handling

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

audiomap-1.0.2.tar.gz (9.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

audiomap-1.0.2-py3-none-any.whl (11.3 kB view details)

Uploaded Python 3

File details

Details for the file audiomap-1.0.2.tar.gz.

File metadata

  • Download URL: audiomap-1.0.2.tar.gz
  • Upload date:
  • Size: 9.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.0

File hashes

Hashes for audiomap-1.0.2.tar.gz
Algorithm Hash digest
SHA256 be497dca4a00256370cf9298bbb20c07512a08e16629d96bdaaba274f5ac72d2
MD5 ffe5d2fb5edcb2b8e5bae3c8bff6d775
BLAKE2b-256 c36d1170c49c3cfdf95962a30f0217e198f5e8064456bc411d06742dc0cef400

See more details on using hashes here.

File details

Details for the file audiomap-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: audiomap-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 11.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.0

File hashes

Hashes for audiomap-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 7f62eb1f9ec26bab497b55c9f3aec186af7f6910b81325518a09bb682e9c1d35
MD5 ef35887aaa0e0baabb5667aefcc88f4e
BLAKE2b-256 e61c85750b6e4d4fa3f73ea3f34c14a281b14774896b4f63033b80f77beb458c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page