diff --git a/rotary_phone_web.py b/rotary_phone_web.py index db225d0..6257f15 100644 --- a/rotary_phone_web.py +++ b/rotary_phone_web.py @@ -495,6 +495,15 @@ class RotaryPhone: print("Handset hung up, stopping recording immediately") break + # Check extra button during recording + if EXTRA_BUTTON_ENABLED and GPIO.input(EXTRA_BUTTON_PIN) == EXTRA_BUTTON_PRESSED: + print(f"[BUTTON] Button pressed during recording!") + if not self.extra_button_playing: + print(f"[BUTTON] Triggering button sound...") + button_thread = threading.Thread(target=self.play_extra_button_sound, daemon=True) + button_thread.start() + time.sleep(0.5) # Debounce to prevent multiple triggers + try: data = stream.read(CHUNK, exception_on_overflow=False) frames.append(data) @@ -554,32 +563,45 @@ class RotaryPhone: def play_extra_button_sound(self): """Play sound when extra button is pressed (only during recording)""" if not EXTRA_BUTTON_ENABLED: + print("[BUTTON] Extra button disabled in config") return # Only play if currently recording if not self.recording: - print("Extra button ignored - not recording") + print("[BUTTON] Extra button ignored - not recording") return button_sound = self.get_extra_button_sound_path() + print(f"[BUTTON] Button sound path: {button_sound}") + if not os.path.exists(button_sound): - print(f"Extra button sound not found: {button_sound}") + print(f"[BUTTON] ERROR: Sound file not found: {button_sound}") return - print(f"\n=== Extra button pressed ===") + print(f"[BUTTON] Playing extra button sound...") self.extra_button_playing = True try: # Use a separate PyAudio instance for playback during recording # This allows simultaneous input (recording) and output (button sound) + print(f"[BUTTON] Opening audio file...") audio_playback = pyaudio.PyAudio() wf = wave.open(button_sound, 'rb') + file_rate = wf.getframerate() + file_channels = wf.getnchannels() + file_width = wf.getsampwidth() + print(f"[BUTTON] File info - Rate: {file_rate}Hz, Channels: {file_channels}, Width: {file_width}") + + if file_rate != RATE: + print(f"[BUTTON] WARNING: File sample rate ({file_rate}Hz) != configured rate ({RATE}Hz)") + + print(f"[BUTTON] Opening audio stream on device {AUDIO_DEVICE_INDEX}...") stream = audio_playback.open( - format=audio_playback.get_format_from_width(wf.getsampwidth()), - channels=wf.getnchannels(), - rate=wf.getframerate(), + format=audio_playback.get_format_from_width(file_width), + channels=file_channels, + rate=file_rate, output=True, output_device_index=AUDIO_DEVICE_INDEX, frames_per_buffer=CHUNK @@ -587,9 +609,12 @@ class RotaryPhone: # Get volume multiplier volume = self.get_volume() / 100.0 + print(f"[BUTTON] Volume: {int(volume * 100)}%") # Play the sound + print(f"[BUTTON] Starting playback...") data = wf.readframes(CHUNK) + chunk_count = 0 while data: # Apply volume if volume < 1.0: @@ -599,36 +624,48 @@ class RotaryPhone: stream.write(data) data = wf.readframes(CHUNK) + chunk_count += 1 stream.stop_stream() stream.close() wf.close() audio_playback.terminate() - print("Extra button sound playback finished") + print(f"[BUTTON] Playback finished ({chunk_count} chunks)") except Exception as e: - print(f"Error playing button sound: {e}") + print(f"[BUTTON] ERROR playing button sound: {e}") + import traceback + traceback.print_exc() finally: self.extra_button_playing = False + print(f"[BUTTON] Button playback complete") def phone_loop(self): """Main phone handling loop""" print("Rotary Phone System Started") print(f"Hook pin: GPIO {HOOK_PIN}") if EXTRA_BUTTON_ENABLED: - print(f"Extra button: GPIO {EXTRA_BUTTON_PIN}") + print(f"Extra button: ENABLED on GPIO {EXTRA_BUTTON_PIN}") + print(f"Extra button pressed state: {EXTRA_BUTTON_PRESSED} ({'LOW' if EXTRA_BUTTON_PRESSED == GPIO.LOW else 'HIGH'})") + print(f"Extra button sound: {self.get_extra_button_sound_path()}") + else: + print(f"Extra button: DISABLED") print(f"Recordings will be saved to: {OUTPUT_DIR}") try: while True: # Check extra button first (higher priority) if EXTRA_BUTTON_ENABLED and GPIO.input(EXTRA_BUTTON_PIN) == EXTRA_BUTTON_PRESSED: + print(f"[BUTTON] Button pressed detected (recording={self.recording}, playing={self.extra_button_playing})") if not self.extra_button_playing: # Play extra button sound in a separate thread to not block + print(f"[BUTTON] Starting button sound thread...") button_thread = threading.Thread(target=self.play_extra_button_sound, daemon=True) button_thread.start() time.sleep(0.5) # Debounce + else: + print(f"[BUTTON] Button sound already playing, ignoring") # Wait for handset pickup if GPIO.input(HOOK_PIN) == HOOK_PRESSED and self.phone_status == "on_hook":