2023-10-16 Fred Gleason <fredg@paravelsystems.com>

* Added a 'volume' parameter to the 'Start Playback' CAE command.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2023-10-16 16:08:16 -04:00
parent 0dbe252a98
commit 8649ee1a0e
16 changed files with 215 additions and 126 deletions

View File

@ -24456,3 +24456,5 @@
2023-10-16 Fred Gleason <fredg@paravelsystems.com>
* Modified rdcatch(8) to use the new-style CAE commands for play-out
events.
2023-10-16 Fred Gleason <fredg@paravelsystems.com>
* Added a 'volume' parameter to the 'Start Playback' CAE command.

View File

@ -156,9 +156,9 @@ MainObject::MainObject(QObject *parent)
connect(cae_server,SIGNAL(playPositionReq(const SessionId &,int)),
this,SLOT(playPositionData(const SessionId &,int)));
connect(cae_server,SIGNAL(startPlaybackReq(const SessionId &,const QString &,
unsigned,unsigned,int,int,int)),
unsigned,unsigned,int,int,int,int)),
this,SLOT(startPlaybackData(const SessionId &,const QString &,
unsigned,unsigned,int,int,int)));
unsigned,unsigned,int,int,int,int)));
connect(cae_server,SIGNAL(playStopReq(const SessionId &)),
this,SLOT(stopPlaybackData(const SessionId &)));
connect(cae_server,SIGNAL(loadPlaybackReq(int,unsigned,const QString &)),
@ -353,7 +353,8 @@ MainObject::MainObject(QObject *parent)
//
void MainObject::startPlaybackData(const SessionId &sid,const QString &cutname,
unsigned cardnum,unsigned portnum,
int start_pos,int end_pos,int speed)
int start_pos,int end_pos,int speed,
int volume)
{
Driver *dvr=NULL;
@ -388,7 +389,7 @@ void MainObject::startPlaybackData(const SessionId &sid,const QString &cutname,
//
// Set Mixer
//
if(!dvr->setOutputVolume(cardnum,streamnum,portnum,0)) {
if(!dvr->setOutputVolume(cardnum,streamnum,portnum,volume)) {
rda->syslog(LOG_WARNING,"set output volume failed - session: %s card: %d port: %d stream: %d level: 0",
sid.dump().toUtf8().constData(),cardnum,portnum,streamnum);
}

View File

@ -77,7 +77,7 @@ class MainObject : public QObject
//
void startPlaybackData(const SessionId &sid,const QString &cutname,
unsigned cardnum,unsigned portnum,
int start_pos,int end_pos,int speed);
int start_pos,int end_pos,int speed,int volume);
void playPositionData(const SessionId &sid,int position);
void stopPlaybackData(const SessionId &sid);

View File

@ -148,6 +148,7 @@ bool CaeServer::ProcessCommand(const QHostAddress &src_addr,uint16_t src_port,
int channels;
int bitrate;
int interval;
int volume;
SessionId origin(src_addr,src_port);
//
@ -186,7 +187,7 @@ bool CaeServer::ProcessCommand(const QHostAddress &src_addr,uint16_t src_port,
//
// Playback Operations
//
if((f0.at(0)=="PY")&&(f0.size()==8)) { // Start Playback
if((f0.at(0)=="PY")&&(f0.size()==9)) { // Start Playback
serial=f0.at(1).toUInt(&ok);
if(ok) {
origin.setSerialNumber(serial);
@ -202,9 +203,12 @@ bool CaeServer::ProcessCommand(const QHostAddress &src_addr,uint16_t src_port,
if(ok&&(end_pos>=0)&&(end_pos>=start_pos)) {
speed=f0.at(7).toInt(&ok);
if(ok&&(speed>0)) {
emit startPlaybackReq(origin,cutname,cardnum,portnum,
start_pos,end_pos,speed);
was_processed=true;
volume=f0.at(8).toInt(&ok);
if(ok) {
emit startPlaybackReq(origin,cutname,cardnum,portnum,
start_pos,end_pos,speed,volume);
was_processed=true;
}
}
}
}

View File

@ -55,7 +55,7 @@ class CaeServer : public QObject
void connectionClosed(const SessionId &sid);
void startPlaybackReq(const SessionId &sid,const QString &cutname,
unsigned cardnum,unsigned portnum,
int start_pos,int end_pos,int speed);
int start_pos,int end_pos,int speed,int volume);
void playPositionReq(const SessionId &sid,int position);
void playPauseReq(const SessionId &sid);
void playResumeReq(const SessionId &sid);

View File

@ -211,6 +211,7 @@
<replaceable>start-pos</replaceable>
<replaceable>end-pos</replaceable>
<replaceable>speed</replaceable>
<replaceable>volume</replaceable>
</userinput>
</para>
<variablelist>
@ -276,6 +277,15 @@
indicating 100%.
</listitem>
</varlistentry>
<varlistentry>
<term>
<replaceable>volume</replaceable>
</term>
<listitem>
The audio level of the play-out, relative to the reference
level (-16 dBFS), in hundredths of a dB.
</listitem>
</varlistentry>
</variablelist>
</sect3>

View File

@ -200,14 +200,15 @@ void RDCae::enableMetering(QList<int> *cards)
int RDCae::startPlayback(const QString &cutname,int cardnum,int portnum,
int start_pos,int end_pos,int speed)
int start_pos,int end_pos,int speed,int volume)
{
int serial=cae_next_serial_number++;
cae_stream_output_levels[serial]=new __RDCaeMeterPoint();
SendCommand(QString::asprintf("PY %d %s %d %d %d %d %d",
SendCommand(QString::asprintf("PY %d %s %d %d %d %d %d %d",
serial,cutname.toUtf8().constData(),
cardnum,portnum,start_pos,end_pos,100000));
cardnum,portnum,start_pos,end_pos,
speed,volume));
emit playStarted(serial);
return serial;
@ -361,11 +362,17 @@ void RDCae::stopRecord(int card,int stream)
SendCommand(QString::asprintf("SR %d %d",card,stream));
}
/*
void RDCae::setOutputVolume(int card,int stream,int port,int level)
{
SendCommand(QString::asprintf("OV %d %d %d %d",card,stream,port,level));
}
*/
void RDCae::setOutputVolume(int serial,int level)
{
SendCommand(QString::asprintf("OV %d %d",serial,level));
}
void RDCae::setOutputPort(int card,int stream,int port)
@ -373,12 +380,18 @@ void RDCae::setOutputPort(int card,int stream,int port)
SendCommand(QString::asprintf("OP %d %d %d 0",card,stream,port));
}
/*
void RDCae::fadeOutputVolume(int card,int stream,int port,int level,int length)
{
SendCommand(QString::asprintf("FV %d %d %d %d %d",
card,stream,port,level,length));
}
*/
void RDCae::fadeOutputVolume(int serial,int level,int length)
{
SendCommand(QString::asprintf("FV %d %d %d",serial,level,length));
}
void RDCae::setPassthroughVolume(int card,int in_port,int out_port,int level)

View File

@ -54,7 +54,7 @@ class RDCae : public QObject
void connectToHost(int timeout_msecs=-1);
void enableMetering(QList<int> *cards);
int startPlayback(const QString &cutname,int cardnum,int portnum,
int start_pos,int end_pos,int speed);
int start_pos,int end_pos,int speed,int volume);
void positionPlay(int serial,int pos);
void pausePlayback(int serial);
void resumePlayback(int serial);
@ -72,9 +72,11 @@ class RDCae : public QObject
void unloadRecord(int card,int stream);
void record(int card,int stream,unsigned length,int threshold);
void stopRecord(int card,int stream);
void setOutputVolume(int card,int stream,int port,int level);
// void setOutputVolume(int card,int stream,int port,int level);
void setOutputVolume(int serial,int level);
void setOutputPort(int card,int stream,int port);
void fadeOutputVolume(int card,int stream,int port,int level,int length);
// void fadeOutputVolume(int card,int stream,int port,int level,int length);
void fadeOutputVolume(int serial,int level,int length);
void setPassthroughVolume(int card,int in_port,int out_port,int level);
bool inputStatus(int card,int port) const;
void inputMeterUpdate(int card,int port,short levels[2]);

View File

@ -393,7 +393,8 @@ void RDMarkerPlayer::buttonPlayData()
d_cae_serial=rda->cae()->
startPlayback(RDCut::cutName(d_cart_number,d_cut_number),
d_cards.first(),d_port,
d_cursor_position,d_cut_length,RD_TIMESCALE_DIVISOR);
d_cursor_position,d_cut_length,RD_TIMESCALE_DIVISOR,
100*d_play_gain_spin->value());
Play();
rda->cae()->setPlayPortActive(d_cards.first(),d_port,d_cae_stream);
// FIXME: Implement variable gain here!
@ -412,10 +413,9 @@ void RDMarkerPlayer::buttonPlayFromData()
startPlayback(RDCut::cutName(d_cart_number,d_cut_number),
d_cards.first(),d_port,
d_loop_start_msec,d_cut_length,
RD_TIMESCALE_DIVISOR);
RD_TIMESCALE_DIVISOR,100*d_play_gain_spin->value());
Play();
rda->cae()->setPlayPortActive(d_cards.first(),d_port,d_cae_stream);
// FIXME: Implement variable gain here!
}
}
@ -436,11 +436,10 @@ void RDMarkerPlayer::buttonPlayToData()
startPlayback(RDCut::cutName(d_cart_number,d_cut_number),
d_cards.first(),d_port,
d_loop_start_msec,d_loop_start_msec+d_loop_start_length,
RD_TIMESCALE_DIVISOR);
RD_TIMESCALE_DIVISOR,100*d_play_gain_spin->value());
d_stop_timer->start(d_loop_start_length);
Play();
rda->cae()->setPlayPortActive(d_cards.first(),d_port,d_cae_stream);
// FIXME: Implement variable gain here!
}
}

View File

@ -443,6 +443,10 @@ void RDPlayDeck::play(unsigned pos,int segue_start,int segue_end,
int duck_up_end)
{
int fadeup;
int start_volume=RD_MUTE_DEPTH;
int fade_volume=RD_MUTE_DEPTH;
int fade_length=0;
play_hook_mode=false;
play_cut_gain=play_cut->playGain();
@ -482,41 +486,53 @@ void RDPlayDeck::play(unsigned pos,int segue_start,int segue_end,
(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);
//play_cae->setOutputVolume(play_card,play_stream,play_port,
// play_ducked+play_cut_gain+play_duck_level);
start_volume=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);
fade_volume=play_ducked+play_cut_gain+play_duck_level;
fade_length=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);
//play_cae->
// setOutputVolume(play_card,play_stream,play_port,
// level+play_cut_gain+play_duck_level);
start_volume=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);
fade_volume=play_duck_level;
fade_length=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);
//play_cae->
//setOutputVolume(play_card,play_stream,play_port,
// play_ducked+play_cut_gain+play_duck_level);
start_volume=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);
fade_volume=play_ducked+play_cut_gain+play_duck_level;
fade_length=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->
// setOutputVolume(play_card,play_stream,play_port,
// level+play_cut_gain+play_duck_level);
start_volume=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);
fade_volume=play_ducked+play_cut_gain+play_duck_level;
fade_length=fadeup;
}
}
/*
@ -532,7 +548,9 @@ void RDPlayDeck::play(unsigned pos,int segue_start,int segue_end,
play_audio_point[1],play_timescale_speed);
play_serial=play_cae->startPlayback(play_cut->cutName(),play_card,play_port,
play_audio_point[0]+pos,
play_audio_point[1],play_timescale_speed);
play_audio_point[1],play_timescale_speed,
start_volume);
play_cae->fadeOutputVolume(play_serial,fade_volume,fade_length);
play_start_time=QTime::currentTime();
StartTimers(pos);
play_state=RDPlayDeck::Playing;
@ -599,8 +617,11 @@ void RDPlayDeck::stop(int interval,int gain)
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_cae->fadeOutputVolume(play_card,play_stream,play_port,
// play_duck_gain[1]+play_cut_gain+play_duck_level,play_duck_down);
play_cae->
fadeOutputVolume(play_serial,
play_duck_gain[1]+play_cut_gain+play_duck_level,play_duck_down);
play_duck_timer->start(play_duck_down);
play_duck_down_state=true;
play_segue_interval=interval;
@ -608,8 +629,11 @@ void RDPlayDeck::stop(int interval,int gain)
}
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_cae->fadeOutputVolume(play_card,play_stream,play_port,
// play_point_gain+play_cut_gain+play_duck_level,interval);
play_cae->
fadeOutputVolume(play_serial,
play_point_gain+play_cut_gain+play_duck_level,interval);
}
}
play_stop_timer->start(interval);
@ -624,8 +648,11 @@ void RDPlayDeck::stop(int interval,int gain)
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_cae->fadeOutputVolume(play_card,play_stream,play_port,
// play_duck_gain[1]+play_cut_gain+play_duck_level,play_duck_down);
play_cae->
fadeOutputVolume(play_serial,
play_duck_gain[1]+play_cut_gain+play_duck_level,play_duck_down);
play_duck_timer->start(play_duck_down);
play_duck_down_state=true;
play_segue_interval=interval;
@ -638,8 +665,8 @@ 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);
//play_cae->fadeOutputVolume(play_card,play_stream,play_port,play_cut_gain+play_duck_level,fade);
play_cae->fadeOutputVolume(play_serial,play_cut_gain+play_duck_level,fade);
}
}
@ -748,9 +775,12 @@ void RDPlayDeck::positionTimerData()
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_cae->
// fadeOutputVolume(play_card,play_stream,play_port,play_fade_gain[1]+play_cut_gain+play_duck_level,play_fade_down);
play_cae->
fadeOutputVolume(play_serial,
play_fade_gain[1]+play_cut_gain+play_duck_level,
play_fade_down);
}
play_fade_down_state=true;
}
@ -759,23 +789,32 @@ void RDPlayDeck::fadeTimerData()
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_cae->
// fadeOutputVolume(play_card,play_stream,play_port,0+play_cut_gain+play_duck_level,play_duck_up);
play_cae->fadeOutputVolume(play_serial,
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);
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);
play_cae->fadeOutputVolume(play_serial,
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_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_cae->
fadeOutputVolume(play_serial,
play_fade_gain[1]+play_cut_gain+play_duck_level,
play_segue_interval-play_duck_down);
}
}
play_duck_down_state=false;
}

View File

@ -162,14 +162,11 @@ void RDSimplePlayer::play(int start_pos)
q->value(1).toUInt()-(q->value(0).toUInt()+start_pos),
RD_TIMESCALE_DIVISOR,false);
*/
//
// FIXME: implement cut gain!
// play_cut_gain=q->value(2).toInt();
play_serial=
play_cae->startPlayback(play_cut,play_card,play_port,
q->value(0).toInt()+start_pos,
q->value(1).toInt(),
RD_TIMESCALE_DIVISOR);
RD_TIMESCALE_DIVISOR,q->value(2).toInt());
// play_cae->setPlayPortActive(play_card,play_port,play_stream);
if(play_serial>0) {
play_event_player->exec(play_start_cart);

View File

@ -723,7 +723,7 @@ void MainWidget::headButtonData()
catch_audition_card,catch_audition_port,
cut->startPoint(),
cut->startPoint()+RDCATCH_AUDITION_LENGTH,
RD_TIMESCALE_DIVISOR);
RD_TIMESCALE_DIVISOR,cut->playGain());
catch_stop_timer->start(RDCATCH_AUDITION_LENGTH);
head_playing=true;
delete cut;
@ -759,7 +759,7 @@ void MainWidget::tailButtonData()
rda->cae()->startPlayback(cut->cutName(),
catch_audition_card,catch_audition_port,
start_pos,cut->endPoint(),
RD_TIMESCALE_DIVISOR);
RD_TIMESCALE_DIVISOR,cut->playGain());
catch_stop_timer->start(RDCATCH_AUDITION_LENGTH);
tail_playing=true;
delete cut;

