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()
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