/*
* Created on 17-dic-2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.herac.tuxguitar.gui.actions.transport;
import java.awt.AWTEvent;
import org.herac.tuxguitar.gui.TuxGuitar;
import org.herac.tuxguitar.gui.actions.Action;
import org.herac.tuxguitar.gui.util.MidiTickUtil;
import org.herac.tuxguitar.player.base.MidiPlayer;
import org.herac.tuxguitar.player.base.MidiPlayerException;
import org.herac.tuxguitar.song.models.TGMeasureHeader;
/**
* @author julian
*
* TODO To change the template for this generated type comment go to Window - Preferences - Java - Code Style - Code Templates
*/
public class TransportPlayAction extends Action {
public static final String NAME = "action.transport.play";
public TransportPlayAction() {
super(NAME, AUTO_LOCK | AUTO_UNLOCK | AUTO_UPDATE | KEY_BINDING_AVAILABLE);
}
protected int execute(AWTEvent e){
MidiPlayer player = TuxGuitar.instance().getPlayer();
if(!player.isRunning()){
try{
updateTransportPosition();
player.getMode().reset();
player.play();
playThread();
}catch(MidiPlayerException exception){
exception.printStackTrace();
}
}else{
player.pause();
updateCaretPosition();
}
return 0;
}
protected void playThread() {
new Thread(new Runnable() {
public void run() {
try {
while (TuxGuitar.instance().getPlayer().isRunning()) {
if(TuxGuitar.instance().getPlayer().isRunning()){
synchronized( TuxGuitar.instance() ){
TuxGuitar.instance().redrawPayingMode();
TuxGuitar.instance().wait(25);
}
}
}
updateCaretPosition();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();
}
protected void updateCaretPosition(){
TGMeasureHeader header = getSongManager().getMeasureHeaderAt(MidiTickUtil.getStart(TuxGuitar.instance().getPlayer().getTickPosition()));
TuxGuitar.instance().getTransport().gotoMeasure(header, true);
}
protected void updateTransportPosition(){
TGMeasureHeader header = getEditor().getTablature().getCaret().getMeasure().getHeader();
TuxGuitar.instance().getTransport().gotoMeasure(header, false);
}
}