import time
import random
import os
import sys
import pygame._sdl2 as sdl2
import pygame
from pydub import AudioSegment

def get_sdl2_device():
    pygame.display.init()
    pygame.mixer.init()
    devices = sdl2.audio.get_audio_device_names(False)
    pygame.mixer.quit()
    
    if not devices:
        print("No audio output devices found.")
        return None

    for i, name in enumerate(devices):
        print(f"[{i}] {name}")
    
    while True:
        try:
            choice = input("Select audio device: ").strip()
            if choice == "":
                return devices[0]
            idx = int(choice)
            if 0 <= idx < len(devices):
                return devices[idx]
            else:
                print(f"Please enter a number between 0 and {len(devices)-1}.")
        except ValueError:
            print("Invalid input. Please enter a number.")

def start_loop():
    if not os.path.exists("beep.wav"):
        print(f"Error: {"beep.wav"} not found.")
        return

    audio = AudioSegment.from_wav("beep.wav")
    
    selected_device_name = get_sdl2_device()
    pygame.mixer.init(frequency=44100, size=-16, channels=1, devicename=selected_device_name)

    try:
        while True:
            delay = random.randint(0, 240)
            for i in range(delay, 0, -1):
                sys.stdout.flush()
                time.sleep(1)
            
            multiplier = 2.0 ** random.uniform(1, 4.5)
            new_sample_rate = int(audio.frame_rate * multiplier)
            processed = audio._spawn(audio.raw_data, overrides={'frame_rate': new_sample_rate})
            processed = processed.set_frame_rate(44100)
            if processed.max_dBFS > -18.0:
                processed = processed.apply_gain(-24.0 - processed.max_dBFS)

            sound = pygame.mixer.Sound(buffer=processed.raw_data)
            channel = sound.play()
            
            while channel.get_busy():
                time.sleep(0.1)
                
    except KeyboardInterrupt:
        print("\nStopping...")
        pygame.mixer.quit()

if __name__ == "__main__":
    start_loop()