View File

@ -90,6 +90,18 @@ void CatchEvent::setCutName(const QString &str)
}
int CatchEvent::cutPlayGain() const
{
return catch_cut_play_gain;
}
void CatchEvent::setCutPlayGain(int gain)
{
catch_cut_play_gain=gain;
}
QString CatchEvent::tempName() const
{
return catch_temp_name;
@ -686,6 +698,7 @@ void CatchEvent::clear()
catch_type=RDRecording::Recording;
catch_channel=0;
catch_cut_name="";
catch_cut_play_gain=0;
catch_temp_name="";
catch_delete_temp_file=false;
for(int i=0;i<7;i++) {

View File

@ -43,6 +43,8 @@ class CatchEvent
void setChannel(unsigned chan);
QString cutName() const;
void setCutName(const QString &str);
int cutPlayGain() const;
void setCutPlayGain(int gain);
QString tempName() const;
void setTempName(const QString &str);
bool deleteTempFile() const;
@ -148,6 +150,7 @@ class CatchEvent
RDRecording::Type catch_type;
unsigned catch_channel;
QString catch_cut_name;
int catch_cut_play_gain;
QString catch_temp_name;
bool catch_delete_temp_file;
bool catch_day_of_week[7];

View File

@ -1321,7 +1321,8 @@ void MainObject::StartPlayout(int event)
catch_playout_port[deck-129],
start,
end, // FIXME: this parameter does nothing!
RD_TIMESCALE_DIVISOR);
RD_TIMESCALE_DIVISOR,
catch_events[event].cutPlayGain());
rda->cae()->setPlayPortActive(catch_playout_card[deck-129],
catch_playout_port[deck-129],
catch_playout_stream[deck-129]);
@ -1551,6 +1552,7 @@ void MainObject::LoadEngine(bool adv_day)
rda->syslog(LOG_DEBUG,"rdcatchd engine load starts...");
sql=LoadEventSql()+QString(" where `STATION_NAME`='")+
RDEscapeString(rda->station()->name())+"'";
rda->syslog(LOG_NOTICE,"%s",sql.toUtf8().constData());
q=new RDSqlQuery(sql);
while(q->next()) {
catch_events.push_back(CatchEvent(rda->station(),RDConfiguration()));
@ -1565,56 +1567,58 @@ void MainObject::LoadEngine(bool adv_day)
QString MainObject::LoadEventSql()
{
return QString("select ")+
"`ID`,"+ // 00
"`IS_ACTIVE`,"+ // 01
"`TYPE`,"+ // 02
"`CHANNEL`,"+ // 03
"`CUT_NAME`,"+ // 04
"`SUN`,"+ // 05
"`MON`,"+ // 06
"`TUE`,"+ // 07
"`WED`,"+ // 08
"`THU`,"+ // 09
"`FRI`,"+ // 10
"`SAT`,"+ // 11
"`START_TIME`,"+ // 12
"`LENGTH`,"+ // 13
"`START_GPI`,"+ // 14
"`END_GPI`,"+ // 15
"`TRIM_THRESHOLD`,"+ // 16
"`STARTDATE_OFFSET`,"+ // 17
"`ENDDATE_OFFSET`,"+ // 18
"`FORMAT`," // 19
"`CHANNELS`,"+ // 20
"`SAMPRATE`,"+ // 21
"`BITRATE`,"+ // 22
"`MACRO_CART`,"+ // 23
"`SWITCH_INPUT`,"+ // 24
"`SWITCH_OUTPUT`,"+ // 25
"`ONE_SHOT`,"+ // 26
"`START_TYPE`,"+ // 27
"`START_LENGTH`,"+ // 28
"`START_MATRIX`,"+ // 29
"`START_LINE`,"+ // 30
"`START_OFFSET`,"+ // 31
"`END_TYPE`,"+ // 32
"`END_TIME`,"+ // 33
"`END_LENGTH`,"+ // 34
"`END_MATRIX`,"+ // 35
"`END_LINE`,"+ // 36
"`URL`,"+ // 37
"`URL_USERNAME`,"+ // 38
"`URL_PASSWORD`,"+ // 39
"`URL_USE_ID_FILE`,"+ // 40
"`QUALITY`,"+ // 40
"`NORMALIZE_LEVEL`,"+ // 41
"`ALLOW_MULT_RECS`,"+ // 42
"`MAX_GPI_REC_LENGTH`,"+ // 43
"`DESCRIPTION`,"+ // 44
"`FEED_ID`,"+ // 45
"`EVENTDATE_OFFSET`,"+ // 46
"`ENABLE_METADATA` "+ // 47
"from `RECORDINGS`";
"`RECORDINGS`.`ID`,"+ // 00
"`RECORDINGS`.`IS_ACTIVE`,"+ // 01
"`RECORDINGS`.`TYPE`,"+ // 02
"`RECORDINGS`.`CHANNEL`,"+ // 03
"`RECORDINGS`.`CUT_NAME`,"+ // 04
"`RECORDINGS`.`SUN`,"+ // 05
"`RECORDINGS`.`MON`,"+ // 06
"`RECORDINGS`.`TUE`,"+ // 07
"`RECORDINGS`.`WED`,"+ // 08
"`RECORDINGS`.`THU`,"+ // 09
"`RECORDINGS`.`FRI`,"+ // 10
"`RECORDINGS`.`SAT`,"+ // 11
"`RECORDINGS`.`START_TIME`,"+ // 12
"`RECORDINGS`.`LENGTH`,"+ // 13
"`RECORDINGS`.`START_GPI`,"+ // 14
"`RECORDINGS`.`END_GPI`,"+ // 15
"`RECORDINGS`.`TRIM_THRESHOLD`,"+ // 16
"`RECORDINGS`.`STARTDATE_OFFSET`,"+ // 17
"`RECORDINGS`.`ENDDATE_OFFSET`,"+ // 18
"`RECORDINGS`.`FORMAT`," // 19
"`RECORDINGS`.`CHANNELS`,"+ // 20
"`RECORDINGS`.`SAMPRATE`,"+ // 21
"`RECORDINGS`.`BITRATE`,"+ // 22
"`RECORDINGS`.`MACRO_CART`,"+ // 23
"`RECORDINGS`.`SWITCH_INPUT`,"+ // 24
"`RECORDINGS`.`SWITCH_OUTPUT`,"+ // 25
"`RECORDINGS`.`ONE_SHOT`,"+ // 26
"`RECORDINGS`.`START_TYPE`,"+ // 27
"`RECORDINGS`.`START_LENGTH`,"+ // 28
"`RECORDINGS`.`START_MATRIX`,"+ // 29
"`RECORDINGS`.`START_LINE`,"+ // 30
"`RECORDINGS`.`START_OFFSET`,"+ // 31
"`RECORDINGS`.`END_TYPE`,"+ // 32
"`RECORDINGS`.`END_TIME`,"+ // 33
"`RECORDINGS`.`END_LENGTH`,"+ // 34
"`RECORDINGS`.`END_MATRIX`,"+ // 35
"`RECORDINGS`.`END_LINE`,"+ // 36
"`RECORDINGS`.`URL`,"+ // 37
"`RECORDINGS`.`URL_USERNAME`,"+ // 38
"`RECORDINGS`.`URL_PASSWORD`,"+ // 39
"`RECORDINGS`.`URL_USE_ID_FILE`,"+ // 40
"`RECORDINGS`.`QUALITY`,"+ // 41
"`RECORDINGS`.`NORMALIZE_LEVEL`,"+ // 42
"`RECORDINGS`.`ALLOW_MULT_RECS`,"+ // 43
"`RECORDINGS`.`MAX_GPI_REC_LENGTH`,"+ // 44
"`RECORDINGS`.`DESCRIPTION`,"+ // 45
"`RECORDINGS`.`FEED_ID`,"+ // 46
"`RECORDINGS`.`EVENTDATE_OFFSET`,"+ // 47
"`RECORDINGS`.`ENABLE_METADATA`,"+ // 48
"`CUTS`.`PLAY_GAIN` "+ // 49
"from `RECORDINGS` left join `CUTS` "+
"on `RECORDINGS`.`CUT_NAME`=`CUTS`.`CUT_NAME` ";
}
@ -1670,6 +1674,7 @@ void MainObject::LoadEvent(RDSqlQuery *q,CatchEvent *e,bool add)
e->setDescription(q->value(45).toString());
e->setEventdateOffset(q->value(47).toInt());
e->setEnableMetadata(RDBool(q->value(48).toString()));
e->setCutPlayGain(q->value(49).toInt());
if(add) {
if(e->startType()==RDRecording::GpiStart) {

View File

@ -654,7 +654,8 @@ void RecordCut::playData()
rec_play_serial=
rda->cae()->startPlayback(rec_cut->cutName(),
rec_card_no[1],rec_port_no[1],
start,end,RD_TIMESCALE_DIVISOR);
start,end,RD_TIMESCALE_DIVISOR,
rec_cut->playGain());
// rda->cae()->setPlayPortActive(rec_card_no[1],rec_port_no[1],rec_stream_no[1]);
}
if(is_ready&&(!is_recording)) {