Home | History | Annotate | Download | only in JetCreator
      1 """
      2  File:  
      3  JetPreview.py
      4  
      5  Contents and purpose:
      6  Plays the preview of a segment or event via the dialog box
      7  
      8  Copyright (c) 2008 Android Open Source Project
      9  
     10  Licensed under the Apache License, Version 2.0 (the "License");
     11  you may not use this file except in compliance with the License.
     12  You may obtain a copy of the License at
     13  
     14       http://www.apache.org/licenses/LICENSE-2.0
     15  
     16  Unless required by applicable law or agreed to in writing, software
     17  distributed under the License is distributed on an "AS IS" BASIS,
     18  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     19  See the License for the specific language governing permissions and
     20  limitations under the License.
     21 """
     22 
     23 from __future__ import with_statement
     24 
     25 import wx
     26 import threading
     27 
     28 from JetDefs import *
     29 from JetCtrls import *
     30 from JetFile import *
     31 from JetUtils import *
     32 from eas import *
     33 from JetStatusEvent import *
     34 
     35 class PreviewPlayer(wx.Frame):
     36     """ Segment player """
     37     def __init__ (self, play_button, segment):
     38         self.segment = segment
     39         self.play_button = play_button
     40         self.mute_button = None
     41         self.trigger_button = None
     42         self.playerLock = threading.RLock()
     43         self.SetKeepPlayingFlag(False)
     44         self.graph = None
     45        
     46     def SetGraphCtrl(self, graph, parentWin):
     47         """ Sets the graph control for the player """
     48         self.graph = graph
     49         self.parentWin = parentWin
     50         
     51     def SetGraphCallbackFct(self, ClickCallbackFct):
     52         """ Sets the callback function for the graph control to update """
     53         self.ClickCallbackFct = ClickCallbackFct
     54         
     55     def GraphTriggerClip(self, sClipName, iEventId):
     56         """ Triggers a clip by clicking on it """
     57         with self.playerLock:
     58             try:
     59                 self.jet.TriggerClip(iEventId)
     60                 return True
     61             except:
     62                 return False       
     63             
     64     def SetMuteFlag(self, trackNum, mute):
     65         """ Sets a mute flag """
     66         sync = JetDefs.DEFAULT_MUTE_SYNC
     67         with self.playerLock:
     68             try:
     69                 self.jet.SetMuteFlag(trackNum, mute, sync)
     70                 logging.info("SetMuteFlag() Track:%d Mute:%d Sync:%d" % (trackNum, mute, sync))
     71                 return True
     72             except:
     73                 return False
     74         
     75     def TriggerClip(self, eventID):
     76         """ Triggers a clip via function """
     77         with self.playerLock:
     78             try:
     79                 self.jet.TriggerClip(eventID)
     80                 logging.info("TriggerClip() eventID: %d" % eventID)
     81                 return True
     82             except:
     83                 return False       
     84         
     85     def MuteTrackViaButton(self, button, trackNum):
     86         """ Mutes a track via a button """
     87         with self.playerLock:
     88             self.mute_button = button
     89             if button.GetLabel() == JetDefs.BUT_MUTE:
     90                 if self.SetMuteFlag(trackNum, True):
     91                     button.SetLabel(JetDefs.BUT_UNMUTE)
     92             else:    
     93                 if self.SetMuteFlag(trackNum, False):
     94                     button.SetLabel(JetDefs.BUT_MUTE)
     95                    
     96     def Start(self):
     97         """ Starts the playback.  Called as a thread from dialog boxes """
     98         self.paused = False
     99               
    100         wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_PLAY, None))
    101 
    102         # create a temporary config file, and jet output file

    103         FileKillClean(JetDefs.TEMP_JET_CONFIG_FILE)
    104         
    105         self.jet_file = JetFile(JetDefs.TEMP_JET_CONFIG_FILE, "")
    106         
    107         self.jet_file.AddSegment(self.segment.segname, 
    108                                  self.segment.filename, 
    109                                  self.segment.start, 
    110                                  self.segment.end, 
    111                                  self.segment.length, 
    112                                  SegmentOutputFile(self.segment.segname, JetDefs.TEMP_JET_CONFIG_FILE), 
    113                                  self.segment.quantize,
    114                                  self.segment.jetevents,
    115                                  self.segment.dlsfile,
    116                                  None,
    117                                  self.segment.transpose,
    118                                  self.segment.repeat,
    119                                  self.segment.mute_flags)
    120         userID = 0
    121         dls_num = -1
    122         seg_num = 0
    123         
    124         if len(self.segment.dlsfile) > 0:
    125             self.jet_file.libraries.append(self.segment.dlsfile)
    126             dls_num = 0
    127                         
    128         self.jet_file.SaveJetConfig(JetDefs.TEMP_JET_CONFIG_FILE)
    129         self.jet_file.WriteJetFileFromConfig(JetDefs.TEMP_JET_CONFIG_FILE)
    130         
    131         if not ValidateConfig(self.jet_file):
    132             return
    133 
    134         self.queueSegs = []
    135         self.queueSegs.append(QueueSeg(self.segment.segname, userID, seg_num, dls_num, self.segment.repeat, self.segment.transpose, self.segment.mute_flags))
    136 
    137         self.jet = JET()
    138         self.jet.eas.StartWave()
    139         self.jet.OpenFile(self.jet_file.config.filename)
    140 
    141         # queue first segment and start playback

    142         index = 0
    143         Queue(self.jet, self.queueSegs[index])
    144         
    145         index += 1
    146         self.jet.Play()
    147     
    148         self.SetKeepPlayingFlag(True)
    149         while self.GetKeepPlayingFlag():
    150             self.jet.Render()
    151             status = self.jet.Status()
    152             
    153             # if no more segments - we're done

    154             if status.numQueuedSegments == 0:
    155                 break
    156     
    157             self.jet.GetAppEvent()
    158 
    159             # if less than 2 segs queued - queue another one            

    160             if (index < len(self.queueSegs)) and (status.numQueuedSegments < 2):
    161                 Queue(self.jet, self.queueSegs[index])
    162                 index += 1
    163 
    164             wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_UPD_LOCATION, status.location))
    165 
    166         SafeJetShutdown(self.playerLock, self.jet)   
    167         
    168         FileKillClean(SegmentOutputFile(self.segment.segname, JetDefs.TEMP_JET_CONFIG_FILE))
    169         FileKillClean(JetDefs.TEMP_JET_CONFIG_FILE)
    170         FileKillClean(self.jet_file.config.filename)
    171         
    172         self.SetKeepPlayingFlag(False)
    173         
    174         wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_DONE, None))
    175 
    176         wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_UPD_LOCATION, 0))
    177         
    178     def SetKeepPlayingFlag(self, val):
    179         """ Sets the flag to tell us wheter to keep playing """
    180         with self.playerLock:
    181             self.keepPlaying = val
    182             
    183     def GetKeepPlayingFlag(self): 
    184         """ Gets the keep playing flag """     
    185         with self.playerLock:
    186             return self.keepPlaying
    187 
    188     def Pause(self):
    189         """ Pauses playback """
    190         if self.jet is None:
    191             return
    192         if not self.paused:
    193             self.jet.Pause()
    194             self.paused = True
    195             wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_PAUSE, None))
    196         else:
    197             self.jet.Play()
    198             self.paused = False
    199             wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_RESUME, None))
    200 
    201