""" | |
File: | |
JetPreview.py | |
Contents and purpose: | |
Plays the preview of a segment or event via the dialog box | |
Copyright (c) 2008 Android Open Source Project | |
Licensed under the Apache License, Version 2.0 (the "License"); | |
you may not use this file except in compliance with the License. | |
You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software | |
distributed under the License is distributed on an "AS IS" BASIS, | |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
See the License for the specific language governing permissions and | |
limitations under the License. | |
""" | |
from __future__ import with_statement | |
import wx | |
import threading | |
from JetDefs import * | |
from JetCtrls import * | |
from JetFile import * | |
from JetUtils import * | |
from eas import * | |
from JetStatusEvent import * | |
class PreviewPlayer(wx.Frame): | |
""" Segment player """ | |
def __init__ (self, play_button, segment): | |
self.segment = segment | |
self.play_button = play_button | |
self.mute_button = None | |
self.trigger_button = None | |
self.playerLock = threading.RLock() | |
self.SetKeepPlayingFlag(False) | |
self.graph = None | |
def SetGraphCtrl(self, graph, parentWin): | |
""" Sets the graph control for the player """ | |
self.graph = graph | |
self.parentWin = parentWin | |
def SetGraphCallbackFct(self, ClickCallbackFct): | |
""" Sets the callback function for the graph control to update """ | |
self.ClickCallbackFct = ClickCallbackFct | |
def GraphTriggerClip(self, sClipName, iEventId): | |
""" Triggers a clip by clicking on it """ | |
with self.playerLock: | |
try: | |
self.jet.TriggerClip(iEventId) | |
return True | |
except: | |
return False | |
def SetMuteFlag(self, trackNum, mute): | |
""" Sets a mute flag """ | |
sync = JetDefs.DEFAULT_MUTE_SYNC | |
with self.playerLock: | |
try: | |
self.jet.SetMuteFlag(trackNum, mute, sync) | |
logging.info("SetMuteFlag() Track:%d Mute:%d Sync:%d" % (trackNum, mute, sync)) | |
return True | |
except: | |
return False | |
def TriggerClip(self, eventID): | |
""" Triggers a clip via function """ | |
with self.playerLock: | |
try: | |
self.jet.TriggerClip(eventID) | |
logging.info("TriggerClip() eventID: %d" % eventID) | |
return True | |
except: | |
return False | |
def MuteTrackViaButton(self, button, trackNum): | |
""" Mutes a track via a button """ | |
with self.playerLock: | |
self.mute_button = button | |
if button.GetLabel() == JetDefs.BUT_MUTE: | |
if self.SetMuteFlag(trackNum, True): | |
button.SetLabel(JetDefs.BUT_UNMUTE) | |
else: | |
if self.SetMuteFlag(trackNum, False): | |
button.SetLabel(JetDefs.BUT_MUTE) | |
def Start(self): | |
""" Starts the playback. Called as a thread from dialog boxes """ | |
self.paused = False | |
wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_PLAY, None)) | |
# create a temporary config file, and jet output file | |
FileKillClean(JetDefs.TEMP_JET_CONFIG_FILE) | |
self.jet_file = JetFile(JetDefs.TEMP_JET_CONFIG_FILE, "") | |
self.jet_file.AddSegment(self.segment.segname, | |
self.segment.filename, | |
self.segment.start, | |
self.segment.end, | |
self.segment.length, | |
SegmentOutputFile(self.segment.segname, JetDefs.TEMP_JET_CONFIG_FILE), | |
self.segment.quantize, | |
self.segment.jetevents, | |
self.segment.dlsfile, | |
None, | |
self.segment.transpose, | |
self.segment.repeat, | |
self.segment.mute_flags) | |
userID = 0 | |
dls_num = -1 | |
seg_num = 0 | |
if len(self.segment.dlsfile) > 0: | |
self.jet_file.libraries.append(self.segment.dlsfile) | |
dls_num = 0 | |
self.jet_file.SaveJetConfig(JetDefs.TEMP_JET_CONFIG_FILE) | |
self.jet_file.WriteJetFileFromConfig(JetDefs.TEMP_JET_CONFIG_FILE) | |
if not ValidateConfig(self.jet_file): | |
return | |
self.queueSegs = [] | |
self.queueSegs.append(QueueSeg(self.segment.segname, userID, seg_num, dls_num, self.segment.repeat, self.segment.transpose, self.segment.mute_flags)) | |
self.jet = JET() | |
self.jet.eas.StartWave() | |
self.jet.OpenFile(self.jet_file.config.filename) | |
# queue first segment and start playback | |
index = 0 | |
Queue(self.jet, self.queueSegs[index]) | |
index += 1 | |
self.jet.Play() | |
self.SetKeepPlayingFlag(True) | |
while self.GetKeepPlayingFlag(): | |
self.jet.Render() | |
status = self.jet.Status() | |
# if no more segments - we're done | |
if status.numQueuedSegments == 0: | |
break | |
self.jet.GetAppEvent() | |
# if less than 2 segs queued - queue another one | |
if (index < len(self.queueSegs)) and (status.numQueuedSegments < 2): | |
Queue(self.jet, self.queueSegs[index]) | |
index += 1 | |
wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_UPD_LOCATION, status.location)) | |
SafeJetShutdown(self.playerLock, self.jet) | |
FileKillClean(SegmentOutputFile(self.segment.segname, JetDefs.TEMP_JET_CONFIG_FILE)) | |
FileKillClean(JetDefs.TEMP_JET_CONFIG_FILE) | |
FileKillClean(self.jet_file.config.filename) | |
self.SetKeepPlayingFlag(False) | |
wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_DONE, None)) | |
wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_UPD_LOCATION, 0)) | |
def SetKeepPlayingFlag(self, val): | |
""" Sets the flag to tell us wheter to keep playing """ | |
with self.playerLock: | |
self.keepPlaying = val | |
def GetKeepPlayingFlag(self): | |
""" Gets the keep playing flag """ | |
with self.playerLock: | |
return self.keepPlaying | |
def Pause(self): | |
""" Pauses playback """ | |
if self.jet is None: | |
return | |
if not self.paused: | |
self.jet.Pause() | |
self.paused = True | |
wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_PAUSE, None)) | |
else: | |
self.jet.Play() | |
self.paused = False | |
wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_RESUME, None)) | |