Skip to content

Conversation

roderickvd
Copy link
Member

Stream can now be moved between threads safely on macOS.

  • Replaced Rc<RefCell<>> with Arc<Mutex<>> for thread-safe access to stream state
  • Extracted device disconnection handling into a separate DisconnectManager to isolate non-Send AudioObjectPropertyListener
  • Removed unnecessary unsafe impl Send implementations that are now automatically derived

The mutex is only locked during play() and pause() operations, so performance impact is negligible. The audio callback is completely unaffected.

@roderickvd roderickvd changed the title feat: make Stream implement Send on macOS feat(CoreAudio): make Stream implement Send on macOS Sep 27, 2025
@roderickvd roderickvd changed the title feat(CoreAudio): make Stream implement Send on macOS feat(coreaudio): make Stream implement Send on macOS Sep 27, 2025
Copy link
Member

@dvdsk dvdsk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suspect we can not do this without spawning a separate thread to keep AudioObjectPropertyListener in. Maybe its perfectly safe maybe its not. There is not enough documentation from Apple to judge that.

Lets give Apple users an extra thread doing nothing but keep that object on the same thread.... We should name the thread: apple_should_document_their_audio_api \s

@roderickvd
Copy link
Member Author

@dvdsk good catch. Let's be more conservative. I've reworked this to use a dedicated thread.

While I was at it, I also killed the Clone impl on Stream. That's just confusing, and ALSA and WASAPI don't have it either. Should be much cleaner now.

@roderickvd roderickvd requested a review from dvdsk September 28, 2025 18:22
@roderickvd roderickvd changed the title feat(coreaudio): make Stream implement Send on macOS feat(coreaudio): make Stream implement Send on CoreAudio Sep 28, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants