mirror of
https://github.com/norohind/AudioControl.git
synced 2025-04-19 16:27:36 +03:00
68 lines
2.1 KiB
Python
68 lines
2.1 KiB
Python
import sys; sys.coinit_flags = 0 # noqa
|
|
import signal
|
|
from pycaw.pycaw import AudioUtilities
|
|
from pycaw.callbacks import AudioSessionEvents, AudioSessionNotification
|
|
from loguru import logger
|
|
from time import sleep
|
|
|
|
|
|
class Globals:
|
|
shutting_down = False
|
|
|
|
|
|
def shutdown_callback(*args):
|
|
logger.info(f'Shutting down')
|
|
Globals.shutting_down = True
|
|
|
|
|
|
class SessionCreateCallback(AudioSessionNotification):
|
|
references = list()
|
|
|
|
def on_session_created(self, new_session):
|
|
logger.info(f'Session created: {new_session}')
|
|
new_session.register_notification(SessionCallback(new_session.Process, 'by on_session_created'))
|
|
self.references.append(new_session)
|
|
|
|
|
|
class SessionCallback(AudioSessionEvents):
|
|
def __init__(self, process, obtained_via):
|
|
self.process = getattr(process, '_name', None)
|
|
self.ov = obtained_via
|
|
|
|
def on_simple_volume_changed(self, new_volume, new_mute, event_context):
|
|
logger.info(f'{self.process} - {new_volume} - {self.ov}')
|
|
|
|
def on_state_changed(self, new_state, new_state_id):
|
|
logger.info(f'{self.process} - {new_state} - {self.ov}')
|
|
|
|
def on_session_disconnected(self, disconnect_reason, disconnect_reason_id):
|
|
logger.info(f'{self.process} - {disconnect_reason} - {self.ov}')
|
|
|
|
|
|
def main():
|
|
signal.signal(signal.SIGTERM, shutdown_callback)
|
|
signal.signal(signal.SIGINT, shutdown_callback)
|
|
|
|
mgr = AudioUtilities.GetAudioSessionManager()
|
|
callback = SessionCreateCallback()
|
|
mgr.RegisterSessionNotification(callback)
|
|
mgr.GetSessionEnumerator()
|
|
|
|
sessions = AudioUtilities.GetAllSessions()
|
|
for session in sessions:
|
|
logger.info(f'Registering callback for {session}')
|
|
session.register_notification(SessionCallback(session.Process, 'by initial discover'))
|
|
|
|
while not Globals.shutting_down:
|
|
sleep(0.1)
|
|
|
|
mgr.UnregisterSessionNotification(callback)
|
|
|
|
for session in sessions:
|
|
logger.info(f'Unregistering callback for {session}')
|
|
session.unregister_notification()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|