diff --git a/SplashScr.py b/SplashScr.py index 2f1f714..1d1b96c 100644 --- a/SplashScr.py +++ b/SplashScr.py @@ -7,28 +7,30 @@ import pango import clutter from Spinner import Spinner -class SplashScr(): +class SplashScr(clutter.Group): font = "Lucida Grande " message_font_size = 30 detail_font_size = 22 def __init__(self, stage): + clutter.Group.__init__ (self) self.stage = stage self.backdrop = clutter.Rectangle() self.backdrop.set_color(clutter.color_parse('Black')) self.backdrop.set_width(self.stage.get_width()) self.backdrop.set_height(self.stage.get_height()) - - - self.main_group = clutter.Group() + self.add(self.backdrop) + + self.centre_group = clutter.Group() + self.add(self.centre_group) pixbuf = gtk.gdk.pixbuf_new_from_file("ui/splash_box.png") self.box = clutter.Texture() self.box.set_pixbuf(pixbuf) self.box.set_opacity(int(255 * 0.75)) self.box.set_height(int(self.stage.get_height()* 0.15)) - self.main_group.add(self.box) + self.centre_group.add(self.box) self.spinner = Spinner() height = int(self.box.get_height() * 0.90) @@ -36,7 +38,7 @@ class SplashScr(): self.spinner.set_height(height) self.spinner.set_width(height) self.spinner.set_position(5, int(self.box.get_height() * 0.05 ) ) - self.main_group.add(self.spinner) + self.centre_group.add(self.spinner) self.message = clutter.Label() self.message.set_font_name(self.font + str(self.message_font_size)) @@ -45,30 +47,47 @@ class SplashScr(): pos_x = pos_x + int (self.spinner.get_width() * 1.1) self.message.set_position(pos_x, 0) self.message.set_text("Loading...") - self.main_group.add(self.message) + self.centre_group.add(self.message) self.detail = clutter.Label() self.detail.set_font_name(self.font + str(self.detail_font_size)) self.detail.set_color(clutter.color_parse('White')) - self.main_group.add(self.detail) - - + self.centre_group.add(self.detail) + def display(self): - self.stage.add(self.backdrop) + self.stage.add(self) self.backdrop.show() - self.stage.add(self.main_group) - self.main_group.show_all() + group_x = (self.stage.get_width()/2) - (self.box.get_width()/2) group_y = (self.stage.get_height()/2) - (self.box.get_height()/2) - self.main_group.set_position(group_x, group_y) - self.main_group.show() + self.centre_group.set_position(group_x, group_y) + self.centre_group.show_all() + self.centre_group.show() + self.show() + self.spinner.start() + + + def display_elegant(self): + self.set_opacity(0) + self.stage.add(self) + self.show_all() + + group_x = (self.stage.get_width()/2) - (self.box.get_width()/2) + group_y = (self.stage.get_height()/2) - (self.box.get_height()/2) + self.centre_group.set_position(group_x, group_y) + self.show() + + timeline_opacity = clutter.Timeline(20, 25) + alpha_opacity = clutter.Alpha(timeline_opacity, clutter.ramp_inc_func) + self.behaviour_opacity = clutter.BehaviourOpacity(opacity_start=0, opacity_end=255, alpha=alpha_opacity) + self.behaviour_opacity.apply(self) + timeline_opacity.start() self.spinner.start() def remove(self): - self.stage.remove(self.main_group) - self.stage.remove(self.backdrop) + self.stage.remove(self) self.spinner.stop() diff --git a/modules/myth_tv_player/MythBackendConn.py b/modules/myth_tv_player/MythBackendConn.py index d88c520..7a313fe 100644 --- a/modules/myth_tv_player/MythBackendConn.py +++ b/modules/myth_tv_player/MythBackendConn.py @@ -5,6 +5,8 @@ import thread import os class MythBackendConnection(threading.Thread): + pipe_rfd = None + pipe_wfd = None def __init__(self, videoPlayer, server, port): self.protocolVersion = 31 @@ -111,7 +113,10 @@ class MythBackendConnection(threading.Thread): result = self.receive_reply(self.sock) if not result == spawn_receive_string: print "TV_PLAYER: failed to spawn live tv. Result: "+str(result) + + self.setup_recording() + def setup_recording(self): #Check the recording check_string = "QUERY_RECORDER "+str(self.recorder)+"[]:[]IS_RECORDING" self.send_cmd(self.sock, check_string) @@ -181,9 +186,10 @@ class MythBackendConnection(threading.Thread): max_request_size = 270000 request_size_step = 16384 - #Data is sent through a pipe to GStreamer - (pipe_rfd, pipe_wfd) = os.pipe() - self.videoPlayer.begin_playback(pipe_rfd) + if self.pipe_rfd is None: + #Data is sent through a pipe to GStreamer + (self.pipe_rfd, self.pipe_wfd) = os.pipe() + self.videoPlayer.begin_playback(self.pipe_rfd) print "BEGINNING PLAYBACK!" self.Playing = True @@ -192,7 +198,7 @@ class MythBackendConnection(threading.Thread): self.send_cmd(cmd_sock, transfer_cmd) num_bytes = int(self.receive_reply(cmd_sock)) data = data_sock.recv(num_bytes) - os.write(pipe_wfd, data) + os.write(self.pipe_wfd, data) #This tries to optimise the request size @@ -205,8 +211,7 @@ class MythBackendConnection(threading.Thread): print "Ending playback" - os.close(pipe_wfd) - os.close(pipe_rfd) + def message_socket_mgr(self, msg_socket): #Do the protocol version check @@ -238,21 +243,30 @@ class MythBackendConnection(threading.Thread): def change_channel(self, chanName): if self.Playing: + self.Playing = False #First check its a valid channel ID validate_cmd = "QUERY_RECORDER "+str(self.recorder) +"[]:[]CHECK CHANNEL[]:[]"+str(chanName) self.send_cmd(self.sock, validate_cmd) result = self.receive_reply(self.sock) + print "Recorder Result: " + result if result == "ok": - self.Playing = False change_cmd = "QUERY_RECORDER "+str(self.recorder) +"[]:[]SET CHANNEL[]:[]"+str(chanName) self.send_cmd(self.sock, change_cmd) result = self.receive_reply(self.sock) print "Change result: " + result + #Reset the data socket + self.data_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.data_socket_id = None + self.data_sock.connect((self.server, self.server_port)) + #Start a recording thread - self.buffer_live(self.sock, self.data_sock, self.data_socket_id) + self.setup_recording() + #self.buffer_live(self.sock, self.data_sock, self.data_socket_id) + else: + print "TV_PLAYER: Invalid channel selected" def end_stream(self): self.stream = False @@ -264,6 +278,14 @@ class MythBackendConnection(threading.Thread): self.send_cmd(self.sock, stop_cmd) result = self.receive_reply(self.sock) + #Close the pipe + if not self.pipe_wfd is None: + os.close(self.pipe_wfd) + self.pipe_wfd = None + if not self.pipe_rfd is None: + os.close(self.pipe_rfd) + self.pipe_rfd = None + if not self.data_socket_id is None: end_transfer_cmd = "QUERY_FILETRANSFER "+str(self.data_socket_id) +"[]:[]DONE" self.send_cmd(self.sock, end_transfer_cmd) diff --git a/modules/myth_tv_player/myth_tv_player.py b/modules/myth_tv_player/myth_tv_player.py index 944f065..b5678d2 100644 --- a/modules/myth_tv_player/myth_tv_player.py +++ b/modules/myth_tv_player/myth_tv_player.py @@ -8,6 +8,7 @@ import gobject from clutter import cluttergst from modules.myth_tv_player.MythBackendConn import MythBackendConnection from modules.myth_tv_player.tv_db_controller import tv_db_controller +from SplashScr import SplashScr #from Menu import Menu from VideoController import VideoController @@ -67,10 +68,16 @@ class Module: def on_key_press_event (self, stage, event): if self.isRunning: #Handle up/down presses for OSD - if (event.keyval == clutter.keysyms.Up) or (event.keyval == clutter.keysyms.Down) or (event.keyval == clutter.keysyms.Return): + if (event.keyval == clutter.keysyms.Up) or (event.keyval == clutter.keysyms.Down): self.osd.on_key_press_event(self.stage, event, self) self.videoController.on_key_press_event(event) + + if (event.keyval == clutter.keysyms.Return): + if self.osd.on_screen: + self.loading_scr = SplashScr(self.stage) + self.myConn.change_channel(self.currentChannel.name) + if event.keyval == clutter.keysyms.Escape: return True #print event.hardware_keycode @@ -122,8 +129,6 @@ class osd: elif (event.keyval == clutter.keysyms.Down): self.channelOffset -= 1 - if (event.keyval == clutter.keysyms.Return): - tv_player.myConn.change_channel(self.currentChannel.name) else: stage.add(self.text) self.channelOffset = 0