You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
7.2 KiB
201 lines
7.2 KiB
"""
|
|
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))
|
|
|