diff --git a/Menu.py b/Menu.py index 15a49a2..067cdd1 100644 --- a/Menu.py +++ b/Menu.py @@ -184,8 +184,7 @@ class Menu: else: #move the selection bar self.menuMgr.get_selector_bar().selectItem(self.menuItems[self.selected], self.timeline) - - + self.timeline.start() self.moveQueue = 0 @@ -196,7 +195,7 @@ class Menu: self.selectPrevious() def selectFirst(self, moveBar): - self.timeline = clutter.Timeline(15, 75) + self.timeline = clutter.Timeline(1, 75) self.selected = 0 for i in range(0,len(self.menuItems)): if i == 0: diff --git a/Menu.pyc b/Menu.pyc index 27202c8..da6f1c6 100644 Binary files a/Menu.pyc and b/Menu.pyc differ diff --git a/MenuMgr.py b/MenuMgr.py index 87ba0ab..9258936 100644 --- a/MenuMgr.py +++ b/MenuMgr.py @@ -197,14 +197,42 @@ class MenuSelector(clutter.Texture): self.menu = menu def set_spinner(self, state): + self.timeline = clutter.Timeline(25, 25) + self.alpha = clutter.Alpha(self.timeline, clutter.ramp_inc_func) + self.behaviour = clutter.BehaviourOpacity(self.alpha, 0,255) if state: self.spinner = Spinner() + + height = self.get_height() - int(self.get_height() * 0.11) + #Height has to be even otherwise spinner rotates on a slightly off axis + if (height % 2) == 1: + height = height -1 + + width = height + self.spinner.set_size(width, height) + + (x, y) = self.get_abs_position() + x = x + self.get_width() - int(self.get_width() * 0.11) + y = y + int(self.get_height() * 0.05) + self.spinner.set_position(x, y) + + self.spinner.set_opacity(0) self.spinner.show() self.menuMgr.get_stage().add(self.spinner) + self.behaviour = clutter.BehaviourOpacity(self.alpha, 0,255) + self.spinner.start() else: - self.menuMgr.get_stage().remove(self.spinner) - self.spinner = None + self.behaviour = clutter.BehaviourOpacity(self.alpha, 255,0) + self.timeline.connect('completed', self.spinner_end_event) + #self.menuMgr.get_stage().remove(self.spinner) + #self.spinner = None + self.behaviour.apply(self.spinner) + self.timeline.start() + + def spinner_end_event(self, data): + self.menuMgr.get_stage().remove(self.spinner) + self.spinner = None def get_x_offset(self): return self.x_offset diff --git a/MenuMgr.pyc b/MenuMgr.pyc index df51bf3..87beb45 100644 Binary files a/MenuMgr.pyc and b/MenuMgr.pyc differ diff --git a/Spinner.py b/Spinner.py index 8f424dd..e4a2de5 100644 --- a/Spinner.py +++ b/Spinner.py @@ -9,12 +9,15 @@ class Spinner (clutter.Texture): #self.texture = clutter.Texture() pixbuf = gtk.gdk.pixbuf_new_from_file("ui/spinner.svg") self.set_pixbuf(pixbuf) - - timeline = clutter.Timeline(40,20) - timeline.set_loop(True) - alpha = clutter.Alpha(timeline, clutter.ramp_inc_func) + + def start(self): + self.timeline = clutter.Timeline(40,20) + self.timeline.set_loop(True) + alpha = clutter.Alpha(self.timeline, clutter.ramp_inc_func) spin_behaviour = clutter.BehaviourRotate(alpha, clutter.Z_AXIS, clutter.ROTATE_CW, 0, 359) spin_behaviour.set_center(self.get_width()/2,self.get_height()/2, 0) spin_behaviour.apply(self) + self.timeline.start() - timeline.start() \ No newline at end of file + def stop(self): + self.timeline.stop() diff --git a/Spinner.pyc b/Spinner.pyc index b6ded9f..1329f8b 100644 Binary files a/Spinner.pyc and b/Spinner.pyc differ diff --git a/TVPlayer.py b/TVPlayer.py index 6fc6977..52542ac 100644 --- a/TVPlayer.py +++ b/TVPlayer.py @@ -2,6 +2,7 @@ import gst import pygtk import pygst import os +import clutter from clutter import cluttergst from myth.MythBackendConn import MythBackendConnection @@ -26,9 +27,13 @@ class TVPlayer: #self.db_conn = mythVideoDB() def begin(self, menuMgr): + self.menuMgr = menuMgr + #self.buffer_file_reader = open("test.mpg","r") + menuMgr.get_selector_bar().set_spinner(True) (server, port) = self.dbMgr.get_backend_server() self.myConn = MythBackendConnection(self, server, port) self.myConn.start() + #self.begin_playback(self.buffer_file_reader.fileno()) def begin_playback(self, fd): #self.video.set_filename("test.mpg") @@ -36,14 +41,23 @@ class TVPlayer: #self.buffer_file = open("test.mpg","r") #fd = self.buffer_file.fileno() #print os.read(fd, 100) - """ + self.menuMgr.get_selector_bar().set_spinner(False) self.video.set_uri("fd://"+str(fd)) + #self.video.set_property("fullscreen", True) + self.video.set_opacity(0) self.video.show() + timeline = clutter.Timeline(15, 25) + alpha = clutter.Alpha(timeline, clutter.ramp_inc_func) + behaviour = clutter.BehaviourOpacity(alpha, 0,255) + behaviour.apply(self.video) + self.stage.add(self.video) self.video.set_playing(True) + timeline.start() - return None""" + return None + """ self.pipeline = gst.Pipeline("mypipeline") self.pbin = gst.element_factory_make("playbin", "pbin"); self.pbin.set_property("uri", "fd://"+str(fd)) @@ -51,10 +65,27 @@ class TVPlayer: # add elements to the pipeline self.pipeline.add(self.pbin) self.pipeline.set_state(gst.STATE_PLAYING) + """ + def stop(self): + if self.video.get_playing(): + self.video.set_playing(False) + self.myConn.stop() + + timeline = clutter.Timeline(15, 25) + timeline.connect('completed', self.end_video_event) + alpha = clutter.Alpha(timeline, clutter.ramp_inc_func) + behaviour = clutter.BehaviourOpacity(alpha, 255,0) + behaviour.apply(self.video) + + timeline.start() + + + def end_video_event(self, data): + self.stage.remove(self.video) def on_key_press_event (self, stage, event): #print event.hardware_keycode - #self.myConn.stop() + """if event.keyval == clutter.keysyms.p: if self.paused: self.unpause() diff --git a/TVPlayer.pyc b/TVPlayer.pyc index 7595653..b6d378a 100644 Binary files a/TVPlayer.pyc and b/TVPlayer.pyc differ diff --git a/gloss.py b/gloss.py index 2efd9e1..e74ccba 100644 --- a/gloss.py +++ b/gloss.py @@ -82,6 +82,8 @@ class MainApp: self.menu2.getItem(1).setAction(self.menu1) + #print self.menuMgr.get_selector_bar().get_abs_position() + #self.menuMgr.get_selector_bar().set_spinner(True) def on_button_press_event (self, stage, event): diff --git a/myth/MythBackendConn.py b/myth/MythBackendConn.py index 4e4f815..97cbdf4 100644 --- a/myth/MythBackendConn.py +++ b/myth/MythBackendConn.py @@ -1,6 +1,7 @@ import socket import time import threading +import thread import os class MythBackendConnection(threading.Thread): @@ -12,13 +13,16 @@ class MythBackendConnection(threading.Thread): self.server_port = port #6543 self.addr = (self.server, self.server_port) self.videoPlayer = videoPlayer + self.lock = False #Dictakes whether or not we have a signal lock - #2 Sockets, 1 for cmds, 1 for data + #3 Sockets, 1 for cmds, 1 for data, 1 for monitoring messages self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.data_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.data_sock.connect((self.server, self.server_port)) - #self.data_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - #self.data_sock.bind( ("127.0.0.1", self.server_port) ) + self.msg_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.msg_sock.connect((self.server, self.server_port)) + + thread.start_new_thread(self.message_socket_mgr,(self.msg_sock,)) #self.sock.connect( ("192.168.0.8", 6543) ) self.connected = False @@ -52,19 +56,6 @@ class MythBackendConnection(threading.Thread): sock.send(cmd) #print "write-->" + cmd - """def send_datagram(self, sock, base_cmd): - cmd = str(len(base_cmd)).ljust(8) + base_cmd - #sock.sendto(cmd, self.addr) - sock.sendto(cmd, ("192.168.0.8", 6543) ) - - def receive_datagram(self, sock): - ret = "" - data, addr = sock.recvfrom(8) - count = int(data) - #debug("REPLY LEN: %d" % count) - ret, addr = sock.recvfrom(count) - return ret - """ def connect(self, host, port): self.sock.connect((host, port)) @@ -138,6 +129,8 @@ class MythBackendConnection(threading.Thread): #This is just a hack to make sure the channel has locked, I'll fix it later time.sleep(5) + #while not self.lock: + # pass #Get the recording filename filename_string = "QUERY_RECORDER "+str(self.recorder)+"[]:[]GET_CURRENT_RECORDING" @@ -155,8 +148,8 @@ class MythBackendConnection(threading.Thread): result = self.receive_reply(self.data_sock) #result = self.receive_datagram(self.data_sock) result_list = result.rsplit("[]:[]") - data_socket_id = result_list[1] - print "Socket ID: " + str(data_socket_id) + self.data_socket_id = result_list[1] + #print "Socket ID: " + str(data_socket_id) #Do some housekeeping frontend_ready_cmd = "QUERY_RECORDER "+str(self.recorder) +"[]:[]FRONTEND_READY" @@ -170,16 +163,12 @@ class MythBackendConnection(threading.Thread): result = self.receive_reply(self.sock) #Start a recording thread - self.buffer_live(self.sock, self.data_sock, data_socket_id) + self.buffer_live(self.sock, self.data_sock, self.data_socket_id) def buffer_live(self, cmd_sock, data_sock, socket_id): #Create a buffer file self.buffer_file = open("test.mpg","w") - - #read some data - - request_size = 32768 - + request_size = 32768 #Need to create a bit of a buffer so playback will begin x=0 @@ -190,7 +179,7 @@ class MythBackendConnection(threading.Thread): data = data_sock.recv(num_bytes) self.buffer_file.write(data) x=x+1 - + self.buffer_file.flush() self.buffer_file_reader = open("test.mpg","r") self.videoPlayer.begin_playback(self.buffer_file_reader.fileno()) #self.videoPlayer.begin_playback(self.data_sock.fileno()) @@ -206,6 +195,40 @@ class MythBackendConnection(threading.Thread): print "Ending playback" self.buffer_file.close() + + def message_socket_mgr(self, msg_socket): + #Do the protocol version check + print "Starting the msg thread" + protString = "MYTH_PROTO_VERSION "+ str(self.protocolVersion) + self.send_cmd(self.msg_sock, protString) + protRecvString = "ACCEPT[]:[]" + str(self.protocolVersion) + result = self.receive_reply(self.msg_sock) + print result + if not result == protRecvString: + #Protocol Version check failed + raise RuntimeError, "Myth Protocol version failure. Aborting." + + #Perform the mandatory ANN (The 1 at the end says that we want to receive all messages from the server) + ANNstring = "ANN Monitor " + self.localhost_name + " 1" + self.send_cmd(self.msg_sock, ANNstring) + ANN_recv_string = "OK" #What a successful return should be + result = self.receive_reply(self.msg_sock) + if not result == ANN_recv_string: + raise RuntimeError, "Myth: ANN connection failed" + + while not self.lock: + #ANN_recv_string = "OK" #What a successful return should be + result = self.receive_reply(self.msg_sock) + result_list = result.rsplit("[]:[]") + print result + + if result_list[1] == "RECORDING_LIST_CHANGE": + #print resul + self.lock = True + + def change_channel(self): + if self.Playing: + pass #self.Playing = False def end_stream(self): self.stream = False @@ -213,3 +236,10 @@ class MythBackendConnection(threading.Thread): def stop(self): self.Playing = False + stop_cmd = "QUERY_RECORDER "+str(self.recorder) +"[]:[]STOP_LIVETV" + self.send_cmd(self.sock, stop_cmd) + result = self.receive_reply(self.sock) + + end_transfer_cmd = "QUERY_FILETRANSFER "+str(self.data_socket_id) +"[]:[]DONE" + self.send_cmd(self.sock, end_transfer_cmd) + result = self.receive_reply(self.sock) diff --git a/myth/MythBackendConn.pyc b/myth/MythBackendConn.pyc index e2a92dc..4cebe04 100644 Binary files a/myth/MythBackendConn.pyc and b/myth/MythBackendConn.pyc differ