A macOS menu bar application that enables simultaneous audio output to multiple devices. Share your audio to multiple AirPods, headphones, or speakers at the same time with independent volume control for each device.
- π§ Multi-Device Audio Sharing: Route audio to multiple output devices simultaneously
- π Independent Volume Control: Adjust volume for each device individually
- π Automatic Device Discovery: Automatically detects and lists available audio output devices
- π― Real-Time Updates: Device list refreshes automatically as devices connect/disconnect
- π₯οΈ Menu Bar Integration: Clean, accessible interface from your macOS menu bar
- β‘ Low Latency: Built on CoreAudio HAL for optimal performance
- macOS 14.0 or later
- Xcode 15.0 or later (for building from source)
- Swift 5.9+
- Clone this repository:
git clone https://github.com/yourusername/sound-pro.git
cd sound-pro- Open the project in Xcode:
open "Sound Pro.xcodeproj"- Build and run the project (βR) or create an archive for distribution.
Sound Pro requires access to modify system audio settings. The app is configured with the necessary entitlements (App Sandbox disabled) to allow:
- Creating aggregate audio devices
- Setting the default output device
- Controlling individual device volumes
- Launch Sound Pro from your Applications folder or build and run from Xcode
- Click the headphones icon in your menu bar
- Select one or more audio output devices from the list
- Adjust individual volume sliders for each selected device
- Audio will automatically route to all selected devices
- The app automatically restores your previous default output device when you stop sharing
- Selected devices are remembered by their unique identifier (UID), so they'll remain selected even if they disconnect and reconnect
- For best results with Bluetooth devices, ensure drift compensation is enabled (handled automatically)
Sound Pro uses macOS CoreAudio's Hardware Abstraction Layer (HAL) to:
- Discover Devices: Scans for all available audio output devices using
AudioObjectGetPropertyData - Create Aggregate Device: Uses
AudioHardwareCreateAggregateDeviceto create a multi-output aggregate device - Route Audio: Sets the aggregate device as the system's default output device
- Control Volumes: Independently adjusts volume on each constituent device using
kAudioDevicePropertyVolumeScalar
The aggregate device is configured as a "stacked" device (kAudioAggregateDeviceIsStackedKey = 1), which means the same audio signal is sent to all outputs simultaneously, rather than combining channels.
- ContentView.swift: Main SwiftUI interface and device list
- AudioManager: Manages device discovery, selection, and aggregate device lifecycle
- AggregateBuilder: Handles creation and destruction of CoreAudio aggregate devices
- DeviceDiscovery: Scans and filters available audio output devices
- CoreAudioUtils: Low-level CoreAudio property access utilities
- Ensure devices are connected and powered on
- Check System Settings > Sound to verify devices are recognized by macOS
- Try disconnecting and reconnecting Bluetooth devices
- The app automatically enables drift compensation for non-master devices
- If you experience echo or sync issues, try selecting a different device as the master (first selected device)
- Some devices may not support software volume control
- Check Audio MIDI Setup to verify device capabilities
- Volume changes are applied directly to the device, not the aggregate
Sound Pro/
βββ Sound_ProApp.swift # App entry point and menu bar setup
βββ ContentView.swift # Main UI and audio management logic
βββ Sound_Pro.entitlements # App entitlements (sandbox disabled)
- SwiftUI: Modern declarative UI framework
- CoreAudio: Low-level audio system access
- Combine: Reactive state management
[Add your license here]
Contributions are welcome! Please feel free to submit a Pull Request.
Built using macOS CoreAudio HAL APIs. Inspired by the need for flexible multi-device audio routing on macOS.