# player.py """ This module is an integeral part of the program MMA - Musical Midi Accompaniment. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Bob van der Poel """ import time import subprocess import re from MMA.common import * import MMA.gbl # Just in case the player is NOT set in mma.py we wrap the import # in a try/except. Set it to '' if the import fails. try: from __main__ import midiPlayer except: midiPlayer = [''] # We run in background in windows, foreground in linux if gbl.platform == 'Windows': inBackGround = 1 # by default we run in foreground else: inBackGround = 0 waitTime = 5 # default time to wait after forking in background def setMidiPlayer(ln): """ Set the MIDI file player (used with -P and -V). """ global midiPlayer, waitTime, inBackGround if not ln: ln = [''] n = [] for l in ln: # parse out optional args if '=' in l: a,b = l.upper().split('=', 1) if a == 'DELAY': b = stof(b, "SetMidiPlayer: Delay must be value, not '%s'." % b) waitTime = b elif a == "BACKGROUND": if b in ('1','YES'): inBackGround = 1 elif b in ('0', 'NO'): inBackGround = 0 else: error("SetMidiPlayer: Background must be 'yes'" "or 'no', not '%s'." % b) else: error("SetMidiPlayer: unknown option '%s'." % a) else: n.append(MMA.file.fixfname(l)) if not n: n=[''] midiPlayer = n if gbl.debug: print "MidiPlayer set to '%s' Background=%s Delay=%s." % \ (' '.join(midiPlayer), inBackGround, waitTime) def playMidi(file): """ Play a midi file. """ pl = midiPlayer[0] opts = midiPlayer[1:] if not pl and gbl.platform != "Windows": error("No MIDI file player defined, temp files will be deleted.") if not pl: m = "default windows MIDI player" else: m = pl print "Playing MIDI '%s' with %s." % (file, m) if gbl.platform == "Windows": sh = True else: sh = False cmd = [pl] if opts: cmd.append(' '.join(opts)) cmd.append(file) t=time.time() # fork our player. try: pid = subprocess.Popen(cmd, shell=sh) except OSError, e: print e msg = "MidiPlayer fork error." if re.search("[\'\"]", ''.join(cmd)): msg += " Using quotes in the MidiPlayer name/opts might be your problem." error(msg) if inBackGround: # if the background option set, do a sleep print "Play in progress ... file will be deleted." time.sleep(waitTime) else: # foreground player ... wait for process to finish pid.wait() print "Play complete (%.2f min), file has been deleted." \ % ((time.time()-t)/60)