pybevy_audio 0.2.0

Audio components and assets for PyBevy
Documentation
use std::time::Duration;

use bevy::{
    audio::{AudioSinkPlayback, SpatialAudioSink},
    transform::components::Transform,
};
use pybevy_core::{ComponentStorage, PyComponent};
use pybevy_macros::component_storage;
use pybevy_math::PyVec3;
use pybevy_transform::PyTransform;
use pyo3::{exceptions::PyRuntimeError, prelude::*};

use crate::volume::PyVolume;

#[component_storage(SpatialAudioSink, no_clone)]
#[pyclass(name = "SpatialAudioSink", extends = PyComponent)]
pub struct PySpatialAudioSink {
    pub(crate) storage: ComponentStorage<SpatialAudioSink>,
}

#[pymethods]
impl PySpatialAudioSink {
    pub fn play(&self) -> PyResult<()> {
        self.as_ref()?.play();
        Ok(())
    }

    pub fn pause(&self) -> PyResult<()> {
        self.as_ref()?.pause();
        Ok(())
    }

    pub fn stop(&self) -> PyResult<()> {
        self.as_ref()?.stop();
        Ok(())
    }

    pub fn volume(&self) -> PyResult<PyVolume> {
        Ok(self.as_ref()?.volume().into())
    }

    pub fn set_volume(&mut self, volume: &PyVolume) -> PyResult<()> {
        self.as_mut()?.set_volume((*volume).into());
        Ok(())
    }

    pub fn speed(&self) -> PyResult<f32> {
        Ok(self.as_ref()?.speed())
    }

    pub fn set_speed(&self, speed: f32) -> PyResult<()> {
        self.as_ref()?.set_speed(speed);
        Ok(())
    }

    pub fn mute(&mut self) -> PyResult<()> {
        self.as_mut()?.mute();
        Ok(())
    }

    pub fn unmute(&mut self) -> PyResult<()> {
        self.as_mut()?.unmute();
        Ok(())
    }

    pub fn is_muted(&self) -> PyResult<bool> {
        Ok(self.as_ref()?.is_muted())
    }

    pub fn is_paused(&self) -> PyResult<bool> {
        Ok(self.as_ref()?.is_paused())
    }

    pub fn empty(&self) -> PyResult<bool> {
        Ok(self.as_ref()?.empty())
    }

    pub fn position(&self) -> PyResult<Duration> {
        Ok(self.as_ref()?.position())
    }

    pub fn try_seek(&self, pos: Duration) -> PyResult<()> {
        self.as_ref()?
            .try_seek(pos)
            .map_err(|e| PyRuntimeError::new_err(format!("Seek error: {:?}", e)))?;
        Ok(())
    }

    pub fn toggle_playback(&self) -> PyResult<()> {
        self.as_ref()?.toggle_playback();
        Ok(())
    }

    pub fn toggle_mute(&mut self) -> PyResult<()> {
        self.as_mut()?.toggle_mute();
        Ok(())
    }

    pub fn set_ears_position(&self, left_position: PyVec3, right_position: PyVec3) -> PyResult<()> {
        self.as_ref()?
            .set_ears_position(left_position.into(), right_position.into());
        Ok(())
    }

    pub fn set_listener_position(&self, position: PyTransform, gap: f32) -> PyResult<()> {
        let bevy_transform: Transform = position.try_into()?;
        self.as_ref()?.set_listener_position(bevy_transform, gap);
        Ok(())
    }

    pub fn set_emitter_position(&self, position: PyVec3) -> PyResult<()> {
        self.as_ref()?.set_emitter_position(position.into());
        Ok(())
    }

    fn __repr__(&self) -> String {
        "SpatialAudioSink(...)".to_string()
    }
}