Exemplo n.º 1
0
class AudioEngine:
    """A high level audio engine for easily playing SFX and Music."""
    def __init__(self, channels=5):
        self.sfx_players = deque([Player() for _ in range(channels)],
                                 maxlen=channels)
        self.music_player = Player()

    def set_volume(self, percentage):
        """Set the audio volume, as a percentage of 1 to 100.

        :param percentage: int: The volume, as a percentage.
        """
        volume = max(min(1, percentage / 100), 0)
        for player in self.sfx_players:
            player.volume = volume
        self.music_player.volume = volume

    def play(self, source, position=(0, 0, 0)):
        """Play a sound effect on the next available channel

        :param source: A pyglet audio Source
        :param position: Optional spacial position for the sound.
        """
        player = self.sfx_players[0]
        player.position = position
        player.queue(source=source)
        if not player.playing:
            player.play()
        else:
            player.next_source()
        self.sfx_players.rotate()

    def play_music(self, source):
        """Play a music track, or switch to a new one.

        :param source: A pyglet audio Source
        """
        self.music_player.queue(source=source)
        if not self.music_player.playing:
            self.music_player.play()
        else:
            self.music_player.next_source()
Exemplo n.º 2
0
class AudioManager:
    def __init__(self, assets: Assets, channels: int):
        self.assets = assets
        self.channels = channels
        self.logger = logging.getLogger(__name__)

        self.music_player = Player()
        self.sfx_players = [Player() for player in range(self.channels)]

        self.music_player.volume = 0.5
        self.songs = {}

        self._debug_info()

        if get_audio_driver().__class__.__name__ == "DirectSoundDriver":
            self.logger.warn("Using the directsound driver may have negative impacts on performance. It is recomended to use OpenAL instead")

    def _play_song(self):
        if not self.music_player.playing:
            self.music_player.play()
        else:
            self.music_player.next_source()

    def _load_song(self, path: str) -> Source:
        if path not in self.songs:
            self.songs[path] = self.assets.get_pyglet_media(path)

        return self.songs[path]

    def _debug_info(self):
        self.logger.debug("=*=*=*=*=*= Audio Debug Information =*=*=*=*=*=")
        self.logger.debug(f"Audio Driver Class: { get_audio_driver().__class__.__name__ }")
        self.logger.debug(f"  FFmpeg Installed: { have_ffmpeg() }")
        self.logger.debug("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=")

    def play_song(self, path: str, loop: bool = False):
        media_file = self._load_song(path)
        self.music_player.loop = loop
        self.music_player.queue(media_file)

        self._play_song()

    def load_songs(self, paths: list, loop: bool = False):
        for path in paths:
            media_file = self._load_song(path)
            self.music_player.queue(media_file)

        if loop:
            self.loop_songs_list = paths
            self.music_player.on_player_eos = lambda: self._loop_eos(paths)

    def _loop_eos(self, paths: list):
        self.load_songs(paths, True)
        self.play_songs()

    def play_songs(self):
        self._play_song()

    def get_music_volume(self) -> float:
        return self.music_player.volume

    def set_music_volume(self, volume: float):
        self.music_player.volume = volume

    def play_sfx(self, path: str):
        pass