xref: /aosp_15_r20/external/sonivox/jet_tools/JetCreator/JetAudition.py (revision f81fb7c475c4b71ff83bdcc517de2a8c174e4e5c)
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