void ofxTLAudioTrack::update(){
	if(this == timeline->getTimecontrolTrack()){
		if(getIsPlaying()){
			if(player.getPosition() < lastPercent){
				ofxTLPlaybackEventArgs args = timeline->createPlaybackEvent();
				ofNotifyEvent(events().playbackLooped, args);
			}
			lastPercent = player.getPosition();
			
			//currently only supports timelines with duration == duration of player
			if(lastPercent < timeline->getInOutRange().min){
				//player.setPosition( timeline->getInOutRange().min );
				player.setPosition( positionForSecond(timeline->getInTimeInSeconds()) );
			}
			else if(lastPercent > timeline->getInOutRange().max){
				if(timeline->getLoopType() == OF_LOOP_NONE){
//					player.setPosition(timeline->getInOutRange().max);
					player.setPosition( positionForSecond(timeline->getInTimeInSeconds()) );
					stop();
				}
				else{
//					player.setPosition(timeline->getInOutRange().min);
					player.setPosition( positionForSecond(timeline->getOutTimeInSeconds()) );
				}
			}
			
			timeline->setCurrentTimeSeconds(player.getPosition() * player.getDuration());
		}
	}
	//cout << "audio track " << player.getPosition() << " timeline " << timeline->getPercentComplete() << endl;
}
void ofxTLAudioTrack::playbackLooped(ofxTLPlaybackEventArgs& args){
	if(isSoundLoaded() && this != timeline->getTimecontrolTrack()){
		if(!player.getIsPlaying()){
			player.play();
		}
		player.setPosition( positionForSecond(timeline->getCurrentTime()) );
	}
}
void ofxTLVideoTrack::playbackLooped(ofxTLPlaybackEventArgs& args){
	if(isLoaded() && this != timeline->getTimecontrolTrack() && playAlongToTimeline){
		if(!player->isPlaying()){
			player->play();
		}
		player->setPosition( positionForSecond(timeline->getCurrentTime()) );
	}
}
void ofxTLAudioTrack::playbackStarted(ofxTLPlaybackEventArgs& args){
	ofxTLTrack::playbackStarted(args);
	if(isSoundLoaded() && this != timeline->getTimecontrolTrack()){
		//player.setPosition(timeline->getPercentComplete());
		float position = positionForSecond(timeline->getCurrentTime());
		if(position < 1.0){
			player.play();
		}
		player.setPosition( position );
	}
}
void ofxTLVideoTrack::playbackStarted(ofxTLPlaybackEventArgs& args){
	ofxTLTrack::playbackStarted(args);
	if(isLoaded() && this != timeline->getTimecontrolTrack() && playAlongToTimeline){
		//player.setPosition(timeline->getPercentComplete());
		float position = positionForSecond(timeline->getCurrentTime());
		if(position < 1.0){
			player->setSpeed(1.0);
			player->play();
            currentlyPlaying = true;
		}
		player->setPosition( position );
	}
}
void ofxTLAudioTrack::play(){
	if(!player.getIsPlaying()){
		
//		lastPercent = MIN(timeline->getPercentComplete() * timeline->getDurationInSeconds() / player.getDuration(), 1.0);
		player.setLoop(timeline->getLoopType() == OF_LOOP_NORMAL);

		player.play();
		if(timeline->getTimecontrolTrack() == this){
			player.setPosition(positionForSecond(timeline->getCurrentTime()));
			ofxTLPlaybackEventArgs args = timeline->createPlaybackEvent();
			ofNotifyEvent(events().playbackStarted, args);
		}
	}
}
void ofxTLAudioTrack::play(){

	if(!player.isPlaying()){
        
//		lastPercent = MIN(timeline->getPercentComplete() * timeline->getDurationInSeconds() / player.getDuration(), 1.0);
		player.setLoop(timeline->getLoopType() == OF_LOOP_NORMAL);
		player.play();
		if(timeline->getTimecontrolTrack() == this){
			if(player.getPosition() == 1.0 || timeline->getPercentComplete() > .99){
                timeline->setCurrentTimeSeconds(0);
            }
            
            player.setPosition(positionForSecond(timeline->getCurrentTime()));
            //cout << " setting time to  " << positionForSecond(timeline->getCurrentTime()) << " actual " << player.getPosition() << endl;
            
			ofxTLPlaybackEventArgs args = timeline->createPlaybackEvent();
			ofNotifyEvent(events().playbackStarted, args);
		}
	}
}