1*f81fb7c4SAndroid Build Coastguard Worker""" 2*f81fb7c4SAndroid Build Coastguard Worker File: 3*f81fb7c4SAndroid Build Coastguard Worker JetPreview.py 4*f81fb7c4SAndroid Build Coastguard Worker 5*f81fb7c4SAndroid Build Coastguard Worker Contents and purpose: 6*f81fb7c4SAndroid Build Coastguard Worker Plays the preview of a segment or event via the dialog box 7*f81fb7c4SAndroid Build Coastguard Worker 8*f81fb7c4SAndroid Build Coastguard Worker Copyright (c) 2008 Android Open Source Project 9*f81fb7c4SAndroid Build Coastguard Worker 10*f81fb7c4SAndroid Build Coastguard Worker Licensed under the Apache License, Version 2.0 (the "License"); 11*f81fb7c4SAndroid Build Coastguard Worker you may not use this file except in compliance with the License. 12*f81fb7c4SAndroid Build Coastguard Worker You may obtain a copy of the License at 13*f81fb7c4SAndroid Build Coastguard Worker 14*f81fb7c4SAndroid Build Coastguard Worker http://www.apache.org/licenses/LICENSE-2.0 15*f81fb7c4SAndroid Build Coastguard Worker 16*f81fb7c4SAndroid Build Coastguard Worker Unless required by applicable law or agreed to in writing, software 17*f81fb7c4SAndroid Build Coastguard Worker distributed under the License is distributed on an "AS IS" BASIS, 18*f81fb7c4SAndroid Build Coastguard Worker WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19*f81fb7c4SAndroid Build Coastguard Worker See the License for the specific language governing permissions and 20*f81fb7c4SAndroid Build Coastguard Worker limitations under the License. 21*f81fb7c4SAndroid Build Coastguard Worker""" 22*f81fb7c4SAndroid Build Coastguard Worker 23*f81fb7c4SAndroid Build Coastguard Workerfrom __future__ import with_statement 24*f81fb7c4SAndroid Build Coastguard Worker 25*f81fb7c4SAndroid Build Coastguard Workerimport wx 26*f81fb7c4SAndroid Build Coastguard Workerimport threading 27*f81fb7c4SAndroid Build Coastguard Worker 28*f81fb7c4SAndroid Build Coastguard Workerfrom JetDefs import * 29*f81fb7c4SAndroid Build Coastguard Workerfrom JetCtrls import * 30*f81fb7c4SAndroid Build Coastguard Workerfrom JetFile import * 31*f81fb7c4SAndroid Build Coastguard Workerfrom JetUtils import * 32*f81fb7c4SAndroid Build Coastguard Workerfrom eas import * 33*f81fb7c4SAndroid Build Coastguard Workerfrom JetStatusEvent import * 34*f81fb7c4SAndroid Build Coastguard Worker 35*f81fb7c4SAndroid Build Coastguard Workerclass PreviewPlayer(wx.Frame): 36*f81fb7c4SAndroid Build Coastguard Worker """ Segment player """ 37*f81fb7c4SAndroid Build Coastguard Worker def __init__ (self, play_button, segment): 38*f81fb7c4SAndroid Build Coastguard Worker self.segment = segment 39*f81fb7c4SAndroid Build Coastguard Worker self.play_button = play_button 40*f81fb7c4SAndroid Build Coastguard Worker self.mute_button = None 41*f81fb7c4SAndroid Build Coastguard Worker self.trigger_button = None 42*f81fb7c4SAndroid Build Coastguard Worker self.playerLock = threading.RLock() 43*f81fb7c4SAndroid Build Coastguard Worker self.SetKeepPlayingFlag(False) 44*f81fb7c4SAndroid Build Coastguard Worker self.graph = None 45*f81fb7c4SAndroid Build Coastguard Worker 46*f81fb7c4SAndroid Build Coastguard Worker def SetGraphCtrl(self, graph, parentWin): 47*f81fb7c4SAndroid Build Coastguard Worker """ Sets the graph control for the player """ 48*f81fb7c4SAndroid Build Coastguard Worker self.graph = graph 49*f81fb7c4SAndroid Build Coastguard Worker self.parentWin = parentWin 50*f81fb7c4SAndroid Build Coastguard Worker 51*f81fb7c4SAndroid Build Coastguard Worker def SetGraphCallbackFct(self, ClickCallbackFct): 52*f81fb7c4SAndroid Build Coastguard Worker """ Sets the callback function for the graph control to update """ 53*f81fb7c4SAndroid Build Coastguard Worker self.ClickCallbackFct = ClickCallbackFct 54*f81fb7c4SAndroid Build Coastguard Worker 55*f81fb7c4SAndroid Build Coastguard Worker def GraphTriggerClip(self, sClipName, iEventId): 56*f81fb7c4SAndroid Build Coastguard Worker """ Triggers a clip by clicking on it """ 57*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 58*f81fb7c4SAndroid Build Coastguard Worker try: 59*f81fb7c4SAndroid Build Coastguard Worker self.jet.TriggerClip(iEventId) 60*f81fb7c4SAndroid Build Coastguard Worker return True 61*f81fb7c4SAndroid Build Coastguard Worker except: 62*f81fb7c4SAndroid Build Coastguard Worker return False 63*f81fb7c4SAndroid Build Coastguard Worker 64*f81fb7c4SAndroid Build Coastguard Worker def SetMuteFlag(self, trackNum, mute): 65*f81fb7c4SAndroid Build Coastguard Worker """ Sets a mute flag """ 66*f81fb7c4SAndroid Build Coastguard Worker sync = JetDefs.DEFAULT_MUTE_SYNC 67*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 68*f81fb7c4SAndroid Build Coastguard Worker try: 69*f81fb7c4SAndroid Build Coastguard Worker self.jet.SetMuteFlag(trackNum, mute, sync) 70*f81fb7c4SAndroid Build Coastguard Worker logging.info("SetMuteFlag() Track:%d Mute:%d Sync:%d" % (trackNum, mute, sync)) 71*f81fb7c4SAndroid Build Coastguard Worker return True 72*f81fb7c4SAndroid Build Coastguard Worker except: 73*f81fb7c4SAndroid Build Coastguard Worker return False 74*f81fb7c4SAndroid Build Coastguard Worker 75*f81fb7c4SAndroid Build Coastguard Worker def TriggerClip(self, eventID): 76*f81fb7c4SAndroid Build Coastguard Worker """ Triggers a clip via function """ 77*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 78*f81fb7c4SAndroid Build Coastguard Worker try: 79*f81fb7c4SAndroid Build Coastguard Worker self.jet.TriggerClip(eventID) 80*f81fb7c4SAndroid Build Coastguard Worker logging.info("TriggerClip() eventID: %d" % eventID) 81*f81fb7c4SAndroid Build Coastguard Worker return True 82*f81fb7c4SAndroid Build Coastguard Worker except: 83*f81fb7c4SAndroid Build Coastguard Worker return False 84*f81fb7c4SAndroid Build Coastguard Worker 85*f81fb7c4SAndroid Build Coastguard Worker def MuteTrackViaButton(self, button, trackNum): 86*f81fb7c4SAndroid Build Coastguard Worker """ Mutes a track via a button """ 87*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 88*f81fb7c4SAndroid Build Coastguard Worker self.mute_button = button 89*f81fb7c4SAndroid Build Coastguard Worker if button.GetLabel() == JetDefs.BUT_MUTE: 90*f81fb7c4SAndroid Build Coastguard Worker if self.SetMuteFlag(trackNum, True): 91*f81fb7c4SAndroid Build Coastguard Worker button.SetLabel(JetDefs.BUT_UNMUTE) 92*f81fb7c4SAndroid Build Coastguard Worker else: 93*f81fb7c4SAndroid Build Coastguard Worker if self.SetMuteFlag(trackNum, False): 94*f81fb7c4SAndroid Build Coastguard Worker button.SetLabel(JetDefs.BUT_MUTE) 95*f81fb7c4SAndroid Build Coastguard Worker 96*f81fb7c4SAndroid Build Coastguard Worker def Start(self): 97*f81fb7c4SAndroid Build Coastguard Worker """ Starts the playback. Called as a thread from dialog boxes """ 98*f81fb7c4SAndroid Build Coastguard Worker self.paused = False 99*f81fb7c4SAndroid Build Coastguard Worker 100*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_PLAY, None)) 101*f81fb7c4SAndroid Build Coastguard Worker 102*f81fb7c4SAndroid Build Coastguard Worker # create a temporary config file, and jet output file 103*f81fb7c4SAndroid Build Coastguard Worker FileKillClean(JetDefs.TEMP_JET_CONFIG_FILE) 104*f81fb7c4SAndroid Build Coastguard Worker 105*f81fb7c4SAndroid Build Coastguard Worker self.jet_file = JetFile(JetDefs.TEMP_JET_CONFIG_FILE, "") 106*f81fb7c4SAndroid Build Coastguard Worker 107*f81fb7c4SAndroid Build Coastguard Worker self.jet_file.AddSegment(self.segment.segname, 108*f81fb7c4SAndroid Build Coastguard Worker self.segment.filename, 109*f81fb7c4SAndroid Build Coastguard Worker self.segment.start, 110*f81fb7c4SAndroid Build Coastguard Worker self.segment.end, 111*f81fb7c4SAndroid Build Coastguard Worker self.segment.length, 112*f81fb7c4SAndroid Build Coastguard Worker SegmentOutputFile(self.segment.segname, JetDefs.TEMP_JET_CONFIG_FILE), 113*f81fb7c4SAndroid Build Coastguard Worker self.segment.quantize, 114*f81fb7c4SAndroid Build Coastguard Worker self.segment.jetevents, 115*f81fb7c4SAndroid Build Coastguard Worker self.segment.dlsfile, 116*f81fb7c4SAndroid Build Coastguard Worker None, 117*f81fb7c4SAndroid Build Coastguard Worker self.segment.transpose, 118*f81fb7c4SAndroid Build Coastguard Worker self.segment.repeat, 119*f81fb7c4SAndroid Build Coastguard Worker self.segment.mute_flags) 120*f81fb7c4SAndroid Build Coastguard Worker userID = 0 121*f81fb7c4SAndroid Build Coastguard Worker dls_num = -1 122*f81fb7c4SAndroid Build Coastguard Worker seg_num = 0 123*f81fb7c4SAndroid Build Coastguard Worker 124*f81fb7c4SAndroid Build Coastguard Worker if len(self.segment.dlsfile) > 0: 125*f81fb7c4SAndroid Build Coastguard Worker self.jet_file.libraries.append(self.segment.dlsfile) 126*f81fb7c4SAndroid Build Coastguard Worker dls_num = 0 127*f81fb7c4SAndroid Build Coastguard Worker 128*f81fb7c4SAndroid Build Coastguard Worker self.jet_file.SaveJetConfig(JetDefs.TEMP_JET_CONFIG_FILE) 129*f81fb7c4SAndroid Build Coastguard Worker self.jet_file.WriteJetFileFromConfig(JetDefs.TEMP_JET_CONFIG_FILE) 130*f81fb7c4SAndroid Build Coastguard Worker 131*f81fb7c4SAndroid Build Coastguard Worker if not ValidateConfig(self.jet_file): 132*f81fb7c4SAndroid Build Coastguard Worker return 133*f81fb7c4SAndroid Build Coastguard Worker 134*f81fb7c4SAndroid Build Coastguard Worker self.queueSegs = [] 135*f81fb7c4SAndroid Build Coastguard Worker self.queueSegs.append(QueueSeg(self.segment.segname, userID, seg_num, dls_num, self.segment.repeat, self.segment.transpose, self.segment.mute_flags)) 136*f81fb7c4SAndroid Build Coastguard Worker 137*f81fb7c4SAndroid Build Coastguard Worker self.jet = JET() 138*f81fb7c4SAndroid Build Coastguard Worker self.jet.eas.StartWave() 139*f81fb7c4SAndroid Build Coastguard Worker self.jet.OpenFile(self.jet_file.config.filename) 140*f81fb7c4SAndroid Build Coastguard Worker 141*f81fb7c4SAndroid Build Coastguard Worker # queue first segment and start playback 142*f81fb7c4SAndroid Build Coastguard Worker index = 0 143*f81fb7c4SAndroid Build Coastguard Worker Queue(self.jet, self.queueSegs[index]) 144*f81fb7c4SAndroid Build Coastguard Worker 145*f81fb7c4SAndroid Build Coastguard Worker index += 1 146*f81fb7c4SAndroid Build Coastguard Worker self.jet.Play() 147*f81fb7c4SAndroid Build Coastguard Worker 148*f81fb7c4SAndroid Build Coastguard Worker self.SetKeepPlayingFlag(True) 149*f81fb7c4SAndroid Build Coastguard Worker while self.GetKeepPlayingFlag(): 150*f81fb7c4SAndroid Build Coastguard Worker self.jet.Render() 151*f81fb7c4SAndroid Build Coastguard Worker status = self.jet.Status() 152*f81fb7c4SAndroid Build Coastguard Worker 153*f81fb7c4SAndroid Build Coastguard Worker # if no more segments - we're done 154*f81fb7c4SAndroid Build Coastguard Worker if status.numQueuedSegments == 0: 155*f81fb7c4SAndroid Build Coastguard Worker break 156*f81fb7c4SAndroid Build Coastguard Worker 157*f81fb7c4SAndroid Build Coastguard Worker self.jet.GetAppEvent() 158*f81fb7c4SAndroid Build Coastguard Worker 159*f81fb7c4SAndroid Build Coastguard Worker # if less than 2 segs queued - queue another one 160*f81fb7c4SAndroid Build Coastguard Worker if (index < len(self.queueSegs)) and (status.numQueuedSegments < 2): 161*f81fb7c4SAndroid Build Coastguard Worker Queue(self.jet, self.queueSegs[index]) 162*f81fb7c4SAndroid Build Coastguard Worker index += 1 163*f81fb7c4SAndroid Build Coastguard Worker 164*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_UPD_LOCATION, status.location)) 165*f81fb7c4SAndroid Build Coastguard Worker 166*f81fb7c4SAndroid Build Coastguard Worker SafeJetShutdown(self.playerLock, self.jet) 167*f81fb7c4SAndroid Build Coastguard Worker 168*f81fb7c4SAndroid Build Coastguard Worker FileKillClean(SegmentOutputFile(self.segment.segname, JetDefs.TEMP_JET_CONFIG_FILE)) 169*f81fb7c4SAndroid Build Coastguard Worker FileKillClean(JetDefs.TEMP_JET_CONFIG_FILE) 170*f81fb7c4SAndroid Build Coastguard Worker FileKillClean(self.jet_file.config.filename) 171*f81fb7c4SAndroid Build Coastguard Worker 172*f81fb7c4SAndroid Build Coastguard Worker self.SetKeepPlayingFlag(False) 173*f81fb7c4SAndroid Build Coastguard Worker 174*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_DONE, None)) 175*f81fb7c4SAndroid Build Coastguard Worker 176*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_UPD_LOCATION, 0)) 177*f81fb7c4SAndroid Build Coastguard Worker 178*f81fb7c4SAndroid Build Coastguard Worker def SetKeepPlayingFlag(self, val): 179*f81fb7c4SAndroid Build Coastguard Worker """ Sets the flag to tell us wheter to keep playing """ 180*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 181*f81fb7c4SAndroid Build Coastguard Worker self.keepPlaying = val 182*f81fb7c4SAndroid Build Coastguard Worker 183*f81fb7c4SAndroid Build Coastguard Worker def GetKeepPlayingFlag(self): 184*f81fb7c4SAndroid Build Coastguard Worker """ Gets the keep playing flag """ 185*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 186*f81fb7c4SAndroid Build Coastguard Worker return self.keepPlaying 187*f81fb7c4SAndroid Build Coastguard Worker 188*f81fb7c4SAndroid Build Coastguard Worker def Pause(self): 189*f81fb7c4SAndroid Build Coastguard Worker """ Pauses playback """ 190*f81fb7c4SAndroid Build Coastguard Worker if self.jet is None: 191*f81fb7c4SAndroid Build Coastguard Worker return 192*f81fb7c4SAndroid Build Coastguard Worker if not self.paused: 193*f81fb7c4SAndroid Build Coastguard Worker self.jet.Pause() 194*f81fb7c4SAndroid Build Coastguard Worker self.paused = True 195*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_PAUSE, None)) 196*f81fb7c4SAndroid Build Coastguard Worker else: 197*f81fb7c4SAndroid Build Coastguard Worker self.jet.Play() 198*f81fb7c4SAndroid Build Coastguard Worker self.paused = False 199*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_RESUME, None)) 200*f81fb7c4SAndroid Build Coastguard Worker 201