xref: /aosp_15_r20/external/sonivox/jet_tools/JetCreator/JetPreview.py (revision f81fb7c475c4b71ff83bdcc517de2a8c174e4e5c)
1*f81fb7c4SAndroid Build Coastguard Worker"""
2*f81fb7c4SAndroid Build Coastguard Worker File:
3*f81fb7c4SAndroid Build Coastguard Worker JetPreview.py
4*f81fb7c4SAndroid Build Coastguard Worker
5*f81fb7c4SAndroid Build Coastguard Worker Contents and purpose:
6*f81fb7c4SAndroid Build Coastguard Worker Plays the preview of a segment or event via the dialog box
7*f81fb7c4SAndroid Build Coastguard Worker
8*f81fb7c4SAndroid Build Coastguard Worker Copyright (c) 2008 Android Open Source Project
9*f81fb7c4SAndroid Build Coastguard Worker
10*f81fb7c4SAndroid Build Coastguard Worker Licensed under the Apache License, Version 2.0 (the "License");
11*f81fb7c4SAndroid Build Coastguard Worker you may not use this file except in compliance with the License.
12*f81fb7c4SAndroid Build Coastguard Worker You may obtain a copy of the License at
13*f81fb7c4SAndroid Build Coastguard Worker
14*f81fb7c4SAndroid Build Coastguard Worker      http://www.apache.org/licenses/LICENSE-2.0
15*f81fb7c4SAndroid Build Coastguard Worker
16*f81fb7c4SAndroid Build Coastguard Worker Unless required by applicable law or agreed to in writing, software
17*f81fb7c4SAndroid Build Coastguard Worker distributed under the License is distributed on an "AS IS" BASIS,
18*f81fb7c4SAndroid Build Coastguard Worker WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19*f81fb7c4SAndroid Build Coastguard Worker See the License for the specific language governing permissions and
20*f81fb7c4SAndroid Build Coastguard Worker limitations under the License.
21*f81fb7c4SAndroid Build Coastguard Worker"""
22*f81fb7c4SAndroid Build Coastguard Worker
23*f81fb7c4SAndroid Build Coastguard Workerfrom __future__ import with_statement
24*f81fb7c4SAndroid Build Coastguard Worker
25*f81fb7c4SAndroid Build Coastguard Workerimport wx
26*f81fb7c4SAndroid Build Coastguard Workerimport threading
27*f81fb7c4SAndroid Build Coastguard Worker
28*f81fb7c4SAndroid Build Coastguard Workerfrom JetDefs import *
29*f81fb7c4SAndroid Build Coastguard Workerfrom JetCtrls import *
30*f81fb7c4SAndroid Build Coastguard Workerfrom JetFile import *
31*f81fb7c4SAndroid Build Coastguard Workerfrom JetUtils import *
32*f81fb7c4SAndroid Build Coastguard Workerfrom eas import *
33*f81fb7c4SAndroid Build Coastguard Workerfrom JetStatusEvent import *
34*f81fb7c4SAndroid Build Coastguard Worker
35*f81fb7c4SAndroid Build Coastguard Workerclass PreviewPlayer(wx.Frame):
36*f81fb7c4SAndroid Build Coastguard Worker    """ Segment player """
37*f81fb7c4SAndroid Build Coastguard Worker    def __init__ (self, play_button, segment):
38*f81fb7c4SAndroid Build Coastguard Worker        self.segment = segment
39*f81fb7c4SAndroid Build Coastguard Worker        self.play_button = play_button
40*f81fb7c4SAndroid Build Coastguard Worker        self.mute_button = None
41*f81fb7c4SAndroid Build Coastguard Worker        self.trigger_button = None
42*f81fb7c4SAndroid Build Coastguard Worker        self.playerLock = threading.RLock()
43*f81fb7c4SAndroid Build Coastguard Worker        self.SetKeepPlayingFlag(False)
44*f81fb7c4SAndroid Build Coastguard Worker        self.graph = None
45*f81fb7c4SAndroid Build Coastguard Worker
46*f81fb7c4SAndroid Build Coastguard Worker    def SetGraphCtrl(self, graph, parentWin):
47*f81fb7c4SAndroid Build Coastguard Worker        """ Sets the graph control for the player """
48*f81fb7c4SAndroid Build Coastguard Worker        self.graph = graph
49*f81fb7c4SAndroid Build Coastguard Worker        self.parentWin = parentWin
50*f81fb7c4SAndroid Build Coastguard Worker
51*f81fb7c4SAndroid Build Coastguard Worker    def SetGraphCallbackFct(self, ClickCallbackFct):
52*f81fb7c4SAndroid Build Coastguard Worker        """ Sets the callback function for the graph control to update """
53*f81fb7c4SAndroid Build Coastguard Worker        self.ClickCallbackFct = ClickCallbackFct
54*f81fb7c4SAndroid Build Coastguard Worker
55*f81fb7c4SAndroid Build Coastguard Worker    def GraphTriggerClip(self, sClipName, iEventId):
56*f81fb7c4SAndroid Build Coastguard Worker        """ Triggers a clip by clicking on it """
57*f81fb7c4SAndroid Build Coastguard Worker        with self.playerLock:
58*f81fb7c4SAndroid Build Coastguard Worker            try:
59*f81fb7c4SAndroid Build Coastguard Worker                self.jet.TriggerClip(iEventId)
60*f81fb7c4SAndroid Build Coastguard Worker                return True
61*f81fb7c4SAndroid Build Coastguard Worker            except:
62*f81fb7c4SAndroid Build Coastguard Worker                return False
63*f81fb7c4SAndroid Build Coastguard Worker
64*f81fb7c4SAndroid Build Coastguard Worker    def SetMuteFlag(self, trackNum, mute):
65*f81fb7c4SAndroid Build Coastguard Worker        """ Sets a mute flag """
66*f81fb7c4SAndroid Build Coastguard Worker        sync = JetDefs.DEFAULT_MUTE_SYNC
67*f81fb7c4SAndroid Build Coastguard Worker        with self.playerLock:
68*f81fb7c4SAndroid Build Coastguard Worker            try:
69*f81fb7c4SAndroid Build Coastguard Worker                self.jet.SetMuteFlag(trackNum, mute, sync)
70*f81fb7c4SAndroid Build Coastguard Worker                logging.info("SetMuteFlag() Track:%d Mute:%d Sync:%d" % (trackNum, mute, sync))
71*f81fb7c4SAndroid Build Coastguard Worker                return True
72*f81fb7c4SAndroid Build Coastguard Worker            except:
73*f81fb7c4SAndroid Build Coastguard Worker                return False
74*f81fb7c4SAndroid Build Coastguard Worker
75*f81fb7c4SAndroid Build Coastguard Worker    def TriggerClip(self, eventID):
76*f81fb7c4SAndroid Build Coastguard Worker        """ Triggers a clip via function """
77*f81fb7c4SAndroid Build Coastguard Worker        with self.playerLock:
78*f81fb7c4SAndroid Build Coastguard Worker            try:
79*f81fb7c4SAndroid Build Coastguard Worker                self.jet.TriggerClip(eventID)
80*f81fb7c4SAndroid Build Coastguard Worker                logging.info("TriggerClip() eventID: %d" % eventID)
81*f81fb7c4SAndroid Build Coastguard Worker                return True
82*f81fb7c4SAndroid Build Coastguard Worker            except:
83*f81fb7c4SAndroid Build Coastguard Worker                return False
84*f81fb7c4SAndroid Build Coastguard Worker
85*f81fb7c4SAndroid Build Coastguard Worker    def MuteTrackViaButton(self, button, trackNum):
86*f81fb7c4SAndroid Build Coastguard Worker        """ Mutes a track via a button """
87*f81fb7c4SAndroid Build Coastguard Worker        with self.playerLock:
88*f81fb7c4SAndroid Build Coastguard Worker            self.mute_button = button
89*f81fb7c4SAndroid Build Coastguard Worker            if button.GetLabel() == JetDefs.BUT_MUTE:
90*f81fb7c4SAndroid Build Coastguard Worker                if self.SetMuteFlag(trackNum, True):
91*f81fb7c4SAndroid Build Coastguard Worker                    button.SetLabel(JetDefs.BUT_UNMUTE)
92*f81fb7c4SAndroid Build Coastguard Worker            else:
93*f81fb7c4SAndroid Build Coastguard Worker                if self.SetMuteFlag(trackNum, False):
94*f81fb7c4SAndroid Build Coastguard Worker                    button.SetLabel(JetDefs.BUT_MUTE)
95*f81fb7c4SAndroid Build Coastguard Worker
96*f81fb7c4SAndroid Build Coastguard Worker    def Start(self):
97*f81fb7c4SAndroid Build Coastguard Worker        """ Starts the playback.  Called as a thread from dialog boxes """
98*f81fb7c4SAndroid Build Coastguard Worker        self.paused = False
99*f81fb7c4SAndroid Build Coastguard Worker
100*f81fb7c4SAndroid Build Coastguard Worker        wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_PLAY, None))
101*f81fb7c4SAndroid Build Coastguard Worker
102*f81fb7c4SAndroid Build Coastguard Worker        # create a temporary config file, and jet output file
103*f81fb7c4SAndroid Build Coastguard Worker        FileKillClean(JetDefs.TEMP_JET_CONFIG_FILE)
104*f81fb7c4SAndroid Build Coastguard Worker
105*f81fb7c4SAndroid Build Coastguard Worker        self.jet_file = JetFile(JetDefs.TEMP_JET_CONFIG_FILE, "")
106*f81fb7c4SAndroid Build Coastguard Worker
107*f81fb7c4SAndroid Build Coastguard Worker        self.jet_file.AddSegment(self.segment.segname,
108*f81fb7c4SAndroid Build Coastguard Worker                                 self.segment.filename,
109*f81fb7c4SAndroid Build Coastguard Worker                                 self.segment.start,
110*f81fb7c4SAndroid Build Coastguard Worker                                 self.segment.end,
111*f81fb7c4SAndroid Build Coastguard Worker                                 self.segment.length,
112*f81fb7c4SAndroid Build Coastguard Worker                                 SegmentOutputFile(self.segment.segname, JetDefs.TEMP_JET_CONFIG_FILE),
113*f81fb7c4SAndroid Build Coastguard Worker                                 self.segment.quantize,
114*f81fb7c4SAndroid Build Coastguard Worker                                 self.segment.jetevents,
115*f81fb7c4SAndroid Build Coastguard Worker                                 self.segment.dlsfile,
116*f81fb7c4SAndroid Build Coastguard Worker                                 None,
117*f81fb7c4SAndroid Build Coastguard Worker                                 self.segment.transpose,
118*f81fb7c4SAndroid Build Coastguard Worker                                 self.segment.repeat,
119*f81fb7c4SAndroid Build Coastguard Worker                                 self.segment.mute_flags)
120*f81fb7c4SAndroid Build Coastguard Worker        userID = 0
121*f81fb7c4SAndroid Build Coastguard Worker        dls_num = -1
122*f81fb7c4SAndroid Build Coastguard Worker        seg_num = 0
123*f81fb7c4SAndroid Build Coastguard Worker
124*f81fb7c4SAndroid Build Coastguard Worker        if len(self.segment.dlsfile) > 0:
125*f81fb7c4SAndroid Build Coastguard Worker            self.jet_file.libraries.append(self.segment.dlsfile)
126*f81fb7c4SAndroid Build Coastguard Worker            dls_num = 0
127*f81fb7c4SAndroid Build Coastguard Worker
128*f81fb7c4SAndroid Build Coastguard Worker        self.jet_file.SaveJetConfig(JetDefs.TEMP_JET_CONFIG_FILE)
129*f81fb7c4SAndroid Build Coastguard Worker        self.jet_file.WriteJetFileFromConfig(JetDefs.TEMP_JET_CONFIG_FILE)
130*f81fb7c4SAndroid Build Coastguard Worker
131*f81fb7c4SAndroid Build Coastguard Worker        if not ValidateConfig(self.jet_file):
132*f81fb7c4SAndroid Build Coastguard Worker            return
133*f81fb7c4SAndroid Build Coastguard Worker
134*f81fb7c4SAndroid Build Coastguard Worker        self.queueSegs = []
135*f81fb7c4SAndroid Build Coastguard Worker        self.queueSegs.append(QueueSeg(self.segment.segname, userID, seg_num, dls_num, self.segment.repeat, self.segment.transpose, self.segment.mute_flags))
136*f81fb7c4SAndroid Build Coastguard Worker
137*f81fb7c4SAndroid Build Coastguard Worker        self.jet = JET()
138*f81fb7c4SAndroid Build Coastguard Worker        self.jet.eas.StartWave()
139*f81fb7c4SAndroid Build Coastguard Worker        self.jet.OpenFile(self.jet_file.config.filename)
140*f81fb7c4SAndroid Build Coastguard Worker
141*f81fb7c4SAndroid Build Coastguard Worker        # queue first segment and start playback
142*f81fb7c4SAndroid Build Coastguard Worker        index = 0
143*f81fb7c4SAndroid Build Coastguard Worker        Queue(self.jet, self.queueSegs[index])
144*f81fb7c4SAndroid Build Coastguard Worker
145*f81fb7c4SAndroid Build Coastguard Worker        index += 1
146*f81fb7c4SAndroid Build Coastguard Worker        self.jet.Play()
147*f81fb7c4SAndroid Build Coastguard Worker
148*f81fb7c4SAndroid Build Coastguard Worker        self.SetKeepPlayingFlag(True)
149*f81fb7c4SAndroid Build Coastguard Worker        while self.GetKeepPlayingFlag():
150*f81fb7c4SAndroid Build Coastguard Worker            self.jet.Render()
151*f81fb7c4SAndroid Build Coastguard Worker            status = self.jet.Status()
152*f81fb7c4SAndroid Build Coastguard Worker
153*f81fb7c4SAndroid Build Coastguard Worker            # if no more segments - we're done
154*f81fb7c4SAndroid Build Coastguard Worker            if status.numQueuedSegments == 0:
155*f81fb7c4SAndroid Build Coastguard Worker                break
156*f81fb7c4SAndroid Build Coastguard Worker
157*f81fb7c4SAndroid Build Coastguard Worker            self.jet.GetAppEvent()
158*f81fb7c4SAndroid Build Coastguard Worker
159*f81fb7c4SAndroid Build Coastguard Worker            # if less than 2 segs queued - queue another one
160*f81fb7c4SAndroid Build Coastguard Worker            if (index < len(self.queueSegs)) and (status.numQueuedSegments < 2):
161*f81fb7c4SAndroid Build Coastguard Worker                Queue(self.jet, self.queueSegs[index])
162*f81fb7c4SAndroid Build Coastguard Worker                index += 1
163*f81fb7c4SAndroid Build Coastguard Worker
164*f81fb7c4SAndroid Build Coastguard Worker            wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_UPD_LOCATION, status.location))
165*f81fb7c4SAndroid Build Coastguard Worker
166*f81fb7c4SAndroid Build Coastguard Worker        SafeJetShutdown(self.playerLock, self.jet)
167*f81fb7c4SAndroid Build Coastguard Worker
168*f81fb7c4SAndroid Build Coastguard Worker        FileKillClean(SegmentOutputFile(self.segment.segname, JetDefs.TEMP_JET_CONFIG_FILE))
169*f81fb7c4SAndroid Build Coastguard Worker        FileKillClean(JetDefs.TEMP_JET_CONFIG_FILE)
170*f81fb7c4SAndroid Build Coastguard Worker        FileKillClean(self.jet_file.config.filename)
171*f81fb7c4SAndroid Build Coastguard Worker
172*f81fb7c4SAndroid Build Coastguard Worker        self.SetKeepPlayingFlag(False)
173*f81fb7c4SAndroid Build Coastguard Worker
174*f81fb7c4SAndroid Build Coastguard Worker        wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_DONE, None))
175*f81fb7c4SAndroid Build Coastguard Worker
176*f81fb7c4SAndroid Build Coastguard Worker        wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_UPD_LOCATION, 0))
177*f81fb7c4SAndroid Build Coastguard Worker
178*f81fb7c4SAndroid Build Coastguard Worker    def SetKeepPlayingFlag(self, val):
179*f81fb7c4SAndroid Build Coastguard Worker        """ Sets the flag to tell us wheter to keep playing """
180*f81fb7c4SAndroid Build Coastguard Worker        with self.playerLock:
181*f81fb7c4SAndroid Build Coastguard Worker            self.keepPlaying = val
182*f81fb7c4SAndroid Build Coastguard Worker
183*f81fb7c4SAndroid Build Coastguard Worker    def GetKeepPlayingFlag(self):
184*f81fb7c4SAndroid Build Coastguard Worker        """ Gets the keep playing flag """
185*f81fb7c4SAndroid Build Coastguard Worker        with self.playerLock:
186*f81fb7c4SAndroid Build Coastguard Worker            return self.keepPlaying
187*f81fb7c4SAndroid Build Coastguard Worker
188*f81fb7c4SAndroid Build Coastguard Worker    def Pause(self):
189*f81fb7c4SAndroid Build Coastguard Worker        """ Pauses playback """
190*f81fb7c4SAndroid Build Coastguard Worker        if self.jet is None:
191*f81fb7c4SAndroid Build Coastguard Worker            return
192*f81fb7c4SAndroid Build Coastguard Worker        if not self.paused:
193*f81fb7c4SAndroid Build Coastguard Worker            self.jet.Pause()
194*f81fb7c4SAndroid Build Coastguard Worker            self.paused = True
195*f81fb7c4SAndroid Build Coastguard Worker            wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_PAUSE, None))
196*f81fb7c4SAndroid Build Coastguard Worker        else:
197*f81fb7c4SAndroid Build Coastguard Worker            self.jet.Play()
198*f81fb7c4SAndroid Build Coastguard Worker            self.paused = False
199*f81fb7c4SAndroid Build Coastguard Worker            wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_RESUME, None))
200*f81fb7c4SAndroid Build Coastguard Worker
201