From 13eef1bc71850623d0129fd31b5ffbc620f666e8 Mon Sep 17 00:00:00 2001
From: deepbeepmeep <84379123+deepbeepmeep@users.noreply.github.com>
Date: Thu, 12 Jun 2025 10:03:47 +0200
Subject: [PATCH] Revert "notification sound + prompt box color fix"
---
 notification_sound.py | 261 ------------------------------------------
 requirements.txt      |   1 -
 wgp.py                |  61 +---------
 3 files changed, 5 insertions(+), 318 deletions(-)
 delete mode 100644 notification_sound.py
diff --git a/notification_sound.py b/notification_sound.py
deleted file mode 100644
index c935a61..0000000
--- a/notification_sound.py
+++ /dev/null
@@ -1,261 +0,0 @@
-"""
-Notification sounds for Wan2GP video generation application
-Pure Python audio notification system with multiple backend support
-"""
-
-import os
-import sys
-import threading
-import time
-import numpy as np
-
-
-def generate_notification_beep(volume=50, sample_rate=44100):
-    """Generate pleasant C major chord notification sound"""
-    if volume == 0:
-        return np.array([])
-    
-    volume = max(0, min(100, volume))
-    
-    # Volume curve mapping: 25%->50%, 50%->75%, 75%->100%, 100%->105%
-    if volume <= 25:
-        volume_mapped = (volume / 25.0) * 0.5
-    elif volume <= 50:
-        volume_mapped = 0.5 + ((volume - 25) / 25.0) * 0.25
-    elif volume <= 75:
-        volume_mapped = 0.75 + ((volume - 50) / 25.0) * 0.25
-    else:
-        volume_mapped = 1.0 + ((volume - 75) / 25.0) * 0.05  # Only 5% boost instead of 15%
-    
-    volume = volume_mapped
-    
-    # C major chord frequencies
-    freq_c = 261.63  # C4
-    freq_e = 329.63  # E4  
-    freq_g = 392.00  # G4
-    
-    duration = 0.8
-    t = np.linspace(0, duration, int(sample_rate * duration), False)
-    
-    # Generate chord components
-    wave_c = np.sin(freq_c * 2 * np.pi * t) * 0.4
-    wave_e = np.sin(freq_e * 2 * np.pi * t) * 0.3
-    wave_g = np.sin(freq_g * 2 * np.pi * t) * 0.2
-    
-    wave = wave_c + wave_e + wave_g
-    
-    # Prevent clipping
-    max_amplitude = np.max(np.abs(wave))
-    if max_amplitude > 0:
-        wave = wave / max_amplitude * 0.8
-    
-    # ADSR envelope
-    def apply_adsr_envelope(wave_data):
-        length = len(wave_data)
-        attack_time = int(0.2 * length)
-        decay_time = int(0.1 * length)
-        release_time = int(0.5 * length)
-        
-        envelope = np.ones(length)
-        
-        if attack_time > 0:
-            envelope[:attack_time] = np.power(np.linspace(0, 1, attack_time), 3)
-        
-        if decay_time > 0:
-            start_idx = attack_time
-            end_idx = attack_time + decay_time
-            envelope[start_idx:end_idx] = np.linspace(1, 0.85, decay_time)
-        
-        if release_time > 0:
-            start_idx = length - release_time
-            envelope[start_idx:] = 0.85 * np.exp(-4 * np.linspace(0, 1, release_time))
-        
-        return wave_data * envelope
-    
-    wave = apply_adsr_envelope(wave)
-    
-    # Simple low-pass filter
-    def simple_lowpass_filter(signal, cutoff_ratio=0.8):
-        window_size = max(3, int(len(signal) * 0.001))
-        if window_size % 2 == 0:
-            window_size += 1
-        
-        kernel = np.ones(window_size) / window_size
-        padded = np.pad(signal, window_size//2, mode='edge')
-        filtered = np.convolve(padded, kernel, mode='same')
-        return filtered[window_size//2:-window_size//2]
-    
-    wave = simple_lowpass_filter(wave)
-    
-    # Add reverb effect
-    if len(wave) > sample_rate // 4:
-        delay_samples = int(0.12 * sample_rate)
-        reverb = np.zeros_like(wave)
-        reverb[delay_samples:] = wave[:-delay_samples] * 0.08
-        wave = wave + reverb
-    
-    # Apply volume first, then normalize to prevent clipping
-    wave = wave * volume * 0.5
-    
-    # Final normalization with safety margin
-    max_amplitude = np.max(np.abs(wave))
-    if max_amplitude > 0.85:  # If approaching clipping threshold
-        wave = wave / max_amplitude * 0.85  # More conservative normalization
-    
-    return wave
-
-
-def play_audio_with_pygame(audio_data, sample_rate=44100):
-    """Play audio using pygame backend"""
-    try:
-        import pygame
-        # Initialize pygame mixer only if not already initialized
-        if not pygame.mixer.get_init():
-            pygame.mixer.pre_init(frequency=sample_rate, size=-16, channels=2, buffer=1024)
-            pygame.mixer.init()
-        else:
-            # Reinitialize with new settings if needed
-            current_freq, current_size, current_channels = pygame.mixer.get_init()
-            if current_freq != sample_rate or current_channels != 2:
-                pygame.mixer.quit()
-                pygame.mixer.pre_init(frequency=sample_rate, size=-16, channels=2, buffer=1024)
-                pygame.mixer.init()
-        
-        audio_int16 = (audio_data * 32767).astype(np.int16)
-        
-        # Convert mono to stereo
-        if len(audio_int16.shape) == 1:
-            stereo_data = np.column_stack((audio_int16, audio_int16))
-        else:
-            stereo_data = audio_int16
-        
-        sound = pygame.sndarray.make_sound(stereo_data)
-        sound.play()
-        pygame.time.wait(int(len(audio_data) / sample_rate * 1000) + 100)
-        # Don't quit mixer - this can interfere with Gradio server
-        # pygame.mixer.quit()
-        return True
-        
-    except ImportError:
-        return False
-    except Exception as e:
-        print(f"Pygame error: {e}")
-        return False
-
-
-def play_audio_with_sounddevice(audio_data, sample_rate=44100):
-    """Play audio using sounddevice backend"""
-    try:
-        import sounddevice as sd
-        sd.play(audio_data, sample_rate)
-        sd.wait()
-        return True
-        
-    except ImportError:
-        return False
-    except Exception as e:
-        print(f"Sounddevice error: {e}")
-        return False
-
-
-def play_audio_with_winsound(audio_data, sample_rate=44100):
-    """Play audio using winsound backend (Windows only)"""
-    if sys.platform != "win32":
-        return False
-        
-    try:
-        import winsound
-        import wave
-        import tempfile
-        import uuid
-        
-        temp_dir = tempfile.gettempdir()
-        temp_filename = os.path.join(temp_dir, f"notification_{uuid.uuid4().hex}.wav")
-        
-        try:
-            with wave.open(temp_filename, 'w') as wav_file:
-                wav_file.setnchannels(1)
-                wav_file.setsampwidth(2)
-                wav_file.setframerate(sample_rate)
-                
-                audio_int16 = (audio_data * 32767).astype(np.int16)
-                wav_file.writeframes(audio_int16.tobytes())
-            
-            winsound.PlaySound(temp_filename, winsound.SND_FILENAME)
-            
-        finally:
-            # Clean up temp file
-            for _ in range(3):
-                try:
-                    if os.path.exists(temp_filename):
-                        os.unlink(temp_filename)
-                    break
-                except:
-                    time.sleep(0.1)
-            
-        return True
-        
-    except ImportError:
-        return False
-    except Exception as e:
-        print(f"Winsound error: {e}")
-        return False
-
-
-def play_notification_sound(volume=50):
-    """Play notification sound with specified volume"""
-    if volume == 0:
-        return
-    
-    audio_data = generate_notification_beep(volume=volume)
-    
-    if len(audio_data) == 0:
-        return
-    
-    # Try audio backends in order
-    audio_backends = [
-        play_audio_with_pygame,
-        play_audio_with_sounddevice,
-        play_audio_with_winsound,
-    ]
-    
-    for backend in audio_backends:
-        try:
-            if backend(audio_data):
-                return
-        except Exception as e:
-            continue
-    
-    # Fallback: terminal beep
-    print(f"All audio backends failed, using terminal beep")
-    print('\a')
-
-
-def play_notification_async(volume=50):
-    """Play notification sound asynchronously (non-blocking)"""
-    def play_sound():
-        try:
-            play_notification_sound(volume)
-        except Exception as e:
-            print(f"Error playing notification sound: {e}")
-    
-    sound_thread = threading.Thread(target=play_sound, daemon=True)
-    sound_thread.start()
-
-
-def notify_video_completion(video_path=None, volume=50):
-    """Notify about completed video generation"""
-    play_notification_async(volume)
-
-
-if __name__ == "__main__":
-    print("Testing notification sounds with different volumes...")
-    print("Auto-detecting available audio backends...")
-    
-    volumes = [25, 50, 75, 100]
-    for vol in volumes:
-        print(f"Testing volume {vol}%:")
-        play_notification_sound(vol)
-        time.sleep(2)
-    
-    print("Test completed!") 
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index f7e37a0..c6f5045 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -34,5 +34,4 @@ loguru
 sentencepiece
 av
 opencv-python
-pygame
 # rembg==2.0.65
diff --git a/wgp.py b/wgp.py
index f68169a..21e8a1f 100644
--- a/wgp.py
+++ b/wgp.py
@@ -14,7 +14,6 @@ import gradio as gr
 import random
 import json
 import wan
-import notification_sound
 from wan.configs import MAX_AREA_CONFIGS, WAN_CONFIGS, SUPPORTED_SIZES, VACE_SIZE_CONFIGS
 from wan.utils.utils import cache_video
 from wan.modules.attention import get_attention_modes, get_supported_attention_modes
@@ -2335,9 +2334,7 @@ def apply_changes(  state,
                     UI_theme_choice = "default",
                     enhancer_enabled_choice = 0,
                     fit_canvas_choice = 0,
-                    preload_in_VRAM_choice = 0,
-                    notification_sound_enabled_choice = 1,
-                    notification_sound_volume_choice = 50
+                    preload_in_VRAM_choice = 0
 ):
     if args.lock_config:
         return
@@ -2362,9 +2359,7 @@ def apply_changes(  state,
                      "UI_theme" : UI_theme_choice,
                      "fit_canvas": fit_canvas_choice,
                      "enhancer_enabled" : enhancer_enabled_choice,
-                     "preload_in_VRAM" : preload_in_VRAM_choice,
-                     "notification_sound_enabled" : notification_sound_enabled_choice,
-                     "notification_sound_volume" : notification_sound_volume_choice
+                     "preload_in_VRAM" : preload_in_VRAM_choice
                        }
 
     if Path(server_config_filename).is_file():
@@ -2401,7 +2396,7 @@ def apply_changes(  state,
     transformer_types = server_config["transformer_types"]
     model_filename = get_model_filename(get_model_type(state["model_filename"]), transformer_quantization, transformer_dtype_policy)
     state["model_filename"] = model_filename
-    if all(change in ["attention_mode", "vae_config", "boost", "save_path", "metadata_type", "clear_file_list", "fit_canvas", "notification_sound_enabled", "notification_sound_volume"] for change in changes ):
+    if all(change in ["attention_mode", "vae_config", "boost", "save_path", "metadata_type", "clear_file_list", "fit_canvas"] for change in changes ):
         model_choice = gr.Dropdown()
     else:
         reload_needed = True
@@ -2550,16 +2545,7 @@ def refresh_gallery(state): #, msg
         for img_uri in list_uri:
             thumbnails += f'
  | '
         
-        # Get current theme from server config  
-        current_theme = server_config.get("UI_theme", "default")
-        if current_theme == "gradio":
-            # Native Gradio theme (dark)
-            table_style = "border: 1px solid #444444; background-color: #2B2B2B; color: #FFFFFF; padding: 8px;"
-        else:
-            # Blue Sky Soft theme - match the input fields styling
-            table_style = "border: 1px solid #0a0f1e; background-color: #1e293b; color: #FFFFFF; padding: 8px;"
-        
-        html = f"| " + prompt + " | " + thumbnails + "
" 
+        html = "| " + prompt + " | " + thumbnails + "
" 
         html_output = gr.HTML(html, visible= True)
         return gr.Gallery(selected_index=choice, value = file_list), html_output, gr.Button(visible=False), gr.Button(visible=True), gr.Row(visible=True), update_queue_data(queue), gr.Button(interactive=  abort_interactive), gr.Button(visible= onemorewindow_visible)
 
@@ -3464,17 +3450,6 @@ def generate_video(
                 print(f"New video saved to Path: "+video_path)
                 file_list.append(video_path)
                 file_settings_list.append(configs)
-                
-                # Play notification sound for single video
-                try:
-                    if server_config.get("notification_sound_enabled", 1):
-                        volume = server_config.get("notification_sound_volume", 50)
-                        notification_sound.notify_video_completion(
-                            video_path=video_path, 
-                            volume=volume
-                        )
-                except Exception as e:
-                    print(f"Error playing notification sound for individual video: {e}")
 
                 send_cmd("output")
 
@@ -3818,13 +3793,6 @@ def process_tasks(state):
         status = f"Video generation was aborted. Total Generation Time: {end_time-start_time:.1f}s" 
     else:
         status = f"Total Generation Time: {end_time-start_time:.1f}s" 
-        # Play notification sound when video generation completed successfully
-        try:
-            if server_config.get("notification_sound_enabled", 1):
-                volume = server_config.get("notification_sound_volume", 50)
-                notification_sound.notify_video_completion(volume=volume)
-        except Exception as e:
-            print(f"Error playing notification sound: {e}")
     gen["status"] = status
     gen["status_display"] =  False
 
@@ -5649,24 +5617,7 @@ def generate_configuration_tab(state, blocks, header, model_choice, prompt_enhan
                 )
                 preload_in_VRAM_choice = gr.Slider(0, 40000, value=server_config.get("preload_in_VRAM", 0), step=100, label="Number of MB of Models that are Preloaded in VRAM (0 will use Profile default)")
 
-            with gr.Tab("Notifications"):
-                gr.Markdown("### Notification Settings")
-                notification_sound_enabled_choice = gr.Dropdown(
-                    choices=[
-                        ("On", 1),
-                        ("Off", 0),
-                    ],
-                    value=server_config.get("notification_sound_enabled", 1),
-                    label="Notification Sound Enabled"
-                )
 
-                notification_sound_volume_choice = gr.Slider(
-                    minimum=0,
-                    maximum=100,
-                    value=server_config.get("notification_sound_volume", 50),
-                    step=5,
-                    label="Notification Sound Volume (0 = silent, 100 = very loud)"
-                )
 
         
         msg = gr.Markdown()            
@@ -5693,9 +5644,7 @@ def generate_configuration_tab(state, blocks, header, model_choice, prompt_enhan
                     UI_theme_choice,
                     enhancer_enabled_choice,
                     fit_canvas_choice,
-                    preload_in_VRAM_choice,
-                    notification_sound_enabled_choice,
-                    notification_sound_volume_choice
+                    preload_in_VRAM_choice
                 ],
                 outputs= [msg , header, model_choice, prompt_enhancer_row]
         )