1*f81fb7c4SAndroid Build Coastguard Worker""" 2*f81fb7c4SAndroid Build Coastguard Worker File: 3*f81fb7c4SAndroid Build Coastguard Worker JetAudition.py 4*f81fb7c4SAndroid Build Coastguard Worker 5*f81fb7c4SAndroid Build Coastguard Worker Contents and purpose: 6*f81fb7c4SAndroid Build Coastguard Worker Auditions a jet file to simulate interactive music functions 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 sys 27*f81fb7c4SAndroid Build Coastguard Workerimport thread 28*f81fb7c4SAndroid Build Coastguard Workerimport time 29*f81fb7c4SAndroid Build Coastguard Worker 30*f81fb7c4SAndroid Build Coastguard Workerfrom JetUtils import * 31*f81fb7c4SAndroid Build Coastguard Workerfrom JetDefs import * 32*f81fb7c4SAndroid Build Coastguard Workerfrom JetCtrls import JetListCtrl, JetTrackCtrl 33*f81fb7c4SAndroid Build Coastguard Workerfrom JetSegGraph import SegmentGraph, Marker 34*f81fb7c4SAndroid Build Coastguard Workerfrom eas import * 35*f81fb7c4SAndroid Build Coastguard Workerfrom JetStatusEvent import * 36*f81fb7c4SAndroid Build Coastguard Worker 37*f81fb7c4SAndroid Build Coastguard WorkerCMD_QUEUE_AND_CANCEL = 'QueueNCancel' 38*f81fb7c4SAndroid Build Coastguard WorkerCMD_QUEUE_AND_CANCEL_CURRENT = 'QueueCancelCurrent' 39*f81fb7c4SAndroid Build Coastguard WorkerCMD_MUTEALL = 'MuteAll' 40*f81fb7c4SAndroid Build Coastguard WorkerCMD_UNMUTEALL = 'UnMuteAll' 41*f81fb7c4SAndroid Build Coastguard WorkerCMD_ORIGINALMUTES = 'MuteOrg' 42*f81fb7c4SAndroid Build Coastguard WorkerCMD_STOP = 'Stop' 43*f81fb7c4SAndroid Build Coastguard WorkerCMD_PAUSE = 'Pause' 44*f81fb7c4SAndroid Build Coastguard WorkerCMD_PLAY = 'Play' 45*f81fb7c4SAndroid Build Coastguard Worker 46*f81fb7c4SAndroid Build Coastguard WorkerSTATUS_PENDING = 'Pending' 47*f81fb7c4SAndroid Build Coastguard WorkerSTATUS_PLAYING = 'Playing' 48*f81fb7c4SAndroid Build Coastguard WorkerSTATUS_COMPLETE = 'Complete' 49*f81fb7c4SAndroid Build Coastguard WorkerSTATUS_CANCELED = 'Canceled' 50*f81fb7c4SAndroid Build Coastguard WorkerSTATUS_QUEUED = 'Queued' 51*f81fb7c4SAndroid Build Coastguard Worker 52*f81fb7c4SAndroid Build Coastguard WorkerLOAD_QUEUE_DISPLAY = 'LOAD_QUEUE' 53*f81fb7c4SAndroid Build Coastguard WorkerGRAPH_POSITION_UPDATE = 'GRAPH_POS' 54*f81fb7c4SAndroid Build Coastguard WorkerNEW_SEGMENT_DISPLAY = 'NEW SEG' 55*f81fb7c4SAndroid Build Coastguard WorkerCLR_INFO = 'CLR_INFO' 56*f81fb7c4SAndroid Build Coastguard Worker 57*f81fb7c4SAndroid Build Coastguard Workerclass Audition(wx.Dialog): 58*f81fb7c4SAndroid Build Coastguard Worker """ Initializes Audition window controls, then spawns off a thread to be ready for playback commands """ 59*f81fb7c4SAndroid Build Coastguard Worker def __init__(self, jet_file, pSize): 60*f81fb7c4SAndroid Build Coastguard Worker wx.Dialog.__init__(self, None, -1, title=JetDefs.DLG_AUDITION) 61*f81fb7c4SAndroid Build Coastguard Worker 62*f81fb7c4SAndroid Build Coastguard Worker self.jet = None 63*f81fb7c4SAndroid Build Coastguard Worker self.playerLock = threading.RLock() 64*f81fb7c4SAndroid Build Coastguard Worker self.jet_file = jet_file 65*f81fb7c4SAndroid Build Coastguard Worker self.queueSegs = [] 66*f81fb7c4SAndroid Build Coastguard Worker self.keepPlaying = True 67*f81fb7c4SAndroid Build Coastguard Worker self.nextSegNum = 0 68*f81fb7c4SAndroid Build Coastguard Worker self.currentSegmentIndex = None 69*f81fb7c4SAndroid Build Coastguard Worker self.currentSegmentName = "" 70*f81fb7c4SAndroid Build Coastguard Worker self.playCommand = "" 71*f81fb7c4SAndroid Build Coastguard Worker self.threadShutdown = True 72*f81fb7c4SAndroid Build Coastguard Worker 73*f81fb7c4SAndroid Build Coastguard Worker panel = wx.Panel(self, -1) 74*f81fb7c4SAndroid Build Coastguard Worker 75*f81fb7c4SAndroid Build Coastguard Worker self.segList = JetListCtrl(panel) 76*f81fb7c4SAndroid Build Coastguard Worker self.segList.AddCol(JetDefs.GRD_SEGMENTS, 180) 77*f81fb7c4SAndroid Build Coastguard Worker self.segList.AddCol(JetDefs.GRD_LENGTH, 20) 78*f81fb7c4SAndroid Build Coastguard Worker 79*f81fb7c4SAndroid Build Coastguard Worker self.segList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnQueueSegment) 80*f81fb7c4SAndroid Build Coastguard Worker self.segList.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnSegListClick) 81*f81fb7c4SAndroid Build Coastguard Worker 82*f81fb7c4SAndroid Build Coastguard Worker self.queueList = JetListCtrl(panel) 83*f81fb7c4SAndroid Build Coastguard Worker self.queueList.AddCol(JetDefs.GRD_QUEUE, 180) 84*f81fb7c4SAndroid Build Coastguard Worker self.queueList.AddCol(JetDefs.GRD_STATUS, 20) 85*f81fb7c4SAndroid Build Coastguard Worker 86*f81fb7c4SAndroid Build Coastguard Worker self.trackList = JetTrackCtrl(panel) 87*f81fb7c4SAndroid Build Coastguard Worker self.trackList.AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK) 88*f81fb7c4SAndroid Build Coastguard Worker self.trackList.AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL) 89*f81fb7c4SAndroid Build Coastguard Worker self.trackList.AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME) 90*f81fb7c4SAndroid Build Coastguard Worker self.trackList.BindCheckBox(self.OnTrackChecked) 91*f81fb7c4SAndroid Build Coastguard Worker 92*f81fb7c4SAndroid Build Coastguard Worker self.btnMuteAll = wx.Button(panel, -1, JetDefs.BUT_MUTEALL) 93*f81fb7c4SAndroid Build Coastguard Worker self.btnUnMuteAll = wx.Button(panel, -1, JetDefs.BUT_MUTENONE) 94*f81fb7c4SAndroid Build Coastguard Worker self.btnMuteOrg = wx.Button(panel, -1, JetDefs.BUT_ORGMUTES) 95*f81fb7c4SAndroid Build Coastguard Worker hMuteButs = wx.BoxSizer(wx.HORIZONTAL) 96*f81fb7c4SAndroid Build Coastguard Worker hMuteButs.Add(self.btnMuteAll, 1, wx.EXPAND) 97*f81fb7c4SAndroid Build Coastguard Worker hMuteButs.Add(self.btnUnMuteAll, 1, wx.EXPAND) 98*f81fb7c4SAndroid Build Coastguard Worker hMuteButs.Add(self.btnMuteOrg, 1, wx.EXPAND) 99*f81fb7c4SAndroid Build Coastguard Worker vMuteButs = wx.BoxSizer(wx.VERTICAL) 100*f81fb7c4SAndroid Build Coastguard Worker vMuteButs.Add(self.trackList, 1, wx.EXPAND) 101*f81fb7c4SAndroid Build Coastguard Worker vMuteButs.Add((-1, 5)) 102*f81fb7c4SAndroid Build Coastguard Worker vMuteButs.Add(hMuteButs, 0, wx.EXPAND) 103*f81fb7c4SAndroid Build Coastguard Worker 104*f81fb7c4SAndroid Build Coastguard Worker self.btnQueue = wx.Button(panel, -1, JetDefs.BUT_QUEUE) 105*f81fb7c4SAndroid Build Coastguard Worker self.btnCancelNQueue = wx.Button(panel, -1, JetDefs.BUT_CANCELANDQUEUE) 106*f81fb7c4SAndroid Build Coastguard Worker hSegButs = wx.BoxSizer(wx.HORIZONTAL) 107*f81fb7c4SAndroid Build Coastguard Worker hSegButs.Add(self.btnQueue, 1, wx.EXPAND) 108*f81fb7c4SAndroid Build Coastguard Worker hSegButs.Add(self.btnCancelNQueue, 1, wx.EXPAND) 109*f81fb7c4SAndroid Build Coastguard Worker vSegButs = wx.BoxSizer(wx.VERTICAL) 110*f81fb7c4SAndroid Build Coastguard Worker vSegButs.Add(self.segList, 1, wx.EXPAND) 111*f81fb7c4SAndroid Build Coastguard Worker vSegButs.Add((-1, 5)) 112*f81fb7c4SAndroid Build Coastguard Worker vSegButs.Add(hSegButs, 0, wx.EXPAND) 113*f81fb7c4SAndroid Build Coastguard Worker 114*f81fb7c4SAndroid Build Coastguard Worker self.btnQueueCancelCurrent = wx.Button(panel, -1, JetDefs.BUT_CANCELCURRENT) 115*f81fb7c4SAndroid Build Coastguard Worker self.btnPause = wx.Button(panel, -1, JetDefs.BUT_PAUSE) 116*f81fb7c4SAndroid Build Coastguard Worker self.btnStop = wx.Button(panel, -1, JetDefs.BUT_STOP) 117*f81fb7c4SAndroid Build Coastguard Worker hQueueButs = wx.BoxSizer(wx.HORIZONTAL) 118*f81fb7c4SAndroid Build Coastguard Worker hQueueButs.Add(self.btnQueueCancelCurrent, 1, wx.EXPAND) 119*f81fb7c4SAndroid Build Coastguard Worker hQueueButs.Add(self.btnPause, 1, wx.EXPAND) 120*f81fb7c4SAndroid Build Coastguard Worker hQueueButs.Add(self.btnStop, 1, wx.EXPAND) 121*f81fb7c4SAndroid Build Coastguard Worker vQueueButs = wx.BoxSizer(wx.VERTICAL) 122*f81fb7c4SAndroid Build Coastguard Worker vQueueButs.Add(self.queueList, 1, wx.EXPAND) 123*f81fb7c4SAndroid Build Coastguard Worker vQueueButs.Add((-1, 5)) 124*f81fb7c4SAndroid Build Coastguard Worker vQueueButs.Add(hQueueButs, 0, wx.EXPAND) 125*f81fb7c4SAndroid Build Coastguard Worker 126*f81fb7c4SAndroid Build Coastguard Worker self.Bind(wx.EVT_BUTTON, self.OnQueueSegmentViaBut, id=self.btnQueue.GetId()) 127*f81fb7c4SAndroid Build Coastguard Worker self.Bind(wx.EVT_BUTTON, self.OnCancelNQueue, id=self.btnCancelNQueue.GetId()) 128*f81fb7c4SAndroid Build Coastguard Worker self.Bind(wx.EVT_BUTTON, self.OnStop, id=self.btnStop.GetId()) 129*f81fb7c4SAndroid Build Coastguard Worker self.Bind(wx.EVT_BUTTON, self.OnQueueCancelCurrent, id=self.btnQueueCancelCurrent.GetId()) 130*f81fb7c4SAndroid Build Coastguard Worker self.Bind(wx.EVT_BUTTON, self.OnPause, id=self.btnPause.GetId()) 131*f81fb7c4SAndroid Build Coastguard Worker self.Bind(wx.EVT_BUTTON, self.OnMuteAll, id=self.btnMuteAll.GetId()) 132*f81fb7c4SAndroid Build Coastguard Worker self.Bind(wx.EVT_BUTTON, self.OnUnMuteAll, id=self.btnUnMuteAll.GetId()) 133*f81fb7c4SAndroid Build Coastguard Worker self.Bind(wx.EVT_BUTTON, self.OnMuteOrg, id=self.btnMuteOrg.GetId()) 134*f81fb7c4SAndroid Build Coastguard Worker 135*f81fb7c4SAndroid Build Coastguard Worker EVT_JET_STATUS(self, self.OnJetStatusUpdate) 136*f81fb7c4SAndroid Build Coastguard Worker 137*f81fb7c4SAndroid Build Coastguard Worker BORDER = 10 138*f81fb7c4SAndroid Build Coastguard Worker hboxTop = wx.BoxSizer(wx.HORIZONTAL) 139*f81fb7c4SAndroid Build Coastguard Worker hboxTop.Add(vSegButs, 1, wx.EXPAND) 140*f81fb7c4SAndroid Build Coastguard Worker hboxTop.Add((5, -1)) 141*f81fb7c4SAndroid Build Coastguard Worker hboxTop.Add(vQueueButs, 1, wx.EXPAND) 142*f81fb7c4SAndroid Build Coastguard Worker hboxTop.Add((5, -1)) 143*f81fb7c4SAndroid Build Coastguard Worker hboxTop.Add(vMuteButs, 1, wx.EXPAND) 144*f81fb7c4SAndroid Build Coastguard Worker 145*f81fb7c4SAndroid Build Coastguard Worker self.log = wx.TextCtrl(panel, -1) 146*f81fb7c4SAndroid Build Coastguard Worker self.graph = SegmentGraph(panel, size=(-1, 50)) 147*f81fb7c4SAndroid Build Coastguard Worker self.graph.ClickCallbackFct = self.GraphTriggerClip 148*f81fb7c4SAndroid Build Coastguard Worker 149*f81fb7c4SAndroid Build Coastguard Worker vboxBot = wx.BoxSizer(wx.VERTICAL) 150*f81fb7c4SAndroid Build Coastguard Worker vboxBot.Add(self.log, 0, wx.EXPAND) 151*f81fb7c4SAndroid Build Coastguard Worker vboxBot.Add((-1, 5)) 152*f81fb7c4SAndroid Build Coastguard Worker vboxBot.Add(self.graph, 1, wx.EXPAND) 153*f81fb7c4SAndroid Build Coastguard Worker 154*f81fb7c4SAndroid Build Coastguard Worker hboxMain = wx.BoxSizer(wx.VERTICAL) 155*f81fb7c4SAndroid Build Coastguard Worker hboxMain.Add(hboxTop, 2, wx.EXPAND | wx.ALL, BORDER) 156*f81fb7c4SAndroid Build Coastguard Worker hboxMain.Add(vboxBot, 1, wx.EXPAND | wx.ALL, BORDER) 157*f81fb7c4SAndroid Build Coastguard Worker 158*f81fb7c4SAndroid Build Coastguard Worker panel.SetSizer(hboxMain) 159*f81fb7c4SAndroid Build Coastguard Worker 160*f81fb7c4SAndroid Build Coastguard Worker self.LoadSegList() 161*f81fb7c4SAndroid Build Coastguard Worker self.initHelp() 162*f81fb7c4SAndroid Build Coastguard Worker 163*f81fb7c4SAndroid Build Coastguard Worker self.SetSize(pSize) 164*f81fb7c4SAndroid Build Coastguard Worker self.CenterOnParent() 165*f81fb7c4SAndroid Build Coastguard Worker 166*f81fb7c4SAndroid Build Coastguard Worker wx.EVT_CLOSE(self, self.OnClose) 167*f81fb7c4SAndroid Build Coastguard Worker 168*f81fb7c4SAndroid Build Coastguard Worker thread.start_new_thread(self.PlaySegs, ()) 169*f81fb7c4SAndroid Build Coastguard Worker 170*f81fb7c4SAndroid Build Coastguard Worker def initHelp(self): 171*f81fb7c4SAndroid Build Coastguard Worker """ Initializes context sensitive help text """ 172*f81fb7c4SAndroid Build Coastguard Worker self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP ) 173*f81fb7c4SAndroid Build Coastguard Worker self.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, '')) 174*f81fb7c4SAndroid Build Coastguard Worker self.segList.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_SEGLIST)) 175*f81fb7c4SAndroid Build Coastguard Worker self.queueList.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_QUEUELIST)) 176*f81fb7c4SAndroid Build Coastguard Worker self.trackList.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_TRACKLIST)) 177*f81fb7c4SAndroid Build Coastguard Worker self.graph.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_GRAPH)) 178*f81fb7c4SAndroid Build Coastguard Worker 179*f81fb7c4SAndroid Build Coastguard Worker def OnMuteAll(self, event): 180*f81fb7c4SAndroid Build Coastguard Worker """ Sets command to mute all tracks """ 181*f81fb7c4SAndroid Build Coastguard Worker self.SetPlayCommand(CMD_MUTEALL) 182*f81fb7c4SAndroid Build Coastguard Worker 183*f81fb7c4SAndroid Build Coastguard Worker def OnUnMuteAll(self, event): 184*f81fb7c4SAndroid Build Coastguard Worker """ Sets command to un-mute all tracks """ 185*f81fb7c4SAndroid Build Coastguard Worker self.SetPlayCommand(CMD_UNMUTEALL) 186*f81fb7c4SAndroid Build Coastguard Worker 187*f81fb7c4SAndroid Build Coastguard Worker def OnMuteOrg(self, event): 188*f81fb7c4SAndroid Build Coastguard Worker """ Sets command to set mute flags to their original values """ 189*f81fb7c4SAndroid Build Coastguard Worker self.SetPlayCommand(CMD_ORIGINALMUTES) 190*f81fb7c4SAndroid Build Coastguard Worker 191*f81fb7c4SAndroid Build Coastguard Worker def OnTrackChecked(self, index, checked): 192*f81fb7c4SAndroid Build Coastguard Worker """ Mutes or un-mutes a track interactively """ 193*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 194*f81fb7c4SAndroid Build Coastguard Worker trackNum = self.trackList.GetTrackNumber(index) 195*f81fb7c4SAndroid Build Coastguard Worker self.SetMuteFlag(trackNum, checked) 196*f81fb7c4SAndroid Build Coastguard Worker 197*f81fb7c4SAndroid Build Coastguard Worker def SetMuteFlag(self, trackNum, mute): 198*f81fb7c4SAndroid Build Coastguard Worker """ Mutes or un-mutes a track """ 199*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 200*f81fb7c4SAndroid Build Coastguard Worker try: 201*f81fb7c4SAndroid Build Coastguard Worker sync = JetDefs.DEFAULT_MUTE_SYNC 202*f81fb7c4SAndroid Build Coastguard Worker self.jet.SetMuteFlag(trackNum, mute, sync) 203*f81fb7c4SAndroid Build Coastguard Worker logging.info("SetMuteFlag() Track:%d Mute:%d Sync:%d" % (trackNum, mute, sync)) 204*f81fb7c4SAndroid Build Coastguard Worker return True 205*f81fb7c4SAndroid Build Coastguard Worker except: 206*f81fb7c4SAndroid Build Coastguard Worker return False 207*f81fb7c4SAndroid Build Coastguard Worker 208*f81fb7c4SAndroid Build Coastguard Worker def LoadSegList(self): 209*f81fb7c4SAndroid Build Coastguard Worker """ Loads the list of segments """ 210*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 211*f81fb7c4SAndroid Build Coastguard Worker self.segList.DeleteAllItems() 212*f81fb7c4SAndroid Build Coastguard Worker for segment in self.jet_file.GetSegments(): 213*f81fb7c4SAndroid Build Coastguard Worker info = MidiSegInfo(segment) 214*f81fb7c4SAndroid Build Coastguard Worker index = self.segList.InsertStringItem(sys.maxint, StrNoneChk(segment.segname)) 215*f81fb7c4SAndroid Build Coastguard Worker self.segList.SetStringItem(index, 1, TimeStr(info.iLengthInMs)) 216*f81fb7c4SAndroid Build Coastguard Worker 217*f81fb7c4SAndroid Build Coastguard Worker def GraphTriggerClip(self, sClipName, iEventId): 218*f81fb7c4SAndroid Build Coastguard Worker """ Triggers a clip """ 219*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 220*f81fb7c4SAndroid Build Coastguard Worker try: 221*f81fb7c4SAndroid Build Coastguard Worker self.jet.TriggerClip(iEventId) 222*f81fb7c4SAndroid Build Coastguard Worker self.log.SetValue(JetDefs.PLAY_TRIGGERCLIP_MSG % (iEventId, sClipName)) 223*f81fb7c4SAndroid Build Coastguard Worker return True 224*f81fb7c4SAndroid Build Coastguard Worker except: 225*f81fb7c4SAndroid Build Coastguard Worker return False 226*f81fb7c4SAndroid Build Coastguard Worker 227*f81fb7c4SAndroid Build Coastguard Worker def OnSegListClick(self, event): 228*f81fb7c4SAndroid Build Coastguard Worker """ Sets current segment name based on what's clicked """ 229*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 230*f81fb7c4SAndroid Build Coastguard Worker self.currentSegmentIndex = event.m_itemIndex 231*f81fb7c4SAndroid Build Coastguard Worker self.currentSegmentName = getColumnText(self.segList, event.m_itemIndex, 0) 232*f81fb7c4SAndroid Build Coastguard Worker 233*f81fb7c4SAndroid Build Coastguard Worker def OnCancelNQueue(self, event): 234*f81fb7c4SAndroid Build Coastguard Worker """ Sets command to cancel the currently playing segment and queues another """ 235*f81fb7c4SAndroid Build Coastguard Worker if self.currentSegmentIndex == None: 236*f81fb7c4SAndroid Build Coastguard Worker return 237*f81fb7c4SAndroid Build Coastguard Worker self.SetPlayCommand(CMD_QUEUE_AND_CANCEL) 238*f81fb7c4SAndroid Build Coastguard Worker 239*f81fb7c4SAndroid Build Coastguard Worker def OnPause(self, event): 240*f81fb7c4SAndroid Build Coastguard Worker """ Sets a command to pause playback """ 241*f81fb7c4SAndroid Build Coastguard Worker if self.currentSegmentIndex == None: 242*f81fb7c4SAndroid Build Coastguard Worker return 243*f81fb7c4SAndroid Build Coastguard Worker self.SetPlayCommand(CMD_PAUSE) 244*f81fb7c4SAndroid Build Coastguard Worker 245*f81fb7c4SAndroid Build Coastguard Worker def OnStop(self, event): 246*f81fb7c4SAndroid Build Coastguard Worker """ Sets a command to stop playback """ 247*f81fb7c4SAndroid Build Coastguard Worker if self.currentSegmentIndex == None: 248*f81fb7c4SAndroid Build Coastguard Worker return 249*f81fb7c4SAndroid Build Coastguard Worker self.SetPlayCommand(CMD_STOP) 250*f81fb7c4SAndroid Build Coastguard Worker 251*f81fb7c4SAndroid Build Coastguard Worker def OnQueueCancelCurrent(self, event): 252*f81fb7c4SAndroid Build Coastguard Worker """ Sets a command to cancel the currently playing segment """ 253*f81fb7c4SAndroid Build Coastguard Worker if self.currentSegmentIndex == None: 254*f81fb7c4SAndroid Build Coastguard Worker return 255*f81fb7c4SAndroid Build Coastguard Worker self.SetPlayCommand(CMD_QUEUE_AND_CANCEL_CURRENT) 256*f81fb7c4SAndroid Build Coastguard Worker 257*f81fb7c4SAndroid Build Coastguard Worker def OnQueueSegmentViaBut(self, event): 258*f81fb7c4SAndroid Build Coastguard Worker """ Queues a segment via the button """ 259*f81fb7c4SAndroid Build Coastguard Worker if self.currentSegmentIndex == None: 260*f81fb7c4SAndroid Build Coastguard Worker return 261*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 262*f81fb7c4SAndroid Build Coastguard Worker segNum = self.currentSegmentIndex 263*f81fb7c4SAndroid Build Coastguard Worker segment = self.jet_file.GetSegment(self.currentSegmentName) 264*f81fb7c4SAndroid Build Coastguard Worker self.QueueOneSegment(segment, segNum) 265*f81fb7c4SAndroid Build Coastguard Worker 266*f81fb7c4SAndroid Build Coastguard Worker def OnQueueSegment(self, event): 267*f81fb7c4SAndroid Build Coastguard Worker """ Queues a segment """ 268*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 269*f81fb7c4SAndroid Build Coastguard Worker segNum = event.m_itemIndex 270*f81fb7c4SAndroid Build Coastguard Worker segment = self.jet_file.GetSegment(getColumnText(self.segList, segNum, 0)) 271*f81fb7c4SAndroid Build Coastguard Worker self.QueueOneSegment(segment, segNum) 272*f81fb7c4SAndroid Build Coastguard Worker 273*f81fb7c4SAndroid Build Coastguard Worker def QueueOneSegment(self, segment, segNum): 274*f81fb7c4SAndroid Build Coastguard Worker """ Queues one segment """ 275*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 276*f81fb7c4SAndroid Build Coastguard Worker userID = len(self.queueSegs) 277*f81fb7c4SAndroid Build Coastguard Worker if FileExists(segment.dlsfile): 278*f81fb7c4SAndroid Build Coastguard Worker dls_num = FindDlsNum(self.jet_file.libraries, segment.dlsfile) 279*f81fb7c4SAndroid Build Coastguard Worker else: 280*f81fb7c4SAndroid Build Coastguard Worker dls_num = -1 281*f81fb7c4SAndroid Build Coastguard Worker self.queueSegs.append(QueueSeg(segment.segname, userID, segNum, dls_num, segment.repeat, segment.transpose, segment.mute_flags, STATUS_PENDING)) 282*f81fb7c4SAndroid Build Coastguard Worker self.LoadQueueDisplay() 283*f81fb7c4SAndroid Build Coastguard Worker 284*f81fb7c4SAndroid Build Coastguard Worker def SetKeepPlayingFlag(self, val): 285*f81fb7c4SAndroid Build Coastguard Worker """ Sets a flag to continue play loop or shut down """ 286*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 287*f81fb7c4SAndroid Build Coastguard Worker self.keepPlaying = val 288*f81fb7c4SAndroid Build Coastguard Worker 289*f81fb7c4SAndroid Build Coastguard Worker def GetKeepPlayingFlag(self): 290*f81fb7c4SAndroid Build Coastguard Worker """ Gets the play flag """ 291*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 292*f81fb7c4SAndroid Build Coastguard Worker return self.keepPlaying 293*f81fb7c4SAndroid Build Coastguard Worker 294*f81fb7c4SAndroid Build Coastguard Worker def SetThreadShutdownFlag(self, val): 295*f81fb7c4SAndroid Build Coastguard Worker """ Set a flag to shutdown thread """ 296*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 297*f81fb7c4SAndroid Build Coastguard Worker self.threadShutdown = val 298*f81fb7c4SAndroid Build Coastguard Worker 299*f81fb7c4SAndroid Build Coastguard Worker def GetThreadShutdownFlag(self): 300*f81fb7c4SAndroid Build Coastguard Worker """ Gets the thread shutdown flag """ 301*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 302*f81fb7c4SAndroid Build Coastguard Worker return self.threadShutdown 303*f81fb7c4SAndroid Build Coastguard Worker 304*f81fb7c4SAndroid Build Coastguard Worker def SetPlayCommand(self, cmd): 305*f81fb7c4SAndroid Build Coastguard Worker """ Sets a play command """ 306*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 307*f81fb7c4SAndroid Build Coastguard Worker self.playCommand = cmd 308*f81fb7c4SAndroid Build Coastguard Worker 309*f81fb7c4SAndroid Build Coastguard Worker def GetPlayCommand(self): 310*f81fb7c4SAndroid Build Coastguard Worker """ Gets a play command """ 311*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 312*f81fb7c4SAndroid Build Coastguard Worker return self.playCommand 313*f81fb7c4SAndroid Build Coastguard Worker 314*f81fb7c4SAndroid Build Coastguard Worker def SetStatus(self, index, status): 315*f81fb7c4SAndroid Build Coastguard Worker """ Sets the status of a segment """ 316*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 317*f81fb7c4SAndroid Build Coastguard Worker self.queueSegs[index].status = status 318*f81fb7c4SAndroid Build Coastguard Worker 319*f81fb7c4SAndroid Build Coastguard Worker def GetStatus(self, index): 320*f81fb7c4SAndroid Build Coastguard Worker """ Gets the status of a segment """ 321*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 322*f81fb7c4SAndroid Build Coastguard Worker return self.queueSegs[index].status 323*f81fb7c4SAndroid Build Coastguard Worker 324*f81fb7c4SAndroid Build Coastguard Worker def LoadQueueDisplay(self): 325*f81fb7c4SAndroid Build Coastguard Worker """ Loads up the displayed queue list """ 326*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 327*f81fb7c4SAndroid Build Coastguard Worker self.queueList.DeleteAllItems() 328*f81fb7c4SAndroid Build Coastguard Worker for item in self.queueSegs: 329*f81fb7c4SAndroid Build Coastguard Worker index = self.queueList.InsertStringItem(sys.maxint, item.name) 330*f81fb7c4SAndroid Build Coastguard Worker self.queueList.SetStringItem(index, 1, item.status) 331*f81fb7c4SAndroid Build Coastguard Worker 332*f81fb7c4SAndroid Build Coastguard Worker def NextSegment(self): 333*f81fb7c4SAndroid Build Coastguard Worker """ Gets the next segment in the queueu """ 334*f81fb7c4SAndroid Build Coastguard Worker with self.playerLock: 335*f81fb7c4SAndroid Build Coastguard Worker num = len(self.queueSegs) 336*f81fb7c4SAndroid Build Coastguard Worker for i in range(num): 337*f81fb7c4SAndroid Build Coastguard Worker if self.queueSegs[i].status == STATUS_PENDING: 338*f81fb7c4SAndroid Build Coastguard Worker return i 339*f81fb7c4SAndroid Build Coastguard Worker return -1 340*f81fb7c4SAndroid Build Coastguard Worker 341*f81fb7c4SAndroid Build Coastguard Worker def PlaySegs(self): 342*f81fb7c4SAndroid Build Coastguard Worker """ Sets up a loop looking for jet file actions based on UI commands """ 343*f81fb7c4SAndroid Build Coastguard Worker self.jet = JET() 344*f81fb7c4SAndroid Build Coastguard Worker self.jet.eas.StartWave() 345*f81fb7c4SAndroid Build Coastguard Worker self.jet.OpenFile(self.jet_file.config.filename) 346*f81fb7c4SAndroid Build Coastguard Worker 347*f81fb7c4SAndroid Build Coastguard Worker self.SetKeepPlayingFlag(True) 348*f81fb7c4SAndroid Build Coastguard Worker while self.GetKeepPlayingFlag(): 349*f81fb7c4SAndroid Build Coastguard Worker self.SetThreadShutdownFlag(False) 350*f81fb7c4SAndroid Build Coastguard Worker 351*f81fb7c4SAndroid Build Coastguard Worker time.sleep(.5) 352*f81fb7c4SAndroid Build Coastguard Worker index = self.NextSegment() 353*f81fb7c4SAndroid Build Coastguard Worker if index != -1: 354*f81fb7c4SAndroid Build Coastguard Worker lastID = -1 355*f81fb7c4SAndroid Build Coastguard Worker 356*f81fb7c4SAndroid Build Coastguard Worker Queue(self.jet, self.queueSegs[index]) 357*f81fb7c4SAndroid Build Coastguard Worker 358*f81fb7c4SAndroid Build Coastguard Worker self.SetStatus(index, STATUS_QUEUED) 359*f81fb7c4SAndroid Build Coastguard Worker 360*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None)) 361*f81fb7c4SAndroid Build Coastguard Worker 362*f81fb7c4SAndroid Build Coastguard Worker self.jet.Play() 363*f81fb7c4SAndroid Build Coastguard Worker self.paused = False 364*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(CMD_PLAY, None)) 365*f81fb7c4SAndroid Build Coastguard Worker 366*f81fb7c4SAndroid Build Coastguard Worker while self.GetKeepPlayingFlag(): 367*f81fb7c4SAndroid Build Coastguard Worker self.jet.Render() 368*f81fb7c4SAndroid Build Coastguard Worker status = self.jet.Status() 369*f81fb7c4SAndroid Build Coastguard Worker 370*f81fb7c4SAndroid Build Coastguard Worker if status.currentUserID <> lastID and status.currentUserID <> -1: 371*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(NEW_SEGMENT_DISPLAY, status.currentUserID)) 372*f81fb7c4SAndroid Build Coastguard Worker if lastID != -1: 373*f81fb7c4SAndroid Build Coastguard Worker self.SetStatus(lastID, STATUS_COMPLETE) 374*f81fb7c4SAndroid Build Coastguard Worker self.SetStatus(status.currentUserID, STATUS_PLAYING) 375*f81fb7c4SAndroid Build Coastguard Worker lastID = status.currentUserID 376*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None)) 377*f81fb7c4SAndroid Build Coastguard Worker 378*f81fb7c4SAndroid Build Coastguard Worker if status.numQueuedSegments == 0: 379*f81fb7c4SAndroid Build Coastguard Worker break 380*f81fb7c4SAndroid Build Coastguard Worker 381*f81fb7c4SAndroid Build Coastguard Worker self.jet.GetAppEvent() 382*f81fb7c4SAndroid Build Coastguard Worker 383*f81fb7c4SAndroid Build Coastguard Worker index = self.NextSegment() 384*f81fb7c4SAndroid Build Coastguard Worker if (index >= 0) and (status.numQueuedSegments < 2): 385*f81fb7c4SAndroid Build Coastguard Worker Queue(self.jet, self.queueSegs[index]) 386*f81fb7c4SAndroid Build Coastguard Worker self.SetStatus(index, STATUS_QUEUED) 387*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None)) 388*f81fb7c4SAndroid Build Coastguard Worker 389*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(GRAPH_POSITION_UPDATE, status.location)) 390*f81fb7c4SAndroid Build Coastguard Worker 391*f81fb7c4SAndroid Build Coastguard Worker playCmd = self.GetPlayCommand() 392*f81fb7c4SAndroid Build Coastguard Worker if playCmd == CMD_QUEUE_AND_CANCEL or playCmd == CMD_STOP or playCmd == CMD_QUEUE_AND_CANCEL_CURRENT: 393*f81fb7c4SAndroid Build Coastguard Worker if playCmd == CMD_QUEUE_AND_CANCEL or playCmd == CMD_STOP: 394*f81fb7c4SAndroid Build Coastguard Worker num = len(self.queueSegs) 395*f81fb7c4SAndroid Build Coastguard Worker for i in range(num): 396*f81fb7c4SAndroid Build Coastguard Worker curStatus = self.GetStatus(i) 397*f81fb7c4SAndroid Build Coastguard Worker if curStatus == STATUS_PENDING or curStatus == STATUS_PLAYING or curStatus == STATUS_QUEUED: 398*f81fb7c4SAndroid Build Coastguard Worker self.SetStatus(i, STATUS_CANCELED) 399*f81fb7c4SAndroid Build Coastguard Worker 400*f81fb7c4SAndroid Build Coastguard Worker if playCmd == CMD_QUEUE_AND_CANCEL_CURRENT: 401*f81fb7c4SAndroid Build Coastguard Worker self.SetStatus(status.currentUserID, STATUS_CANCELED) 402*f81fb7c4SAndroid Build Coastguard Worker num = len(self.queueSegs) 403*f81fb7c4SAndroid Build Coastguard Worker for i in range(num): 404*f81fb7c4SAndroid Build Coastguard Worker curStatus = self.GetStatus(i) 405*f81fb7c4SAndroid Build Coastguard Worker if curStatus == STATUS_QUEUED: 406*f81fb7c4SAndroid Build Coastguard Worker self.SetStatus(i, STATUS_PENDING) 407*f81fb7c4SAndroid Build Coastguard Worker 408*f81fb7c4SAndroid Build Coastguard Worker if playCmd == CMD_QUEUE_AND_CANCEL: 409*f81fb7c4SAndroid Build Coastguard Worker segNum = self.currentSegmentIndex 410*f81fb7c4SAndroid Build Coastguard Worker segment = self.jet_file.GetSegment(self.currentSegmentName) 411*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(CMD_QUEUE_AND_CANCEL, (segment, segNum))) 412*f81fb7c4SAndroid Build Coastguard Worker 413*f81fb7c4SAndroid Build Coastguard Worker #MAC has a 'pop' when clearing the queue; not sure why so this avoids it 414*f81fb7c4SAndroid Build Coastguard Worker if OsWindows(): 415*f81fb7c4SAndroid Build Coastguard Worker self.jet.Clear_Queue() 416*f81fb7c4SAndroid Build Coastguard Worker else: 417*f81fb7c4SAndroid Build Coastguard Worker self.jet = self.SafeJetRestart(self.playerLock, self.jet, self.jet_file.config.filename) 418*f81fb7c4SAndroid Build Coastguard Worker 419*f81fb7c4SAndroid Build Coastguard Worker if playCmd == CMD_ORIGINALMUTES: 420*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(CMD_ORIGINALMUTES, segment.mute_flags)) 421*f81fb7c4SAndroid Build Coastguard Worker 422*f81fb7c4SAndroid Build Coastguard Worker if playCmd == CMD_UNMUTEALL: 423*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(CMD_UNMUTEALL, None)) 424*f81fb7c4SAndroid Build Coastguard Worker 425*f81fb7c4SAndroid Build Coastguard Worker if playCmd == CMD_PAUSE: 426*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(CMD_PAUSE, None)) 427*f81fb7c4SAndroid Build Coastguard Worker 428*f81fb7c4SAndroid Build Coastguard Worker if playCmd == CMD_MUTEALL: 429*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(CMD_MUTEALL, None)) 430*f81fb7c4SAndroid Build Coastguard Worker 431*f81fb7c4SAndroid Build Coastguard Worker self.SetPlayCommand('') 432*f81fb7c4SAndroid Build Coastguard Worker 433*f81fb7c4SAndroid Build Coastguard Worker if self.GetStatus(lastID) != STATUS_CANCELED: 434*f81fb7c4SAndroid Build Coastguard Worker self.SetStatus(lastID, STATUS_COMPLETE) 435*f81fb7c4SAndroid Build Coastguard Worker 436*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None)) 437*f81fb7c4SAndroid Build Coastguard Worker wx.PostEvent(self, JetStatusEvent(CLR_INFO, None)) 438*f81fb7c4SAndroid Build Coastguard Worker 439*f81fb7c4SAndroid Build Coastguard Worker SafeJetShutdown(self.playerLock, self.jet) 440*f81fb7c4SAndroid Build Coastguard Worker self.SetThreadShutdownFlag(True) 441*f81fb7c4SAndroid Build Coastguard Worker 442*f81fb7c4SAndroid Build Coastguard Worker def OnJetStatusUpdate(self, evt): 443*f81fb7c4SAndroid Build Coastguard Worker """ All UI needed from within thread called via postevent otherwise mac crashes """ 444*f81fb7c4SAndroid Build Coastguard Worker if evt.mode == LOAD_QUEUE_DISPLAY: 445*f81fb7c4SAndroid Build Coastguard Worker self.LoadQueueDisplay() 446*f81fb7c4SAndroid Build Coastguard Worker elif evt.mode == GRAPH_POSITION_UPDATE: 447*f81fb7c4SAndroid Build Coastguard Worker self.graph.UpdateLocation(evt.data) 448*f81fb7c4SAndroid Build Coastguard Worker elif evt.mode == NEW_SEGMENT_DISPLAY: 449*f81fb7c4SAndroid Build Coastguard Worker self.currentSegmentName = getColumnText(self.queueList, evt.data, 0) 450*f81fb7c4SAndroid Build Coastguard Worker segment = self.jet_file.GetSegment(self.currentSegmentName) 451*f81fb7c4SAndroid Build Coastguard Worker info = self.graph.LoadSegment(segment) 452*f81fb7c4SAndroid Build Coastguard Worker self.trackList.DeleteAllItems() 453*f81fb7c4SAndroid Build Coastguard Worker if info <> None: 454*f81fb7c4SAndroid Build Coastguard Worker for track in info.trackList: 455*f81fb7c4SAndroid Build Coastguard Worker self.trackList.AddTrackRow(track) 456*f81fb7c4SAndroid Build Coastguard Worker self.trackList.CheckTracks(segment.mute_flags) 457*f81fb7c4SAndroid Build Coastguard Worker self.log.SetValue(self.currentSegmentName) 458*f81fb7c4SAndroid Build Coastguard Worker elif evt.mode == CMD_QUEUE_AND_CANCEL: 459*f81fb7c4SAndroid Build Coastguard Worker self.QueueOneSegment(evt.data[0], evt.data[1]) 460*f81fb7c4SAndroid Build Coastguard Worker elif evt.mode == CMD_ORIGINALMUTES: 461*f81fb7c4SAndroid Build Coastguard Worker self.trackList.CheckTracks(evt.data) 462*f81fb7c4SAndroid Build Coastguard Worker elif evt.mode == CMD_UNMUTEALL: 463*f81fb7c4SAndroid Build Coastguard Worker num = self.trackList.GetItemCount() 464*f81fb7c4SAndroid Build Coastguard Worker for i in range(num): 465*f81fb7c4SAndroid Build Coastguard Worker self.trackList.CheckItem(i, False) 466*f81fb7c4SAndroid Build Coastguard Worker elif evt.mode == CMD_MUTEALL: 467*f81fb7c4SAndroid Build Coastguard Worker num = self.trackList.GetItemCount() 468*f81fb7c4SAndroid Build Coastguard Worker for i in range(num): 469*f81fb7c4SAndroid Build Coastguard Worker self.trackList.CheckItem(i) 470*f81fb7c4SAndroid Build Coastguard Worker elif evt.mode == CLR_INFO: 471*f81fb7c4SAndroid Build Coastguard Worker self.log.SetValue("") 472*f81fb7c4SAndroid Build Coastguard Worker self.graph.ClearGraph() 473*f81fb7c4SAndroid Build Coastguard Worker self.graph.UpdateLocation(0) 474*f81fb7c4SAndroid Build Coastguard Worker elif evt.mode == CMD_PLAY: 475*f81fb7c4SAndroid Build Coastguard Worker self.btnPause.SetLabel(JetDefs.BUT_PAUSE) 476*f81fb7c4SAndroid Build Coastguard Worker elif evt.mode == CMD_PAUSE or evt.mode == CMD_PLAY: 477*f81fb7c4SAndroid Build Coastguard Worker if not self.paused: 478*f81fb7c4SAndroid Build Coastguard Worker self.jet.Pause() 479*f81fb7c4SAndroid Build Coastguard Worker self.paused = True 480*f81fb7c4SAndroid Build Coastguard Worker self.btnPause.SetLabel(JetDefs.BUT_RESUME) 481*f81fb7c4SAndroid Build Coastguard Worker else: 482*f81fb7c4SAndroid Build Coastguard Worker self.jet.Play() 483*f81fb7c4SAndroid Build Coastguard Worker self.paused = False 484*f81fb7c4SAndroid Build Coastguard Worker self.btnPause.SetLabel(JetDefs.BUT_PAUSE) 485*f81fb7c4SAndroid Build Coastguard Worker 486*f81fb7c4SAndroid Build Coastguard Worker def SafeJetRestart(self, lock, jet, filename): 487*f81fb7c4SAndroid Build Coastguard Worker """ Shuts down the jet engine """ 488*f81fb7c4SAndroid Build Coastguard Worker SafeJetShutdown(lock, jet) 489*f81fb7c4SAndroid Build Coastguard Worker with lock: 490*f81fb7c4SAndroid Build Coastguard Worker jet = JET() 491*f81fb7c4SAndroid Build Coastguard Worker jet.eas.StartWave() 492*f81fb7c4SAndroid Build Coastguard Worker jet.OpenFile(filename) 493*f81fb7c4SAndroid Build Coastguard Worker return jet 494*f81fb7c4SAndroid Build Coastguard Worker 495*f81fb7c4SAndroid Build Coastguard Worker def OnClose(self, event): 496*f81fb7c4SAndroid Build Coastguard Worker """ When exiting the audition window, shut down jet play thread """ 497*f81fb7c4SAndroid Build Coastguard Worker i = 0 498*f81fb7c4SAndroid Build Coastguard Worker while(not self.GetThreadShutdownFlag() and i < 5): 499*f81fb7c4SAndroid Build Coastguard Worker #Make sure we shutdown the playing thread, but don't wait forever 500*f81fb7c4SAndroid Build Coastguard Worker self.SetKeepPlayingFlag(False) 501*f81fb7c4SAndroid Build Coastguard Worker logging.info("Waiting on shutdown %d" % (self.GetThreadShutdownFlag())) 502*f81fb7c4SAndroid Build Coastguard Worker time.sleep(.5) 503*f81fb7c4SAndroid Build Coastguard Worker i = i + 1 504*f81fb7c4SAndroid Build Coastguard Worker 505*f81fb7c4SAndroid Build Coastguard Worker #make certain we clean up 506*f81fb7c4SAndroid Build Coastguard Worker if self.jet is not None: 507*f81fb7c4SAndroid Build Coastguard Worker SafeJetShutdown(self.playerLock, self.jet) 508*f81fb7c4SAndroid Build Coastguard Worker self.Destroy() 509*f81fb7c4SAndroid Build Coastguard Worker 510