fn start()

in src/backend/mod.rs [4913:4960]


    fn start(&mut self) -> Result<()> {
        let was_stopped = self.stopped.load(Ordering::SeqCst);
        let was_draining = self.draining.load(Ordering::SeqCst);
        self.stopped.store(false, Ordering::SeqCst);
        self.draining.store(false, Ordering::SeqCst);

        self.queue
            .clone()
            .run_sync(|| -> Result<()> {
                // Need reinitialization: device was changed when paused. It will be started after
                // reinit because self.stopped is false.
                if self.delayed_reinit {
                    let rv = self.reinit().inspect_err(|_| {
                        cubeb_log!(
                            "({:p}) delayed reinit during start failed.",
                            self.core_stream_data.stm_ptr
                        );
                    });
                    // In case of failure, restore the state
                    if rv.is_err() {
                        self.stopped.store(was_stopped, Ordering::SeqCst);
                        self.draining.store(was_draining, Ordering::SeqCst);
                        return rv;
                    }
                    self.delayed_reinit = false;
                    Ok(())
                } else {
                    // Execute start in serial queue to avoid racing with destroy or reinit.
                    let rv = self.core_stream_data.start_audiounits();
                    if rv.is_err() {
                        cubeb_log!("({:p}) start failed.", self.core_stream_data.stm_ptr);
                        self.stopped.store(was_stopped, Ordering::SeqCst);
                        self.draining.store(was_draining, Ordering::SeqCst);
                        return rv;
                    }
                    Ok(())
                }
            })
            .unwrap()?;

        self.notify_state_changed(State::Started);

        cubeb_log!(
            "Cubeb stream ({:p}) started successfully.",
            self as *const AudioUnitStream
        );
        Ok(())
    }