
# 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 and l[0].isalpha():
            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))  # puts all opts into one string, not right??
        cmd.extend(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), MIDI file has been deleted." \
            % ((time.time()-t)/60)


