Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions src/accessiclock/audio/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
# Try to import sound_lib (cross-platform: Windows, macOS, Linux)
try:
from sound_lib import stream
from sound_lib.main import BASS_Free

_use_sound_lib = True
logger.debug("sound_lib available")
Expand Down Expand Up @@ -176,11 +175,7 @@ def cleanup(self) -> None:
except Exception as e:
logger.warning(f"Error during AudioPlayer cleanup: {e}")

# Free BASS library resources
# Reset BASS initialization flag
if _use_sound_lib and _bass_initialized:
try:
BASS_Free()
_bass_initialized = False
logger.info("BASS audio system freed")
except Exception as e:
logger.warning(f"Error freeing BASS audio system: {e}")
_bass_initialized = False
logger.info("BASS audio system cleanup complete")
30 changes: 6 additions & 24 deletions tests/test_audio_player.py
Original file line number Diff line number Diff line change
Expand Up @@ -515,68 +515,50 @@ def test_cleanup_stream_error_suppressed(self):
player_module._use_sound_lib = original_use
player_module._bass_initialized = original_init

def test_cleanup_frees_bass(self):
"""cleanup should call BASS_Free when bass was initialized."""
def test_cleanup_resets_bass_flag(self):
"""cleanup should reset _bass_initialized flag."""
import accessiclock.audio.player as player_module
from accessiclock.audio.player import AudioPlayer

original_use = player_module._use_sound_lib
original_init = player_module._bass_initialized
original_bass_free = getattr(player_module, "BASS_Free", None)

try:
player_module._use_sound_lib = True
player_module._bass_initialized = True

mock_bass_free = MagicMock()
player_module.BASS_Free = mock_bass_free

player = AudioPlayer.__new__(AudioPlayer)
player._volume = 50
player._current_stream = None

player.cleanup()

mock_bass_free.assert_called_once()
assert player_module._bass_initialized is False
finally:
player_module._use_sound_lib = original_use
player_module._bass_initialized = original_init
if original_bass_free is not None:
player_module.BASS_Free = original_bass_free
elif hasattr(player_module, "BASS_Free"):
delattr(player_module, "BASS_Free")

def test_cleanup_bass_free_error_suppressed(self):
"""cleanup should suppress BASS_Free errors."""
def test_cleanup_bass_not_initialized_skips_reset(self):
"""cleanup should not reset flag when bass was not initialized."""
import accessiclock.audio.player as player_module
from accessiclock.audio.player import AudioPlayer

original_use = player_module._use_sound_lib
original_init = player_module._bass_initialized
original_bass_free = getattr(player_module, "BASS_Free", None)

try:
player_module._use_sound_lib = True
player_module._bass_initialized = True

mock_bass_free = MagicMock(side_effect=RuntimeError("bass error"))
player_module.BASS_Free = mock_bass_free
player_module._bass_initialized = False

player = AudioPlayer.__new__(AudioPlayer)
player._volume = 50
player._current_stream = None

# Should not raise
player.cleanup()
mock_bass_free.assert_called_once()
assert player_module._bass_initialized is False
finally:
player_module._use_sound_lib = original_use
player_module._bass_initialized = original_init
if original_bass_free is not None:
player_module.BASS_Free = original_bass_free
elif hasattr(player_module, "BASS_Free"):
delattr(player_module, "BASS_Free")


class TestSoundLibIntegration:
Expand Down