From 0f1735da7447d88a12436410fdade1731ea73e35 Mon Sep 17 00:00:00 2001 From: Uriziel Date: Wed, 27 Jun 2012 17:24:01 +0200 Subject: [PATCH] Some hacking on api --- syncplay/client.py | 4 +-- syncplay/mpc_api.py | 28 ++++++++++++----- syncplay/players/mpc_using_api.py | 51 ++++++++++++++++--------------- 3 files changed, 49 insertions(+), 34 deletions(-) diff --git a/syncplay/client.py b/syncplay/client.py index 574b0e4..0128e84 100644 --- a/syncplay/client.py +++ b/syncplay/client.py @@ -251,7 +251,7 @@ class Manager(object): def init_player(self, player): self.player = player if self.last_global_update: - self.player.set_position(0) + self.player.set_position(self.get_global_position()) self.player.set_paused(True) self.schedule_ask_player() @@ -375,7 +375,7 @@ class Manager(object): self.player.set_position(self.get_global_position()) self.ask_player() else: - message = '%s resumed' % self.name + message = '%s unpaused' % self.name print message self.player.display_message(message) diff --git a/syncplay/mpc_api.py b/syncplay/mpc_api.py index 36562bf..def1f86 100644 --- a/syncplay/mpc_api.py +++ b/syncplay/mpc_api.py @@ -11,9 +11,10 @@ class MPC_API: while(self.__listener == None): continue self.__position_request_warden = False self.__seek_warden = False - + self.__playpause_warden = False ''' List of callbacks that can be set + Each callback by default receives a tuple argument, can be empty though on_connected on_seek on_update_filename @@ -90,9 +91,12 @@ class MPC_API: ''' def pause(self): self.__mpc_ready_in_slave_mode() - if(not self.is_paused()): + while(self.playstate == None):self.__mpc_ready_in_slave_mode() + if(not self.is_paused() and self.__playpause_warden == False): + self.__playpause_warden = True self.__listener.SendCommand(MPC_API_COMMANDS.CMD_PLAYPAUSE) while(not self.is_paused()): self.__mpc_ready_in_slave_mode() + self.__playpause_warden = False ''' Play paused file @@ -100,10 +104,12 @@ class MPC_API: ''' def unpause(self): self.__mpc_ready_in_slave_mode() - if(self.is_paused()): + while(self.playstate == None):self.__mpc_ready_in_slave_mode() + if(self.is_paused() and self.__playpause_warden == False): + self.__playpause_warden = True self.__listener.SendCommand(MPC_API_COMMANDS.CMD_PLAYPAUSE) while(self.is_paused()): self.__mpc_ready_in_slave_mode() - + self.__playpause_warden = False ''' Toggle play/pause Throws MPC_API.NoSlaveDetectedException if mpc window is not found @@ -111,8 +117,12 @@ class MPC_API: def playpause(self): self.__mpc_ready_in_slave_mode() tmp = self.playstate - self.__listener.SendCommand(MPC_API_COMMANDS.CMD_PLAYPAUSE) - while(tmp == self.playstate): self.__mpc_ready_in_slave_mode() + while(self.playstate == None):self.__mpc_ready_in_slave_mode() + if(self.__playpause_warden == False): + self.__playpause_warden = True + self.__listener.SendCommand(MPC_API_COMMANDS.CMD_PLAYPAUSE) + while(tmp == self.playstate): self.__mpc_ready_in_slave_mode() + self.__playpause_warden = False ''' Asks mpc for it's current file position, if on_update_position callback is set @@ -134,7 +144,7 @@ class MPC_API: self.__mpc_ready_in_slave_mode() self.__seek_warden = True self.__listener.SendCommand(MPC_API_COMMANDS.CMD_SETPOSITION, unicode(position)) - while(self.__seek_warden): continue + while(self.__seek_warden): self.__mpc_ready_in_slave_mode() ''' @param message: unicode string to display in player @@ -189,7 +199,7 @@ class MPC_API: if(self.callbacks.on_update_playstate): self.callbacks.on_update_playstate((self.playstate,)) elif(cmd == MPC_API_COMMANDS.CMD_NOWPLAYING): - if(self.callbacks.on_file_ready): self.callbacks.on_file_ready() + if(self.callbacks.on_file_ready): self.callbacks.on_file_ready(()) self.fileplaying = value.split('|')[3].split('\\').pop() if(self.callbacks.on_update_filename): self.callbacks.on_update_filename((self.fileplaying,)) self.fileduration = int(value.split('|')[4]) @@ -281,10 +291,12 @@ class MPC_API: def OnCopyData(self, hwnd, msg, wparam, lparam): pCDS = ctypes.cast(lparam, self.__PCOPYDATASTRUCT) +# print ">>> 0x%X" % int(pCDS.contents.dwData), ctypes.wstring_at(pCDS.contents.lpData) self.__mpc_api.handle_command(pCDS.contents.dwData, ctypes.wstring_at(pCDS.contents.lpData)) def SendCommand(self, cmd, message = u''): +# print "<<< 0x%X" % int(cmd), message if not win32gui.IsWindow(self.mpc_handle): raise MPC_API.NoSlaveDetectedException("MPC Slave Window not detected") cs = self.__COPYDATASTRUCT() diff --git a/syncplay/players/mpc_using_api.py b/syncplay/players/mpc_using_api.py index 9eb9f74..32b8f03 100644 --- a/syncplay/players/mpc_using_api.py +++ b/syncplay/players/mpc_using_api.py @@ -1,15 +1,18 @@ #coding:utf8 from ..mpc_api import MPC_API +from twisted.internet import reactor class MPCHCAPIPlayer(object): - def __init__(self, manager, host = None): + def __init__(self, manager): self.manager = manager self.mpc_api = MPC_API() self.pinged = False self.tmp_filename = None self.tmp_position = None - + + self.mpc_api.callbacks.on_file_ready = lambda _: reactor.callLater(0.7,self.make_ping) + self.mpc_api.callbacks.on_update_filename = self.handle_updated_filename def drop(self): pass @@ -17,7 +20,10 @@ class MPCHCAPIPlayer(object): pass def make_ping(self): + self.manager.init_player(self) + self.pinged = True self.ask_for_status() + self.mpc_api.callbacks.on_file_ready = None def display_message(self, message): try: @@ -41,28 +47,26 @@ class MPCHCAPIPlayer(object): self.mpc_error() def ask_for_status(self): - position = None - filename = None + position = self.tmp_position if self.tmp_position else 0 paused = None - if(not self.pinged): - self.manager.init_player(self) - self.pinged = True - else: - try: - if(self.mpc_api.is_file_ready()): - position = self.mpc_api.ask_for_current_position() - filename = self.mpc_api.fileplaying - paused = self.mpc_api.is_paused() - - position = float(position) - self.tmp_position = position - if filename != self.tmp_filename: - self.tmp_filename = filename - self.manager.update_filename(str(filename)) - self.manager.update_player_status(paused, position) - except MPC_API.NoSlaveDetectedException: - self.mpc_error() - + try: + if(self.mpc_api.is_file_ready()): + position = self.mpc_api.ask_for_current_position() + paused = self.mpc_api.is_paused() + position = float(position) + self.tmp_position = position + self.manager.update_player_status(paused, position) + else: + self.manager.update_player_status(True, position) + except MPC_API.NoSlaveDetectedException: + self.mpc_error() + + def handle_updated_filename(self,filename): + self.filename = filename[0] + self.manager.update_filename(self.filename) + self.mpc_api.seek(self.manager.get_global_position()) + reactor.callLater(0.7, self.mpc_api.pause) + def mpc_error(self): if self.manager.running: print 'Failed to connect to MPC-HC API!' @@ -71,7 +75,6 @@ class MPCHCAPIPlayer(object): def run_mpc(manager, mpc_path, file_path, args): mpc = MPCHCAPIPlayer(manager) - mpc.mpc_api.callbacks.on_file_ready = mpc.make_ping mpc.mpc_api.callbacks.on_connected = lambda _: mpc.mpc_api.open_file(file_path) if(file_path) else None mpc.mpc_api.start_mpc(mpc_path, args)