From 6de07b89fac541fae6a8601294a2bde3858dd1bf Mon Sep 17 00:00:00 2001 From: norohind <60548839+norohind@users.noreply.github.com> Date: Sun, 13 Nov 2022 19:35:13 +0300 Subject: [PATCH] Use int to represent volume --- AudioController.py | 37 ++++++++++++++++++++++++------------- Events.py | 8 +++++--- ServerSideView.py | 2 +- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/AudioController.py b/AudioController.py index 509d176..dccae07 100644 --- a/AudioController.py +++ b/AudioController.py @@ -20,9 +20,20 @@ class PerSessionCallbacks(AudioSessionEvents): def __init__(self, pid: int, audio_controller: 'AudioController'): self.pid = pid self.audio_controller = audio_controller + self._is_muted: bool | None = None + self._volume: int | None = None def on_simple_volume_changed(self, new_volume, new_mute, event_context): - self.audio_controller.on_volume_changed(self.pid, new_volume, new_mute, event_context) + new_mute = bool(new_mute) + new_volume = int(new_volume * 100) + + if new_mute != self._is_muted: + self._is_muted = new_mute + self.audio_controller.on_mute_changed(self.pid, self._is_muted) + + if new_volume != self._volume: + self._volume = new_volume + self.audio_controller.on_volume_changed(self.pid, self._volume, event_context) def on_state_changed(self, new_state, new_state_id): self.audio_controller.on_state_changed(self.pid, new_state, new_state_id) @@ -100,14 +111,13 @@ class AudioController: else: logger.debug("None's process session", new_session, new_session.ProcessId) - def on_volume_changed(self, pid: int, new_volume: float, new_mute: int, event_context: 'comtypes.LP_GUID'): - logger.debug(f'Volume changed {self.get_process(pid).name()} {pid} new value: {new_volume}') - - # Notifying + def on_volume_changed(self, pid: int, new_volume: int, event_context: 'comtypes.LP_GUID'): + logger.debug(f'Volume changed {self.get_process(pid)}: new value: {new_volume}') self.outbound_q.put(Events.VolumeChanged(pid, new_volume)) - # Yes, this will produce useless MuteStateChanged - self.outbound_q.put(Events.MuteStateChanged(pid, bool(new_mute))) + def on_mute_changed(self, pid, new_mute: bool): + logger.debug(f'Mute changed {self.get_process(pid)}: new value: {new_mute}') + self.outbound_q.put(Events.MuteStateChanged(pid, new_mute)) def on_state_changed(self, pid: int, new_state: str, new_state_id: int): """ @@ -204,16 +214,17 @@ class AudioController: is_muted = self.is_muted(pid) self.set_mute(pid, not is_muted) - def get_volume(self, pid: int) -> float: + def get_volume(self, pid: int) -> int: logger.trace(f'Get volume for {pid}') - return self._sessions[pid].SimpleAudioVolume.GetMasterVolume() + return int(self._sessions[pid].SimpleAudioVolume.GetMasterVolume() * 100) - def set_volume(self, pid: int, volume: float): - # only set volume in the range 0.0 to 1.0 - volume = min(1.0, max(0.0, volume)) + def set_volume(self, pid: int, volume: int): + # only set volume in the range 0 to 100 + volume = min(100, max(0, volume)) + volume = float(volume) / 100 self._sessions[pid].SimpleAudioVolume.SetMasterVolume(volume, None) - def increment_volume(self, pid: int, increment: float): + def increment_volume(self, pid: int, increment: int): logger.trace(f'Increment volume for {pid}, {increment=}') volume = increment + self.get_volume(pid) self.set_volume(pid, volume) diff --git a/Events.py b/Events.py index b962ef0..e34badb 100644 --- a/Events.py +++ b/Events.py @@ -54,7 +54,9 @@ Cases: Send `Session closed` event 3. New client: - Send events as in `New Session` case + Send events as in `New Session` case + +Volume and volume increment as int in range 0 to 100 """ @@ -96,7 +98,7 @@ class StateChanged(ServerToClientEvent): @dataclass class VolumeChanged(ServerToClientEvent): - new_volume: float + new_volume: int @dataclass @@ -113,7 +115,7 @@ class SetName(ServerToClientEvent): @dataclass class VolumeIncrement(ClientToServerEvent): - increment: float + increment: int @dataclass diff --git a/ServerSideView.py b/ServerSideView.py index faa17bb..00b4e80 100644 --- a/ServerSideView.py +++ b/ServerSideView.py @@ -47,7 +47,7 @@ class ServerSideView(Thread): self.transport: TransportABC = NetworkTransport(self.rcv_callback) - self._state: dict[int, dict[str, int | float | str]] = dict() # Holds current state of sessions received from AudioController + self._state: dict[int, dict[str, int | str]] = dict() # Holds current state of sessions received from AudioController # PID : SessionState def rcv_callback(self, event: Events.ClientToServerEvent):