# -*- coding: utf-8 -*- """ Audio-Konfiguration. Zentraler Zugriff auf Audio-Einstellungen für Plugins. """ from dataclasses import dataclass from typing import TYPE_CHECKING from trixy_core.audio.processing.context import AudioType, AudioFormatInfo if TYPE_CHECKING: from trixy_core.application import IApplication @dataclass class AudioSettings: """ Zentrale Audio-Einstellungen. Wird von Plugins genutzt um die korrekten Formate zu kennen. """ # TTS-Einstellungen tts_sample_rate: int = 22050 tts_channels: int = 1 tts_bit_depth: int = 16 # Asset-Einstellungen (Sound-Effekte) asset_sample_rate: int = 44100 asset_channels: int = 2 asset_bit_depth: int = 16 # Musik-Einstellungen music_sample_rate: int = 44100 music_channels: int = 2 music_bit_depth: int = 16 def get_format(self, audio_type: AudioType) -> AudioFormatInfo: """ Gibt das Format für einen Audio-Typ zurück. Args: audio_type: Der Audio-Typ Returns: Audio-Format-Informationen """ if audio_type == AudioType.TTS: return AudioFormatInfo( sample_rate=self.tts_sample_rate, channels=self.tts_channels, bit_depth=self.tts_bit_depth, ) elif audio_type == AudioType.ASSET: return AudioFormatInfo( sample_rate=self.asset_sample_rate, channels=self.asset_channels, bit_depth=self.asset_bit_depth, ) elif audio_type == AudioType.MUSIC: return AudioFormatInfo( sample_rate=self.music_sample_rate, channels=self.music_channels, bit_depth=self.music_bit_depth, ) else: # Default: Musik-Format return AudioFormatInfo( sample_rate=self.music_sample_rate, channels=self.music_channels, bit_depth=self.music_bit_depth, ) # Globale Instanz (wird bei Application-Start gesetzt) _audio_settings: AudioSettings | None = None def get_audio_settings() -> AudioSettings: """ Gibt die globalen Audio-Einstellungen zurück. Returns: AudioSettings-Instanz Raises: RuntimeError: Wenn die Einstellungen noch nicht initialisiert wurden """ global _audio_settings if _audio_settings is None: # Fallback auf Defaults _audio_settings = AudioSettings() return _audio_settings def set_audio_settings(settings: AudioSettings) -> None: """ Setzt die globalen Audio-Einstellungen. Wird beim Application-Start aufgerufen. Args: settings: Die Audio-Einstellungen """ global _audio_settings _audio_settings = settings def init_audio_settings_from_config(config) -> AudioSettings: """ Initialisiert Audio-Einstellungen aus einer Config. Args: config: Server-, Client- oder Standalone-Config Returns: AudioSettings-Instanz """ settings = AudioSettings() # Audio-Config aus verschiedenen Config-Typen extrahieren audio_config = getattr(config, 'audio', None) if audio_config: # TTS (Standard: 22050 Hz Mono) settings.tts_sample_rate = getattr(audio_config, 'sample_rate', 22050) settings.tts_channels = 1 # TTS ist immer Mono settings.tts_bit_depth = getattr(audio_config, 'bit_depth', 16) # Musik settings.music_sample_rate = getattr(audio_config, 'music_sample_rate', 44100) settings.music_channels = getattr(audio_config, 'music_channels', 2) settings.music_bit_depth = getattr(audio_config, 'music_bit_depth', 16) # Assets (gleich wie Musik) settings.asset_sample_rate = settings.music_sample_rate settings.asset_channels = settings.music_channels settings.asset_bit_depth = settings.music_bit_depth set_audio_settings(settings) return settings def get_format_for_type(audio_type: AudioType) -> AudioFormatInfo: """ Shortcut: Gibt das Format für einen Audio-Typ zurück. Args: audio_type: Der Audio-Typ Returns: Audio-Format-Informationen """ return get_audio_settings().get_format(audio_type)