16b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi"""
26b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi File:
36b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi JetAudition.py
46b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
56b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Contents and purpose:
66b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Auditions a jet file to simulate interactive music functions
76b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
86b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Copyright (c) 2008 Android Open Source Project
96b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Licensed under the Apache License, Version 2.0 (the "License");
116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi you may not use this file except in compliance with the License.
126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi You may obtain a copy of the License at
136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi      http://www.apache.org/licenses/LICENSE-2.0
156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Unless required by applicable law or agreed to in writing, software
176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi distributed under the License is distributed on an "AS IS" BASIS,
186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi See the License for the specific language governing permissions and
206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi limitations under the License.
216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi"""
226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom __future__ import with_statement
246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport wx
266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport sys
276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport thread
286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport time
296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom JetUtils import *
316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom JetDefs import *
326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom JetCtrls import JetListCtrl, JetTrackCtrl
336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom JetSegGraph import SegmentGraph, Marker
346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom eas import *
356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom JetStatusEvent import *
366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviCMD_QUEUE_AND_CANCEL = 'QueueNCancel'
386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviCMD_QUEUE_AND_CANCEL_CURRENT = 'QueueCancelCurrent'
396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviCMD_MUTEALL = 'MuteAll'
406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviCMD_UNMUTEALL = 'UnMuteAll'
416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviCMD_ORIGINALMUTES = 'MuteOrg'
426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviCMD_STOP = 'Stop'
436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviCMD_PAUSE = 'Pause'
446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviCMD_PLAY = 'Play'
456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSTATUS_PENDING = 'Pending'
476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSTATUS_PLAYING = 'Playing'
486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSTATUS_COMPLETE = 'Complete'
496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSTATUS_CANCELED = 'Canceled'
506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSTATUS_QUEUED = 'Queued'
516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviLOAD_QUEUE_DISPLAY = 'LOAD_QUEUE'
536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviGRAPH_POSITION_UPDATE = 'GRAPH_POS'
546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviNEW_SEGMENT_DISPLAY = 'NEW SEG'
556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviCLR_INFO = 'CLR_INFO'
566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass Audition(wx.Dialog):
586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Initializes Audition window controls, then spawns off a thread to be ready for playback commands """
596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, jet_file, pSize):
606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        wx.Dialog.__init__(self, None, -1, title=JetDefs.DLG_AUDITION)
616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.jet = None
636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.playerLock = threading.RLock()
646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.jet_file = jet_file
656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.queueSegs = []
666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.keepPlaying = True
676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.nextSegNum = 0
686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.currentSegmentIndex = None
696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.currentSegmentName = ""
706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.playCommand = ""
716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.threadShutdown = True
726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        panel = wx.Panel(self, -1)
746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.segList = JetListCtrl(panel)
766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.segList.AddCol(JetDefs.GRD_SEGMENTS, 180)
776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.segList.AddCol(JetDefs.GRD_LENGTH, 20)
786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.segList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnQueueSegment)
806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.segList.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnSegListClick)
816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.queueList = JetListCtrl(panel)
836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.queueList.AddCol(JetDefs.GRD_QUEUE, 180)
846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.queueList.AddCol(JetDefs.GRD_STATUS, 20)
856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.trackList = JetTrackCtrl(panel)
876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.trackList.AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK)
886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.trackList.AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL)
896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.trackList.AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME)
906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.trackList.BindCheckBox(self.OnTrackChecked)
916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btnMuteAll = wx.Button(panel, -1, JetDefs.BUT_MUTEALL)
936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btnUnMuteAll = wx.Button(panel, -1, JetDefs.BUT_MUTENONE)
946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btnMuteOrg = wx.Button(panel, -1, JetDefs.BUT_ORGMUTES)
956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hMuteButs = wx.BoxSizer(wx.HORIZONTAL)
966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hMuteButs.Add(self.btnMuteAll, 1, wx.EXPAND)
976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hMuteButs.Add(self.btnUnMuteAll, 1, wx.EXPAND)
986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hMuteButs.Add(self.btnMuteOrg, 1, wx.EXPAND)
996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vMuteButs = wx.BoxSizer(wx.VERTICAL)
1006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vMuteButs.Add(self.trackList, 1, wx.EXPAND)
1016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vMuteButs.Add((-1, 5))
1026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vMuteButs.Add(hMuteButs, 0, wx.EXPAND)
1036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btnQueue = wx.Button(panel, -1, JetDefs.BUT_QUEUE)
1056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btnCancelNQueue = wx.Button(panel, -1, JetDefs.BUT_CANCELANDQUEUE)
1066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hSegButs = wx.BoxSizer(wx.HORIZONTAL)
1076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hSegButs.Add(self.btnQueue, 1, wx.EXPAND)
1086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hSegButs.Add(self.btnCancelNQueue, 1, wx.EXPAND)
1096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vSegButs = wx.BoxSizer(wx.VERTICAL)
1106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vSegButs.Add(self.segList, 1, wx.EXPAND)
1116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vSegButs.Add((-1, 5))
1126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vSegButs.Add(hSegButs, 0, wx.EXPAND)
1136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btnQueueCancelCurrent = wx.Button(panel, -1, JetDefs.BUT_CANCELCURRENT)
1156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btnPause = wx.Button(panel, -1, JetDefs.BUT_PAUSE)
1166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btnStop = wx.Button(panel, -1, JetDefs.BUT_STOP)
1176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hQueueButs = wx.BoxSizer(wx.HORIZONTAL)
1186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hQueueButs.Add(self.btnQueueCancelCurrent, 1, wx.EXPAND)
1196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hQueueButs.Add(self.btnPause, 1, wx.EXPAND)
1206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hQueueButs.Add(self.btnStop, 1, wx.EXPAND)
1216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vQueueButs = wx.BoxSizer(wx.VERTICAL)
1226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vQueueButs.Add(self.queueList, 1, wx.EXPAND)
1236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vQueueButs.Add((-1, 5))
1246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vQueueButs.Add(hQueueButs, 0, wx.EXPAND)
1256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.Bind(wx.EVT_BUTTON, self.OnQueueSegmentViaBut, id=self.btnQueue.GetId())
1276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.Bind(wx.EVT_BUTTON, self.OnCancelNQueue, id=self.btnCancelNQueue.GetId())
1286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.Bind(wx.EVT_BUTTON, self.OnStop, id=self.btnStop.GetId())
1296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.Bind(wx.EVT_BUTTON, self.OnQueueCancelCurrent, id=self.btnQueueCancelCurrent.GetId())
1306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.Bind(wx.EVT_BUTTON, self.OnPause, id=self.btnPause.GetId())
1316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.Bind(wx.EVT_BUTTON, self.OnMuteAll, id=self.btnMuteAll.GetId())
1326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.Bind(wx.EVT_BUTTON, self.OnUnMuteAll, id=self.btnUnMuteAll.GetId())
1336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.Bind(wx.EVT_BUTTON, self.OnMuteOrg, id=self.btnMuteOrg.GetId())
1346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        EVT_JET_STATUS(self, self.OnJetStatusUpdate)
1366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        BORDER = 10
1386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hboxTop = wx.BoxSizer(wx.HORIZONTAL)
1396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hboxTop.Add(vSegButs, 1, wx.EXPAND)
1406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hboxTop.Add((5, -1))
1416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hboxTop.Add(vQueueButs, 1, wx.EXPAND)
1426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hboxTop.Add((5, -1))
1436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hboxTop.Add(vMuteButs, 1, wx.EXPAND)
1446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.log = wx.TextCtrl(panel, -1)
1466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.graph = SegmentGraph(panel, size=(-1, 50))
1476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.graph.ClickCallbackFct = self.GraphTriggerClip
1486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vboxBot = wx.BoxSizer(wx.VERTICAL)
1506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vboxBot.Add(self.log, 0, wx.EXPAND)
1516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vboxBot.Add((-1, 5))
1526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        vboxBot.Add(self.graph, 1, wx.EXPAND)
1536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hboxMain = wx.BoxSizer(wx.VERTICAL)
1556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hboxMain.Add(hboxTop, 2, wx.EXPAND | wx.ALL, BORDER)
1566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        hboxMain.Add(vboxBot, 1, wx.EXPAND | wx.ALL, BORDER)
1576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        panel.SetSizer(hboxMain)
1596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.LoadSegList()
1616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.initHelp()
1626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetSize(pSize)
1646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.CenterOnParent()
1656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        wx.EVT_CLOSE(self, self.OnClose)
1676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        thread.start_new_thread(self.PlaySegs, ())
1696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def initHelp(self):
1716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Initializes context sensitive help text """
1726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP )
1736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, ''))
1746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.segList.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_SEGLIST))
1756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.queueList.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_QUEUELIST))
1766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.trackList.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_TRACKLIST))
1776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.graph.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_GRAPH))
1786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnMuteAll(self, event):
1806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets command to mute all tracks """
1816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetPlayCommand(CMD_MUTEALL)
1826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnUnMuteAll(self, event):
1846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets command to un-mute all tracks """
1856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetPlayCommand(CMD_UNMUTEALL)
1866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnMuteOrg(self, event):
1886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets command to set mute flags to their original values """
1896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetPlayCommand(CMD_ORIGINALMUTES)
1906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnTrackChecked(self, index, checked):
1926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Mutes or un-mutes a track interactively """
1936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
1946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            trackNum = self.trackList.GetTrackNumber(index)
1956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.SetMuteFlag(trackNum, checked)
1966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetMuteFlag(self, trackNum, mute):
1986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Mutes or un-mutes a track """
1996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
2006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            try:
2016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                sync = JetDefs.DEFAULT_MUTE_SYNC
2026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.jet.SetMuteFlag(trackNum, mute, sync)
2036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                logging.info("SetMuteFlag() Track:%d Mute:%d Sync:%d" % (trackNum, mute, sync))
2046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                return True
2056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            except:
2066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                return False
2076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def LoadSegList(self):
2096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Loads the list of segments """
2106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
2116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.segList.DeleteAllItems()
2126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for segment in self.jet_file.GetSegments():
2136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                info = MidiSegInfo(segment)
2146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                index = self.segList.InsertStringItem(sys.maxint, StrNoneChk(segment.segname))
2156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.segList.SetStringItem(index, 1,  TimeStr(info.iLengthInMs))
2166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GraphTriggerClip(self, sClipName, iEventId):
2186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Triggers a clip """
2196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
2206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            try:
2216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.jet.TriggerClip(iEventId)
2226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.log.SetValue(JetDefs.PLAY_TRIGGERCLIP_MSG % (iEventId, sClipName))
2236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                return True
2246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            except:
2256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                return False
2266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnSegListClick(self, event):
2286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets current segment name based on what's clicked """
2296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
2306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.currentSegmentIndex = event.m_itemIndex
2316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.currentSegmentName = getColumnText(self.segList, event.m_itemIndex, 0)
2326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnCancelNQueue(self, event):
2346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets command to cancel the currently playing segment and queues another """
2356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.currentSegmentIndex == None:
2366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return
2376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetPlayCommand(CMD_QUEUE_AND_CANCEL)
2386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnPause(self, event):
2406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets a command to pause playback """
2416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.currentSegmentIndex == None:
2426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return
2436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetPlayCommand(CMD_PAUSE)
2446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnStop(self, event):
2466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets a command to stop playback """
2476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.currentSegmentIndex == None:
2486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return
2496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetPlayCommand(CMD_STOP)
2506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnQueueCancelCurrent(self, event):
2526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets a command to cancel the currently playing segment """
2536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.currentSegmentIndex == None:
2546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return
2556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetPlayCommand(CMD_QUEUE_AND_CANCEL_CURRENT)
2566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnQueueSegmentViaBut(self, event):
2586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Queues a segment via the button """
2596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.currentSegmentIndex == None:
2606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return
2616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
2626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            segNum = self.currentSegmentIndex
2636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            segment = self.jet_file.GetSegment(self.currentSegmentName)
2646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.QueueOneSegment(segment, segNum)
2656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnQueueSegment(self, event):
2676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Queues a segment """
2686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
2696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            segNum = event.m_itemIndex
2706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            segment = self.jet_file.GetSegment(getColumnText(self.segList, segNum, 0))
2716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.QueueOneSegment(segment, segNum)
2726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def QueueOneSegment(self, segment, segNum):
2746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Queues one segment """
2756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
2766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            userID = len(self.queueSegs)
2776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if FileExists(segment.dlsfile):
2786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                dls_num = FindDlsNum(self.jet_file.libraries, segment.dlsfile)
2796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            else:
2806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                dls_num = -1
2816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.queueSegs.append(QueueSeg(segment.segname, userID, segNum, dls_num, segment.repeat, segment.transpose, segment.mute_flags, STATUS_PENDING))
2826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.LoadQueueDisplay()
2836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetKeepPlayingFlag(self, val):
2856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets a flag to continue play loop or shut down """
2866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
2876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.keepPlaying = val
2886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetKeepPlayingFlag(self):
2906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Gets the play flag """
2916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
2926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return self.keepPlaying
2936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetThreadShutdownFlag(self, val):
2956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Set a flag to shutdown thread """
2966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
2976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.threadShutdown = val
2986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetThreadShutdownFlag(self):
3006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Gets the thread shutdown flag """
3016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
3026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return self.threadShutdown
3036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetPlayCommand(self, cmd):
3056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets a play command """
3066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
3076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.playCommand = cmd
3086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetPlayCommand(self):
3106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Gets a play command """
3116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
3126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return self.playCommand
3136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetStatus(self, index, status):
3156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets the status of a segment """
3166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
3176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.queueSegs[index].status = status
3186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetStatus(self, index):
3206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Gets the status of a segment """
3216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
3226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return self.queueSegs[index].status
3236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def LoadQueueDisplay(self):
3256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Loads up the displayed queue list """
3266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
3276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.queueList.DeleteAllItems()
3286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for item in self.queueSegs:
3296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                index = self.queueList.InsertStringItem(sys.maxint, item.name)
3306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.queueList.SetStringItem(index, 1,  item.status)
3316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def NextSegment(self):
3336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Gets the next segment in the queueu """
3346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with self.playerLock:
3356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            num = len(self.queueSegs)
3366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for i in range(num):
3376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if self.queueSegs[i].status == STATUS_PENDING:
3386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    return i
3396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return -1
3406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def PlaySegs(self):
3426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Sets up a loop looking for jet file actions based on UI commands """
3436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.jet = JET()
3446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.jet.eas.StartWave()
3456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.jet.OpenFile(self.jet_file.config.filename)
3466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetKeepPlayingFlag(True)
3486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        while self.GetKeepPlayingFlag():
3496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.SetThreadShutdownFlag(False)
3506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            time.sleep(.5)
3526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            index = self.NextSegment()
3536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if index != -1:
3546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                lastID = -1
3556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                Queue(self.jet, self.queueSegs[index])
3576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.SetStatus(index, STATUS_QUEUED)
3596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None))
3616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.jet.Play()
3636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.paused = False
3646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.PostEvent(self, JetStatusEvent(CMD_PLAY, None))
3656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                while self.GetKeepPlayingFlag():
3676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.jet.Render()
3686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    status = self.jet.Status()
3696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if status.currentUserID <> lastID and status.currentUserID <> -1:
3716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        wx.PostEvent(self, JetStatusEvent(NEW_SEGMENT_DISPLAY, status.currentUserID))
3726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        if lastID != -1:
3736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            self.SetStatus(lastID, STATUS_COMPLETE)
3746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        self.SetStatus(status.currentUserID, STATUS_PLAYING)
3756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        lastID = status.currentUserID
3766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None))
3776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if status.numQueuedSegments == 0:
3796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        break
3806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.jet.GetAppEvent()
3826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    index = self.NextSegment()
3846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if (index >= 0) and (status.numQueuedSegments < 2):
3856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        Queue(self.jet, self.queueSegs[index])
3866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        self.SetStatus(index, STATUS_QUEUED)
3876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None))
3886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    wx.PostEvent(self, JetStatusEvent(GRAPH_POSITION_UPDATE, status.location))
3906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    playCmd = self.GetPlayCommand()
3926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if playCmd == CMD_QUEUE_AND_CANCEL or playCmd == CMD_STOP or playCmd == CMD_QUEUE_AND_CANCEL_CURRENT:
3936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        if playCmd == CMD_QUEUE_AND_CANCEL or playCmd == CMD_STOP:
3946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            num = len(self.queueSegs)
3956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            for i in range(num):
3966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                                curStatus = self.GetStatus(i)
3976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                                if curStatus == STATUS_PENDING or curStatus == STATUS_PLAYING or curStatus == STATUS_QUEUED:
3986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                                    self.SetStatus(i, STATUS_CANCELED)
3996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        if playCmd == CMD_QUEUE_AND_CANCEL_CURRENT:
4016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            self.SetStatus(status.currentUserID, STATUS_CANCELED)
4026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            num = len(self.queueSegs)
4036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            for i in range(num):
4046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                                curStatus = self.GetStatus(i)
4056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                                if curStatus == STATUS_QUEUED:
4066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                                    self.SetStatus(i, STATUS_PENDING)
4076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        if playCmd == CMD_QUEUE_AND_CANCEL:
4096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            segNum = self.currentSegmentIndex
4106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            segment = self.jet_file.GetSegment(self.currentSegmentName)
4116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            wx.PostEvent(self, JetStatusEvent(CMD_QUEUE_AND_CANCEL, (segment, segNum)))
4126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        #MAC has a 'pop' when clearing the queue; not sure why so this avoids it
4146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        if OsWindows():
4156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            self.jet.Clear_Queue()
4166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        else:
4176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            self.jet = self.SafeJetRestart(self.playerLock, self.jet, self.jet_file.config.filename)
4186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if playCmd == CMD_ORIGINALMUTES:
4206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        wx.PostEvent(self, JetStatusEvent(CMD_ORIGINALMUTES, segment.mute_flags))
4216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if playCmd == CMD_UNMUTEALL:
4236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        wx.PostEvent(self, JetStatusEvent(CMD_UNMUTEALL, None))
4246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if playCmd == CMD_PAUSE:
4266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        wx.PostEvent(self, JetStatusEvent(CMD_PAUSE, None))
4276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if playCmd == CMD_MUTEALL:
4296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        wx.PostEvent(self, JetStatusEvent(CMD_MUTEALL, None))
4306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.SetPlayCommand('')
4326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if self.GetStatus(lastID) != STATUS_CANCELED:
4346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.SetStatus(lastID, STATUS_COMPLETE)
4356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None))
4376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.PostEvent(self, JetStatusEvent(CLR_INFO, None))
4386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        SafeJetShutdown(self.playerLock, self.jet)
4406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetThreadShutdownFlag(True)
4416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnJetStatusUpdate(self, evt):
4436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ All UI needed from within thread called via postevent otherwise mac crashes """
4446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if evt.mode == LOAD_QUEUE_DISPLAY:
4456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.LoadQueueDisplay()
4466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        elif evt.mode == GRAPH_POSITION_UPDATE:
4476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.graph.UpdateLocation(evt.data)
4486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        elif evt.mode == NEW_SEGMENT_DISPLAY:
4496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.currentSegmentName = getColumnText(self.queueList, evt.data, 0)
4506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            segment = self.jet_file.GetSegment(self.currentSegmentName)
4516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            info = self.graph.LoadSegment(segment)
4526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.trackList.DeleteAllItems()
4536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if info <> None:
4546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                for track in info.trackList:
4556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.trackList.AddTrackRow(track)
4566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.trackList.CheckTracks(segment.mute_flags)
4576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.log.SetValue(self.currentSegmentName)
4586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        elif evt.mode == CMD_QUEUE_AND_CANCEL:
4596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.QueueOneSegment(evt.data[0], evt.data[1])
4606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        elif evt.mode == CMD_ORIGINALMUTES:
4616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.trackList.CheckTracks(evt.data)
4626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        elif evt.mode == CMD_UNMUTEALL:
4636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            num = self.trackList.GetItemCount()
4646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for i in range(num):
4656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.trackList.CheckItem(i, False)
4666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        elif evt.mode == CMD_MUTEALL:
4676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            num = self.trackList.GetItemCount()
4686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for i in range(num):
4696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.trackList.CheckItem(i)
4706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        elif evt.mode == CLR_INFO:
4716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.log.SetValue("")
4726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.graph.ClearGraph()
4736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.graph.UpdateLocation(0)
4746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        elif evt.mode == CMD_PLAY:
4756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.btnPause.SetLabel(JetDefs.BUT_PAUSE)
4766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        elif evt.mode == CMD_PAUSE or evt.mode == CMD_PLAY:
4776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if not self.paused:
4786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.jet.Pause()
4796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.paused = True
4806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.btnPause.SetLabel(JetDefs.BUT_RESUME)
4816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            else:
4826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.jet.Play()
4836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.paused = False
4846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.btnPause.SetLabel(JetDefs.BUT_PAUSE)
4856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SafeJetRestart(self, lock, jet, filename):
4876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Shuts down the jet engine """
4886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        SafeJetShutdown(lock, jet)
4896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        with lock:
4906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jet = JET()
4916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jet.eas.StartWave()
4926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jet.OpenFile(filename)
4936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return jet
4946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnClose(self, event):
4966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ When exiting the audition window, shut down jet play thread """
4976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        i = 0
4986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        while(not self.GetThreadShutdownFlag() and i < 5):
4996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            #Make sure we shutdown the playing thread, but don't wait forever
5006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.SetKeepPlayingFlag(False)
5016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            logging.info("Waiting on shutdown %d" % (self.GetThreadShutdownFlag()))
5026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            time.sleep(.5)
5036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            i = i + 1
5046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        #make certain we clean up
5066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.jet is not None:
5076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            SafeJetShutdown(self.playerLock, self.jet)
5086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.Destroy()
5096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
510