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