"""캡처 대상 목록 — 출력(게임 소리)과 입력(마이크) 전환.""" from __future__ import annotations import pytest from livesub import audio from livesub.audio import ( SOURCE_MODE_INPUT, SOURCE_MODE_OUTPUT, AudioSource, CaptureError, InputDeviceCapture, create_capture, list_sources, ) from livesub.config import AudioConfig MIC = AudioSource(kind="input", identifier="3", label="마이크 (Realtek)", detail="기본 입력 장치") SPEAKER = AudioSource(kind="device", identifier="7", label="스피커", detail="기본 출력 장치") GAME = AudioSource(kind="process", identifier="4242", label="Overwatch.exe") @pytest.fixture def fake_devices(monkeypatch): monkeypatch.setattr(InputDeviceCapture, "available", staticmethod(lambda: True)) monkeypatch.setattr(InputDeviceCapture, "list_sources", staticmethod(lambda: [MIC])) monkeypatch.setattr( audio.WasapiLoopbackCapture, "list_sources", staticmethod(lambda: [SPEAKER]) ) monkeypatch.setattr( audio.ProcessLoopbackCapture, "available", staticmethod(lambda: True) ) monkeypatch.setattr( audio.ProcessLoopbackCapture, "list_sources", staticmethod(lambda: [GAME]) ) def test_기본은_프로그램과_출력_장치를_보여준다(fake_devices): kinds = [s.kind for s in list_sources()] assert kinds == ["process", "device"] assert list_sources() == list_sources(SOURCE_MODE_OUTPUT) def test_입력_모드는_마이크만_보여준다(fake_devices): """두 목록을 섞으면 찾으려던 게임이 라인입력 사이에 파묻힌다.""" sources = list_sources(SOURCE_MODE_INPUT) assert [s.kind for s in sources] == ["input"] assert sources[0].label == "마이크 (Realtek)" def test_입력_장치도_장치_번호를_준다(): assert MIC.device_index == 3 assert MIC.pid == 0 def test_입력_백엔드로_캡처를_만든다(fake_devices): cfg = AudioConfig(backend="input", device_index=3) capture = create_capture(cfg) assert isinstance(capture, InputDeviceCapture) assert capture.device_index == 3 def test_입력_장치를_못_열면_이유를_알려준다(monkeypatch): monkeypatch.setattr(InputDeviceCapture, "available", staticmethod(lambda: False)) with pytest.raises(CaptureError, match="입력 장치"): create_capture(AudioConfig(backend="input", device_index=3)) def test_입력_가능_여부가_환경_보고에_들어간다(): assert "input" in audio.capture_capabilities() def test_고른_목록_쪽을_설정에_기억한다(): assert AudioConfig().source_mode == SOURCE_MODE_OUTPUT