import logging try: import pyaudiowpatch as pyaudio except ImportError: pyaudio = None logging.warning("JARVIS 10X: pyaudiowpatch not installed. WASAPI loopback unavailable.") logger = logging.getLogger(__name__) class GameAudioCapture: def __init__(self): if pyaudio is None: self.pa = None return self.pa = pyaudio.PyAudio() self.default_speakers = None try: self.default_speakers = self.pa.get_default_wasapi_loopback() except OSError: logger.error("No default WASAPI loopback device found.") self.stream = None def start(self): if not self.pa or not self.default_speakers: return if self.stream: return try: self.stream = self.pa.open( format=pyaudio.paInt16, channels=self.default_speakers["maxInputChannels"], rate=int(self.default_speakers["defaultSampleRate"]), input=True, input_device_index=self.default_speakers["index"] ) logger.info("JARVIS 10X: GameAudioCapture WASAPI Loopback started.") except Exception as e: logger.error(f"GameAudioCapture failed to start: {e}") def read_chunk(self, frames: int = 1024) -> bytes: if not self.stream or not self.stream.is_active(): return b"" try: return self.stream.read(frames, exception_on_overflow=False) except Exception as e: logger.error(f"Error reading audio chunk: {e}") return b"" def stop(self): if self.stream: try: self.stream.stop_stream() self.stream.close() logger.info("JARVIS 10X: GameAudioCapture stream stopped.") except Exception as e: logger.error(f"Error stopping stream: {e}") self.stream = None