mirror of
				https://github.com/ElvishArtisan/rivendell.git
				synced 2025-11-04 08:04:12 +01:00 
			
		
		
		
	* Removed all CVS tags. * Removed 'const char *name' parameter from all QObject contructors.
		
			
				
	
	
		
			776 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			776 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// rdplay_deck.cpp
 | 
						|
//
 | 
						|
// Abstract a Rivendell Playback Deck
 | 
						|
//
 | 
						|
//   (C) Copyright 2003-2004,2016 Fred Gleason <fredg@paravelsystems.com>
 | 
						|
//
 | 
						|
//   This program is free software; you can redistribute it and/or modify
 | 
						|
//   it under the terms of the GNU General Public License version 2 as
 | 
						|
//   published by the Free Software Foundation.
 | 
						|
//
 | 
						|
//   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., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
						|
//
 | 
						|
 | 
						|
#include <qsignalmapper.h>
 | 
						|
 | 
						|
#include <rdplay_deck.h>
 | 
						|
#include <rdmixer.h>
 | 
						|
 | 
						|
RDPlayDeck::RDPlayDeck(RDCae *cae,int id,QObject *parent)
 | 
						|
  : QObject(parent)
 | 
						|
{
 | 
						|
  play_id=id;
 | 
						|
  play_state=RDPlayDeck::Stopped;
 | 
						|
  play_start_time=QTime();
 | 
						|
  play_owner=-1;
 | 
						|
  play_last_start_position=0;
 | 
						|
  play_handle=-1;
 | 
						|
  play_audio_length=0;
 | 
						|
  play_channel=-1;
 | 
						|
  play_hook_mode=false;
 | 
						|
 | 
						|
  play_cut_gain=0;
 | 
						|
  play_duck_level=0;
 | 
						|
  play_duck_gain[0]=0;
 | 
						|
  play_duck_gain[1]=0;
 | 
						|
  play_duck_up=RDPLAYDECK_DUCKUP_LENGTH;
 | 
						|
  play_duck_down=RDPLAYDECK_DUCKDOWN_LENGTH;
 | 
						|
  play_duck_up_point=0;
 | 
						|
  play_duck_down_state=false;
 | 
						|
  play_fade_down_state=false;
 | 
						|
 | 
						|
  //
 | 
						|
  // CAE Connection
 | 
						|
  //
 | 
						|
  play_cae=cae;
 | 
						|
  connect(play_cae,SIGNAL(playing(int)),this,SLOT(playingData(int)));
 | 
						|
  connect(play_cae,SIGNAL(playStopped(int)),this,SLOT(playStoppedData(int)));
 | 
						|
  play_cart=NULL;
 | 
						|
  play_cut=NULL;
 | 
						|
  play_card=-1;
 | 
						|
  play_stream=-1;
 | 
						|
 | 
						|
  //
 | 
						|
  // Timers
 | 
						|
  //
 | 
						|
  QSignalMapper *mapper=new QSignalMapper(this,"timer_mapper");
 | 
						|
  connect(mapper,SIGNAL(mapped(int)),this,SLOT(pointTimerData(int)));
 | 
						|
  for(int i=0;i<3;i++) {
 | 
						|
    play_point_timer[i]=new QTimer(this,"point_timer");
 | 
						|
    connect(play_point_timer[i],SIGNAL(timeout()),mapper,SLOT(map()));
 | 
						|
    mapper->setMapping(play_point_timer[i],i);
 | 
						|
  }
 | 
						|
  play_position_timer=new QTimer(this,"play_position_timer");
 | 
						|
  connect(play_position_timer,SIGNAL(timeout()),
 | 
						|
	  this,SLOT(positionTimerData()));
 | 
						|
  play_fade_timer=new QTimer(this,"play_fade_timer");
 | 
						|
  connect(play_fade_timer,SIGNAL(timeout()),this,SLOT(fadeTimerData()));
 | 
						|
  play_stop_timer=new QTimer(this,"play_stop_timer");
 | 
						|
  connect(play_stop_timer,SIGNAL(timeout()),this,SLOT(stop()));
 | 
						|
  play_duck_timer=new QTimer(this,"play_duck_timer");
 | 
						|
  connect(play_duck_timer,SIGNAL(timeout()),this,SLOT(duckTimerData()));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
RDPlayDeck::~RDPlayDeck()
 | 
						|
{
 | 
						|
  if(play_state!=RDPlayDeck::Stopped) {
 | 
						|
    play_cae->stopPlay(play_handle);
 | 
						|
    play_cae->unloadPlay(play_handle);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int RDPlayDeck::id() const
 | 
						|
{
 | 
						|
  return play_id;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::setId(int id)
 | 
						|
{
 | 
						|
  play_id=id;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int RDPlayDeck::owner() const
 | 
						|
{
 | 
						|
  return play_owner;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::setOwner(int owner)
 | 
						|
{
 | 
						|
  play_owner=owner;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
RDCart *RDPlayDeck::cart() const
 | 
						|
{
 | 
						|
  return play_cart;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool RDPlayDeck::setCart(RDLogLine *logline,bool rotate)
 | 
						|
{
 | 
						|
  play_timescale_active=logline->timescalingActive();
 | 
						|
  if((play_cart!=NULL)&&(rotate||play_cart->number()!=logline->cartNumber())) {
 | 
						|
    delete play_cart;
 | 
						|
    delete play_cut;
 | 
						|
    play_cart=NULL;
 | 
						|
    play_cut=NULL;
 | 
						|
  }
 | 
						|
  if(play_cart==NULL) {
 | 
						|
    StopTimers();
 | 
						|
    play_cart=new RDCart(logline->cartNumber());
 | 
						|
    if(!play_cart->exists()) {
 | 
						|
      delete play_cart;
 | 
						|
      play_cart=NULL;
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
 | 
						|
    QString cutname=logline->cutName();
 | 
						|
    //
 | 
						|
    // FIXME: We need to handle the 'cut no longer valid' case better!
 | 
						|
    //
 | 
						|
    //if(play_cart->selectCut(&cutname)) {     This fixes problems with cuts of different length in one cart.
 | 
						|
    //  logline->setCutName(cutname);          We do not need to select a cut, because it is done immediatly before
 | 
						|
    //}                                        this method is called.
 | 
						|
    if(cutname.isEmpty()) {
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
    play_cut=new RDCut(cutname);
 | 
						|
    if(!play_cut->exists()) {
 | 
						|
      delete play_cut;
 | 
						|
      play_cut=NULL;
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  if(logline->startPoint(RDLogLine::LogPointer)<0) {
 | 
						|
    play_forced_length=logline->forcedLength();
 | 
						|
    /*
 | 
						|
    play_audio_point[0]=logline->startPoint();
 | 
						|
    play_audio_point[1]=logline->endPoint();
 | 
						|
    */
 | 
						|
    play_audio_point[0]=play_cut->startPoint(RDLogLine::CartPointer);
 | 
						|
    play_audio_point[1]=play_cut->endPoint();
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    play_forced_length=logline->effectiveLength();
 | 
						|
    play_audio_point[0]=logline->startPoint(RDLogLine::LogPointer);
 | 
						|
    play_audio_point[1]=logline->endPoint();
 | 
						|
  }
 | 
						|
  if(logline->endPoint(RDLogLine::LogPointer)>=0) {
 | 
						|
    play_forced_length=logline->effectiveLength();
 | 
						|
    play_audio_point[0]=logline->startPoint();
 | 
						|
    play_audio_point[1]=logline->endPoint(RDLogLine::LogPointer);
 | 
						|
  }
 | 
						|
  if(play_timescale_active) {
 | 
						|
    play_timescale_speed=
 | 
						|
      (int)(RD_TIMESCALE_DIVISOR*(double)(play_audio_point[1]-
 | 
						|
					  play_audio_point[0])/
 | 
						|
      (double)play_forced_length);
 | 
						|
    if((((double)play_timescale_speed)<
 | 
						|
	(RD_TIMESCALE_DIVISOR*RD_TIMESCALE_MIN))||
 | 
						|
       (((double)play_timescale_speed)>
 | 
						|
	(RD_TIMESCALE_DIVISOR*RD_TIMESCALE_MAX))) {
 | 
						|
      play_timescale_speed=(int)RD_TIMESCALE_DIVISOR;
 | 
						|
      play_timescale_active=false;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    play_timescale_speed=(int)RD_TIMESCALE_DIVISOR;
 | 
						|
  }
 | 
						|
  play_audio_length=play_audio_point[1]-play_audio_point[0];
 | 
						|
  if(logline->segueStartPoint(RDLogLine::AutoPointer)<0) {
 | 
						|
    play_point_value[RDPlayDeck::Segue][0]=
 | 
						|
      (int)((double)play_cut->segueStartPoint());
 | 
						|
    play_point_value[RDPlayDeck::Segue][1]=
 | 
						|
      (int)((double)play_cut->segueEndPoint());
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    play_point_value[RDPlayDeck::Segue][0]=
 | 
						|
      (int)((double)logline->segueStartPoint(RDLogLine::AutoPointer));
 | 
						|
    play_point_value[RDPlayDeck::Segue][1]=
 | 
						|
      (int)((double)logline->segueEndPoint(RDLogLine::AutoPointer));
 | 
						|
  }
 | 
						|
  play_point_gain=logline->segueGain();
 | 
						|
  play_point_value[RDPlayDeck::Hook][0]=
 | 
						|
    (int)((double)play_cut->hookStartPoint());
 | 
						|
  play_point_value[RDPlayDeck::Hook][1]=
 | 
						|
    (int)((double)play_cut->hookEndPoint());
 | 
						|
  logline->setHookStartPoint(play_point_value[RDPlayDeck::Hook][0]);
 | 
						|
  logline->setHookEndPoint(play_point_value[RDPlayDeck::Hook][1]);
 | 
						|
  play_point_value[RDPlayDeck::Talk][0]=
 | 
						|
    (int)((double)play_cut->talkStartPoint()*
 | 
						|
	  (RD_TIMESCALE_DIVISOR/(double)play_timescale_speed));
 | 
						|
  play_point_value[RDPlayDeck::Talk][1]=
 | 
						|
    (int)((double)play_cut->talkEndPoint()*
 | 
						|
	  (RD_TIMESCALE_DIVISOR/(double)play_timescale_speed));
 | 
						|
  logline->setTalkStartPoint(play_point_value[RDPlayDeck::Talk][0]);
 | 
						|
  logline->setTalkEndPoint(play_point_value[RDPlayDeck::Talk][1]);
 | 
						|
  if(logline->fadeupPoint(RDLogLine::LogPointer)<0) {
 | 
						|
    play_fade_point[0]=play_cut->fadeupPoint();
 | 
						|
    play_fade_gain[0]=RD_FADE_DEPTH;
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    play_fade_point[0]=logline->fadeupPoint(RDLogLine::LogPointer);
 | 
						|
    play_fade_gain[0]=logline->fadeupGain();
 | 
						|
  }
 | 
						|
  if(logline->fadedownPoint(RDLogLine::LogPointer)<0) {
 | 
						|
    play_fade_point[1]=play_cut->fadedownPoint();
 | 
						|
    play_fade_gain[1]=RD_FADE_DEPTH;
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    play_fade_point[1]=logline->fadedownPoint(RDLogLine::LogPointer);
 | 
						|
    play_fade_gain[1]=logline->fadedownGain();
 | 
						|
  }
 | 
						|
  play_duck_gain[0]=logline->duckUpGain();
 | 
						|
  play_duck_gain[1]=logline->duckDownGain();
 | 
						|
 | 
						|
/*
 | 
						|
  if(play_timescale_active) {
 | 
						|
    play_timescale_speed=
 | 
						|
      (int)(1000*(double)(play_audio_point[1]-play_audio_point[0])/
 | 
						|
      (double)play_forced_length);
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    play_timescale_speed=1000;
 | 
						|
  }
 | 
						|
*/
 | 
						|
 | 
						|
  if(play_state!=RDPlayDeck::Paused) {
 | 
						|
    if(!play_cae->loadPlay(play_card,play_cut->cutName(),
 | 
						|
			   &play_stream,&play_handle)) {
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  play_state=RDPlayDeck::Stopped;
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
RDCut *RDPlayDeck::cut() const
 | 
						|
{
 | 
						|
  return play_cut;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool RDPlayDeck::playable() const
 | 
						|
{
 | 
						|
  if(play_handle<0) {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int RDPlayDeck::card() const
 | 
						|
{
 | 
						|
  return play_card;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::setCard(int card_num)
 | 
						|
{
 | 
						|
  play_card=card_num;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int RDPlayDeck::stream() const
 | 
						|
{
 | 
						|
  return play_stream;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int RDPlayDeck::port() const
 | 
						|
{
 | 
						|
  return play_port;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::setPort(int port_num)
 | 
						|
{
 | 
						|
  play_port=port_num;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int RDPlayDeck::channel() const
 | 
						|
{
 | 
						|
  return play_channel;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::setChannel(int chan)
 | 
						|
{
 | 
						|
  play_channel=chan;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
RDPlayDeck::State RDPlayDeck::state() const
 | 
						|
{
 | 
						|
  return play_state;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
QTime RDPlayDeck::startTime() const
 | 
						|
{
 | 
						|
  return play_start_time;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int RDPlayDeck::currentPosition() const
 | 
						|
{
 | 
						|
  switch(play_state) {
 | 
						|
      case RDPlayDeck::Playing:
 | 
						|
	return play_start_position+
 | 
						|
	  play_start_time.msecsTo(QTime::currentTime());
 | 
						|
 | 
						|
      case RDPlayDeck::Paused:
 | 
						|
	return play_current_position+POSITION_INTERVAL;
 | 
						|
 | 
						|
      default:
 | 
						|
	return play_start_position;
 | 
						|
  }
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int RDPlayDeck::lastStartPosition() const
 | 
						|
{
 | 
						|
  return play_last_start_position;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::clear()
 | 
						|
{
 | 
						|
  StopTimers();
 | 
						|
  switch(play_state) {
 | 
						|
      case RDPlayDeck::Playing:
 | 
						|
      case RDPlayDeck::Stopping:
 | 
						|
	stop();
 | 
						|
	break;
 | 
						|
 | 
						|
      case RDPlayDeck::Paused:
 | 
						|
	play_cae->unloadPlay(play_handle);
 | 
						|
	emit stateChanged(play_id,RDPlayDeck::Stopped);
 | 
						|
	break;
 | 
						|
 | 
						|
      default:
 | 
						|
	emit stateChanged(play_id,RDPlayDeck::Stopped);
 | 
						|
	break;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::reset()
 | 
						|
{
 | 
						|
  StopTimers();
 | 
						|
  switch(play_state) {
 | 
						|
      case RDPlayDeck::Playing:
 | 
						|
      case RDPlayDeck::Stopping:
 | 
						|
	play_cae->stopPlay(play_handle);
 | 
						|
 | 
						|
      case RDPlayDeck::Paused:
 | 
						|
	play_cae->unloadPlay(play_handle);
 | 
						|
	break;
 | 
						|
 | 
						|
      default:
 | 
						|
	break;
 | 
						|
  }
 | 
						|
  play_state=RDPlayDeck::Stopped;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::play(unsigned pos,int segue_start,int segue_end,
 | 
						|
		      int duck_up_end)
 | 
						|
{
 | 
						|
  int fadeup;
 | 
						|
  play_hook_mode=false;
 | 
						|
  play_cut_gain=play_cut->playGain();
 | 
						|
 | 
						|
  play_ducked=0;
 | 
						|
  if(duck_up_end==-1) { //ducked until stop (for recording in voice tracker)
 | 
						|
    play_ducked=play_duck_gain[0];
 | 
						|
    play_duck_up_point=0;
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    play_duck_up_point=duck_up_end-play_duck_up;
 | 
						|
  }
 | 
						|
  if(play_duck_up_point<0)
 | 
						|
    play_duck_up_point=0;
 | 
						|
  else
 | 
						|
    play_ducked=play_duck_gain[0];
 | 
						|
 | 
						|
  if(play_handle<0) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  if(segue_start>=0) {
 | 
						|
    play_point_value[RDPlayDeck::Segue][0]=segue_start;
 | 
						|
  }
 | 
						|
  if(segue_end>=0) {
 | 
						|
    play_point_value[RDPlayDeck::Segue][1]=segue_end;
 | 
						|
  }
 | 
						|
  play_start_position=pos;
 | 
						|
  play_current_position=pos;
 | 
						|
  play_last_start_position=play_start_position;
 | 
						|
  stop_called=false;
 | 
						|
  pause_called=false;
 | 
						|
  play_cae->positionPlay(play_handle,play_audio_point[0]+pos);
 | 
						|
  play_cae->setPlayPortActive(play_card,play_port,play_stream);
 | 
						|
  for(int i=0;i<RD_MAX_PORTS;i++) {
 | 
						|
    play_cae->setOutputVolume(play_card,play_stream,i,RD_MUTE_DEPTH);
 | 
						|
  }
 | 
						|
  if((play_fade_point[0]==-1)||(play_fade_point[0]==play_audio_point[0])||
 | 
						|
     ((fadeup=play_fade_point[0]-play_audio_point[0]-pos)<=0)||
 | 
						|
     (play_state==RDPlayDeck::Paused)) {
 | 
						|
    if((play_fade_point[1]==-1)||((fadeup=pos-play_fade_point[1])<=0)||
 | 
						|
       (play_state==RDPlayDeck::Paused)) {
 | 
						|
      play_cae->setOutputVolume(play_card,play_stream,play_port,
 | 
						|
				play_ducked+play_cut_gain+play_duck_level);
 | 
						|
      play_cae->fadeOutputVolume(play_card,play_stream,play_port,
 | 
						|
				 play_ducked+play_cut_gain+play_duck_level,10);
 | 
						|
    }
 | 
						|
    else {  // Fadedown event in progress, interpolate the gain accordingly
 | 
						|
      int level=play_fade_gain[1]*((int)pos-play_fade_point[1])/
 | 
						|
			(play_audio_point[1]-play_fade_point[1]);
 | 
						|
      play_cae->
 | 
						|
	setOutputVolume(play_card,play_stream,play_port,
 | 
						|
			level+play_cut_gain+play_duck_level);
 | 
						|
      play_cae->fadeOutputVolume(play_card,play_stream,play_port,
 | 
						|
				 play_fade_gain[1]+play_cut_gain+
 | 
						|
				 play_duck_level,
 | 
						|
				 play_audio_point[1]-(int)pos);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else {  // FadeUp event in progress, interpolate the gain accordingly
 | 
						|
    int level=(play_fade_gain[0]*fadeup/
 | 
						|
		      (play_fade_point[0]-play_audio_point[0]));
 | 
						|
    if (level>play_ducked) {
 | 
						|
    play_cae->
 | 
						|
      setOutputVolume(play_card,play_stream,play_port,
 | 
						|
		      play_ducked+play_cut_gain+play_duck_level);
 | 
						|
    play_cae->fadeOutputVolume(play_card,play_stream,play_port,
 | 
						|
			       play_ducked+play_cut_gain+play_duck_level,
 | 
						|
			       fadeup);
 | 
						|
    }
 | 
						|
    else {
 | 
						|
    play_cae->
 | 
						|
      setOutputVolume(play_card,play_stream,play_port,
 | 
						|
		      level+play_cut_gain+play_duck_level);
 | 
						|
    play_cae->fadeOutputVolume(play_card,play_stream,play_port,
 | 
						|
			       play_ducked+play_cut_gain+play_duck_level,
 | 
						|
			       fadeup);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  play_cae->
 | 
						|
    play(play_handle,
 | 
						|
	 (int)(100000.0*(double)(play_audio_point[1]-play_audio_point[0]-pos)/
 | 
						|
	 (double)play_timescale_speed),
 | 
						|
	 play_timescale_speed,false);
 | 
						|
  play_start_time=QTime::currentTime();
 | 
						|
  StartTimers(pos);
 | 
						|
  play_state=RDPlayDeck::Playing;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::playHook()
 | 
						|
{
 | 
						|
  play(play_point_value[RDPlayDeck::Hook][0]-play_audio_point[0]);
 | 
						|
  play_hook_mode=true;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::pause()
 | 
						|
{
 | 
						|
  pause_called=true;
 | 
						|
  play_state=RDPlayDeck::Paused;
 | 
						|
  play_cae->stopPlay(play_handle);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::stop()
 | 
						|
{
 | 
						|
  if((play_state!=RDPlayDeck::Playing)&&(play_state!=RDPlayDeck::Stopping)) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  if(pause_called) {
 | 
						|
    play_state=RDPlayDeck::Stopped;
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    stop_called=true;
 | 
						|
    play_state=RDPlayDeck::Stopping;
 | 
						|
    play_cae->stopPlay(play_handle);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::stop(int interval,int gain)
 | 
						|
{
 | 
						|
  int level;
 | 
						|
  
 | 
						|
  if(gain>play_point_gain) {
 | 
						|
    play_point_gain=gain;
 | 
						|
  }
 | 
						|
  
 | 
						|
 | 
						|
  if((play_state!=RDPlayDeck::Playing)&&(play_state!=RDPlayDeck::Stopping)) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  if((interval<=0)||pause_called) {
 | 
						|
    stop();
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    if(play_duck_gain[1]<0 && play_duck_down<interval && 
 | 
						|
        (play_audio_point[1]-play_audio_point[0]-
 | 
						|
        currentPosition())>play_duck_down) { // duck
 | 
						|
      if(play_audio_point[0]+currentPosition()>play_fade_point[1]) {
 | 
						|
        level=play_fade_gain[1]*((currentPosition()+play_audio_point[0])-
 | 
						|
              play_fade_point[1])/(play_audio_point[1]-play_fade_point[1]);
 | 
						|
      }
 | 
						|
      else {
 | 
						|
        level=0;
 | 
						|
      }        
 | 
						|
      if(level>play_duck_gain[1]){
 | 
						|
         play_cae->fadeOutputVolume(play_card,play_stream,play_port,
 | 
						|
			       play_duck_gain[1]+play_cut_gain+play_duck_level,play_duck_down);
 | 
						|
        play_duck_timer->start(play_duck_down,true);
 | 
						|
        play_duck_down_state=true;
 | 
						|
        play_segue_interval=interval;
 | 
						|
      }
 | 
						|
    }
 | 
						|
    else {
 | 
						|
      if(play_point_gain!=0) {
 | 
						|
        play_cae->fadeOutputVolume(play_card,play_stream,play_port,
 | 
						|
			       play_point_gain+play_cut_gain+play_duck_level,interval);
 | 
						|
      }
 | 
						|
    }
 | 
						|
    play_stop_timer->start(interval,true);
 | 
						|
    stop_called=true;
 | 
						|
    play_state=RDPlayDeck::Stopping;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::duckDown(int interval)
 | 
						|
{
 | 
						|
  if(play_duck_gain[1]<0) {
 | 
						|
    play_cae->fadeOutputVolume(play_card,play_stream,play_port,
 | 
						|
      	       play_duck_gain[1]+play_cut_gain+play_duck_level,play_duck_down);
 | 
						|
    play_duck_timer->start(play_duck_down,true);
 | 
						|
    play_duck_down_state=true;
 | 
						|
    play_segue_interval=interval;
 | 
						|
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::duckVolume(int level,int fade)
 | 
						|
{
 | 
						|
  play_duck_level=level;
 | 
						|
  if((state()==RDPlayDeck::Playing || state()==RDPlayDeck::Stopping) && fade>0) {
 | 
						|
	  play_cae->fadeOutputVolume(play_card,play_stream,play_port,play_cut_gain+play_duck_level,
 | 
						|
					   fade);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::playingData(int handle)
 | 
						|
{
 | 
						|
  if(handle!=play_handle) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  play_position_timer->start(POSITION_INTERVAL);
 | 
						|
  emit stateChanged(play_id,RDPlayDeck::Playing);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::playStoppedData(int handle)
 | 
						|
{ 
 | 
						|
  if(handle!=play_handle) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  play_position_timer->stop();
 | 
						|
  play_start_time=QTime();
 | 
						|
  StopTimers();
 | 
						|
  if(pause_called) {
 | 
						|
    play_state=RDPlayDeck::Paused;
 | 
						|
    emit stateChanged(play_id,RDPlayDeck::Paused);
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    play_cae->unloadPlay(play_handle);
 | 
						|
 | 
						|
    play_handle=-1;
 | 
						|
    play_state=RDPlayDeck::Stopped;
 | 
						|
    play_current_position=0;
 | 
						|
    play_duck_down_state=false;
 | 
						|
    play_fade_down_state=false;
 | 
						|
    if(stop_called) {
 | 
						|
      emit stateChanged(play_id,RDPlayDeck::Stopped);
 | 
						|
    }
 | 
						|
    else {
 | 
						|
      emit stateChanged(play_id,RDPlayDeck::Finished);
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::pointTimerData(int point)
 | 
						|
{
 | 
						|
  switch(point) {
 | 
						|
      case RDPlayDeck::Segue:
 | 
						|
	if(play_point_state[point]) {
 | 
						|
	  play_point_state[point]=false;
 | 
						|
	  emit segueEnd(play_id);
 | 
						|
	}
 | 
						|
	else {
 | 
						|
	  play_point_state[point]=true;
 | 
						|
	  play_point_timer[point]->
 | 
						|
	    start(play_point_value[point][1]-play_point_value[point][0],true);
 | 
						|
	  emit segueStart(play_id);
 | 
						|
	}
 | 
						|
	break;
 | 
						|
 | 
						|
      case RDPlayDeck::Hook:
 | 
						|
	if(play_point_state[point]) {
 | 
						|
	  play_point_state[point]=false;
 | 
						|
	  emit hookEnd(play_id);
 | 
						|
	}
 | 
						|
	else {
 | 
						|
	  play_point_state[point]=true;
 | 
						|
	  play_point_timer[point]->
 | 
						|
	    start(play_point_value[point][1]-play_point_value[point][0],true);
 | 
						|
	  emit hookStart(play_id);
 | 
						|
	}
 | 
						|
	break;
 | 
						|
 | 
						|
      case RDPlayDeck::Talk:
 | 
						|
	if(play_point_state[point]) {
 | 
						|
	  play_point_state[point]=false;
 | 
						|
	  emit talkEnd(play_id);
 | 
						|
	}
 | 
						|
	else {
 | 
						|
	  play_point_state[point]=true;
 | 
						|
	  play_point_timer[point]->
 | 
						|
	    start(play_point_value[point][1]-play_point_value[point][0],true);
 | 
						|
	  emit talkStart(play_id);
 | 
						|
	}
 | 
						|
	break;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::positionTimerData()
 | 
						|
{
 | 
						|
  play_current_position=
 | 
						|
    play_start_position+play_start_time.msecsTo(QTime::currentTime());
 | 
						|
  if(play_current_position<0) {       // Handle crossing midnight!
 | 
						|
    play_current_position+=86400000;
 | 
						|
  }
 | 
						|
  if(play_hook_mode) {
 | 
						|
    emit position(play_id,play_current_position-(play_point_value[RDPlayDeck::Hook][0]-play_audio_point[0]));
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    emit position(play_id,play_current_position);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::fadeTimerData()
 | 
						|
{
 | 
						|
  if(!play_duck_down_state) {
 | 
						|
  play_cae->
 | 
						|
    fadeOutputVolume(play_card,play_stream,play_port,play_fade_gain[1]+play_cut_gain+play_duck_level,
 | 
						|
		     play_fade_down);
 | 
						|
  }
 | 
						|
  play_fade_down_state=true;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::duckTimerData()
 | 
						|
{
 | 
						|
  if (!play_duck_down_state) { //duck up
 | 
						|
    play_cae->
 | 
						|
      fadeOutputVolume(play_card,play_stream,play_port,0+play_cut_gain+play_duck_level,play_duck_up);
 | 
						|
    play_ducked=0;
 | 
						|
  }
 | 
						|
  else { //duck down
 | 
						|
	  if(play_point_gain!=0) {
 | 
						|
      play_cae->fadeOutputVolume(play_card,play_stream,play_port,
 | 
						|
	  		       play_point_gain+play_cut_gain+play_duck_level,
 | 
						|
                               play_segue_interval-play_duck_down);
 | 
						|
    }
 | 
						|
    else {
 | 
						|
      if(play_fade_down_state && 
 | 
						|
         play_fade_gain[1]<play_duck_gain[1]) { //fade down in progress
 | 
						|
        play_cae->fadeOutputVolume(play_card,play_stream,play_port,
 | 
						|
	  		       play_fade_gain[1]+play_cut_gain+play_duck_level,
 | 
						|
                               play_segue_interval-play_duck_down);
 | 
						|
      }   
 | 
						|
    } 
 | 
						|
    play_duck_down_state=false;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::StartTimers(int offset)
 | 
						|
{
 | 
						|
  int audio_point;
 | 
						|
 | 
						|
  for(int i=0;i<RDPlayDeck::SizeOf;i++) {
 | 
						|
    play_point_state[i]=false;
 | 
						|
    if(play_point_value[i][0]!=-1) {
 | 
						|
      audio_point=(int)
 | 
						|
	(RD_TIMESCALE_DIVISOR*(double)play_audio_point[0]/
 | 
						|
	 (double)play_timescale_speed);
 | 
						|
      if((play_point_value[i][0]-audio_point-offset)>=0) {
 | 
						|
	play_point_timer[i]->
 | 
						|
	  start(play_point_value[i][0]-audio_point-offset,true);
 | 
						|
      }
 | 
						|
      else {
 | 
						|
	if((play_point_value[i][1]-audio_point-offset)>=0) {
 | 
						|
	  play_point_state[i]=true;
 | 
						|
	  play_point_timer[i]->
 | 
						|
	    start(play_point_value[i][1]-audio_point-offset,true);
 | 
						|
	}
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  if((play_fade_point[1]!=-1)&&(offset<play_fade_point[1])&&
 | 
						|
     ((play_fade_down=play_audio_point[1]-play_fade_point[1])>0)) {
 | 
						|
    play_fade_timer->start(play_fade_point[1]-play_audio_point[0]-offset,true);
 | 
						|
  }
 | 
						|
  if(offset<play_duck_up_point){
 | 
						|
    play_duck_timer->
 | 
						|
      start(play_duck_up_point-offset,true);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void RDPlayDeck::StopTimers()
 | 
						|
{
 | 
						|
  for(int i=0;i<RDPlayDeck::SizeOf;i++) {
 | 
						|
    if(play_point_timer[i]->isActive()) {
 | 
						|
      play_point_timer[i]->stop();
 | 
						|
    }
 | 
						|
  }
 | 
						|
  if(play_fade_timer->isActive()) {
 | 
						|
    play_fade_timer->stop();
 | 
						|
  }
 | 
						|
  if(play_stop_timer->isActive()) {
 | 
						|
    play_stop_timer->stop();
 | 
						|
  }
 | 
						|
  if(play_duck_timer->isActive()) {
 | 
						|
    play_duck_timer->stop();
 | 
						|
  }
 | 
						|
}
 |