diff --git a/__pycache__/app.cpython-314.pyc b/__pycache__/app.cpython-314.pyc new file mode 100644 index 0000000..491efa8 Binary files /dev/null and b/__pycache__/app.cpython-314.pyc differ diff --git a/__pycache__/config.cpython-314.pyc b/__pycache__/config.cpython-314.pyc new file mode 100644 index 0000000..01cb729 Binary files /dev/null and b/__pycache__/config.cpython-314.pyc differ diff --git a/app.py b/app.py index 5114504..8465744 100644 --- a/app.py +++ b/app.py @@ -4,5 +4,6 @@ from app import create_app app = create_app() if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000, debug=True) - \ No newline at end of file + # Der Werkzeug-ReLoader startet zwei Prozesse. Beide würden versuchen, + # exklusiv auf dasselbe ALSA-Gerät zuzugreifen. + app.run(host='0.0.0.0', port=5000, debug=True, use_reloader=False) diff --git a/app/__init__.py b/app/__init__.py index d0325a8..2b0dd2e 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -4,14 +4,10 @@ import logging import threading import time import os -import pygame from flask import Flask from .utils.logging import setup_logging, cleanup_old_log_dirs -from .routes.main import main_bp -from .routes.admin import admin_bp -from .routes.api import api_bp from .bluetooth.manager import init_bluetooth logger = logging.getLogger(__name__) # ← Logger für diese Datei @@ -30,16 +26,29 @@ def create_app(): # Bluetooth initialisieren (Monitor-Thread startet automatisch) init_bluetooth() - # pygame initialisieren (einmalig) + # pygame initialisieren (einmalig). Ein Audiofehler darf die Hub-Steuerung + # nicht am Start hindern; die API versucht die Initialisierung später erneut. from config import Config - pygame.mixer.pre_init(frequency=Config.AUDIO_FREQ, - size=Config.AUDIO_SIZE, - channels=Config.AUDIO_CHANNELS, - buffer=Config.AUDIO_BUFFER) - pygame.mixer.init() - pygame.mixer.set_num_channels(Config.AUDIO_NUM_CHANNELS) # genug parallele Kanäle für BG + Effekte - pygame.mixer.music.set_volume(0.8) # Standard-Lautstärke (für Legacy-Fälle) - app.logger.info("pygame initialisiert") + if Config.AUDIO_DEVICE: + os.environ['AUDIODEV'] = Config.AUDIO_DEVICE + import pygame + try: + init_args = { + 'frequency': Config.AUDIO_FREQ, + 'size': Config.AUDIO_SIZE, + 'channels': Config.AUDIO_CHANNELS, + 'buffer': Config.AUDIO_BUFFER, + } + if Config.AUDIO_DEVICE: + init_args['devicename'] = Config.AUDIO_DEVICE + pygame.mixer.init(**init_args) + pygame.mixer.set_num_channels(Config.AUDIO_NUM_CHANNELS) + pygame.mixer.music.set_volume(0.8) + app.logger.info(f"pygame initialisiert (Gerät: {Config.AUDIO_DEVICE or 'SDL-Standard'})") + except pygame.error as e: + app.logger.error(f"Audio konnte nicht initialisiert werden: {e}") + if Config.AUDIO_REQUIRED: + raise # Blueprints registrieren from .routes.main import main_bp diff --git a/app/__pycache__/__init__.cpython-314.pyc b/app/__pycache__/__init__.cpython-314.pyc index 597b17f..4be6c85 100644 Binary files a/app/__pycache__/__init__.cpython-314.pyc and b/app/__pycache__/__init__.cpython-314.pyc differ diff --git a/app/routes/__pycache__/api.cpython-314.pyc b/app/routes/__pycache__/api.cpython-314.pyc index e7fd5ee..6fc854d 100644 Binary files a/app/routes/__pycache__/api.cpython-314.pyc and b/app/routes/__pycache__/api.cpython-314.pyc differ diff --git a/app/routes/api.py b/app/routes/api.py index fb2cfaa..0ada348 100644 --- a/app/routes/api.py +++ b/app/routes/api.py @@ -29,13 +29,16 @@ DEFAULT_MAX_PER_HOUR = 2 DEFAULT_WINDOW_SECONDS = 3600 def _ensure_mixer(): - from config import Config if not pygame.mixer.get_init(): - pygame.mixer.pre_init(frequency=Config.AUDIO_FREQ, - size=Config.AUDIO_SIZE, - channels=Config.AUDIO_CHANNELS, - buffer=Config.AUDIO_BUFFER) - pygame.mixer.init() + init_args = { + 'frequency': Config.AUDIO_FREQ, + 'size': Config.AUDIO_SIZE, + 'channels': Config.AUDIO_CHANNELS, + 'buffer': Config.AUDIO_BUFFER, + } + if Config.AUDIO_DEVICE: + init_args['devicename'] = Config.AUDIO_DEVICE + pygame.mixer.init(**init_args) pygame.mixer.set_num_channels(Config.AUDIO_NUM_CHANNELS) def _load_sound(file_path): diff --git a/config.py b/config.py index 9dc677b..647280a 100644 --- a/config.py +++ b/config.py @@ -21,11 +21,15 @@ class Config: AUDIO_CHANNELS = 2 AUDIO_BUFFER = 2048 # größerer Buffer reduziert Knacksen AUDIO_NUM_CHANNELS = 16 + # ALSA/SDL-Gerät, z. B. "default", "plughw:CARD=PCM5102,DEV=0" + # oder ein in /etc/asound.conf definiertes Gerät. Leer = SDL-Standard. + AUDIO_DEVICE = os.environ.get('MKCONTROL_AUDIO_DEVICE') or None + AUDIO_REQUIRED = os.environ.get('MKCONTROL_AUDIO_REQUIRED', 'false').lower() in ('1', 'true', 'yes') # Optional: absolute Pfade, falls du später Docker o.ä. nutzt # CONFIG_DIR = os.path.join(os.path.dirname(__file__), 'configs') - APP_NAME = "MK Sound & Control" - APP_NAME_SHORT = "MKSC" # für Tab-Titel, wenns kurz sein soll + APP_NAME = "Mini-World Control Center" + APP_NAME_SHORT = "MWCC" # für Tab-Titel, wenns kurz sein soll APP_VERSION = "0.9.β" - APP_DESCRIPTION = "Websteuerung für MouldKing MK4/MK6-Hubs mit Soundboard" + APP_DESCRIPTION = "Websteuerung für MouldKing MK4/MK6-Hubs mit Soundboard und Aktorensteuerung" diff --git a/other/.DS_Store b/other/.DS_Store new file mode 100644 index 0000000..88f336c Binary files /dev/null and b/other/.DS_Store differ diff --git a/templates/base.html b/templates/base.html index 495987f..46b8b44 100644 --- a/templates/base.html +++ b/templates/base.html @@ -31,6 +31,7 @@ {% block head_extra %}{% endblock %} + @@ -70,11 +71,6 @@ -
-

{{ config.APP_NAME }}

- -
-
{% with messages = get_flashed_messages(with_categories=true) %}