VocalEasel/mma/MMA/player.py

136 lines
3.6 KiB
Python
Raw Permalink Normal View History

2011-07-26 22:49:39 +00:00
# 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 <bob@mellowood.ca>
"""
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)