2021-03-19 Fred Gleason <fredg@paravelsystems.com>

* Added 'RDMarkerPlayer'.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2021-03-19 13:47:44 -04:00
parent 3254182e3a
commit 01e3412b01
18 changed files with 583 additions and 150 deletions

View File

@ -21284,3 +21284,7 @@
in 'RDMarkerView'.
2021-03-18 Fred Gleason <fredg@paravelsystems.com>
* Enabled marker swiping in 'RDMarkerView'.
2021-03-18 Fred Gleason <fredg@paravelsystems.com>
* Fixed bugs with detecting unsaved changes in 'RDMarkerView'.
2021-03-19 Fred Gleason <fredg@paravelsystems.com>
* Added 'RDMarkerPlayer'.

View File

@ -191,6 +191,7 @@ dist_librd_la_SOURCES = dbversion.h\
rdmarker_button.cpp rdmarker_button.h\
rdmarker_edit.cpp rdmarker_edit.h\
rdmarkerdialog.cpp rdmarkerdialog.h\
rdmarkerplayer.cpp rdmarkerplayer.h\
rdmarkerreadout.cpp rdmarkerreadout.h\
rdmarkerview.cpp rdmarkerview.h\
rdmatrix.cpp rdmatrix.h\
@ -372,6 +373,7 @@ nodist_librd_la_SOURCES = moc_rdadd_cart.cpp\
moc_rdmarker_bar.cpp\
moc_rdmarker_edit.cpp\
moc_rdmarkerdialog.cpp\
moc_rdmarkerplayer.cpp\
moc_rdmarkerreadout.cpp\
moc_rdmarkerview.cpp\
moc_rdmatrixlistmodel.cpp\

View File

@ -144,6 +144,7 @@ SOURCES += rdmacrocartmodel.cpp
SOURCES += rdmarker_button.cpp
SOURCES += rdmarker_edit.cpp
SOURCES += rdmarkerdialog.cpp
SOURCES += rdmarkerplayer.cpp
SOURCES += rdmarkerreadout.cpp
SOURCES += rdmarkerview.cpp
SOURCES += rdmatrix.cpp
@ -325,6 +326,7 @@ HEADERS += rdmacrocartmodel.h
HEADERS += rdmarker_button.h
HEADERS += rdmarker_edit.h
HEADERS += rdmarkerdialog.h
HEADERS += rdmarkerplayer.h
HEADERS += rdmarkerreadout.h
HEADERS += rdmarkerview.h
HEADERS += rdmatrix.h

View File

@ -3578,11 +3578,11 @@ Out</translation>
</message>
<message>
<source>Position</source>
<translation type="unfinished">Poloha</translation>
<translation type="obsolete">Poloha</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Délka</translation>
<translation type="obsolete">Délka</translation>
</message>
<message>
<source>Unsaved Changes</source>
@ -3596,6 +3596,21 @@ Out</translation>
<source>Do you want to save them?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to open cut in audio player!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDMarkerPlayer</name>
<message>
<source>Position</source>
<translation type="unfinished">Poloha</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Délka</translation>
</message>
</context>
<context>
<name>RDMarkerView</name>

View File

@ -3567,11 +3567,11 @@ Out</translation>
</message>
<message>
<source>Position</source>
<translation type="unfinished">Position</translation>
<translation type="obsolete">Position</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Länge</translation>
<translation type="obsolete">Länge</translation>
</message>
<message>
<source>Unsaved Changes</source>
@ -3585,6 +3585,21 @@ Out</translation>
<source>Do you want to save them?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to open cut in audio player!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDMarkerPlayer</name>
<message>
<source>Position</source>
<translation type="unfinished">Position</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Länge</translation>
</message>
</context>
<context>
<name>RDMarkerView</name>

View File

@ -3554,11 +3554,11 @@ Todo</translation>
</message>
<message>
<source>Position</source>
<translation type="unfinished">Posición</translation>
<translation type="obsolete">Posición</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Longitud</translation>
<translation type="obsolete">Longitud</translation>
</message>
<message>
<source>Unsaved Changes</source>
@ -3572,6 +3572,21 @@ Todo</translation>
<source>Do you want to save them?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to open cut in audio player!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDMarkerPlayer</name>
<message>
<source>Position</source>
<translation type="unfinished">Posición</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Longitud</translation>
</message>
</context>
<context>
<name>RDMarkerView</name>

View File

@ -2970,14 +2970,6 @@ Out</source>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Position</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unsaved Changes</source>
<translation type="unfinished"></translation>
@ -2990,6 +2982,21 @@ Out</source>
<source>Do you want to save them?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to open cut in audio player!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDMarkerPlayer</name>
<message>
<source>Position</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDMarkerView</name>

View File

@ -3517,11 +3517,11 @@ ut</translation>
</message>
<message>
<source>Position</source>
<translation type="unfinished">Posisjon</translation>
<translation type="obsolete">Posisjon</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Lengd</translation>
<translation type="obsolete">Lengd</translation>
</message>
<message>
<source>Unsaved Changes</source>
@ -3535,6 +3535,21 @@ ut</translation>
<source>Do you want to save them?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to open cut in audio player!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDMarkerPlayer</name>
<message>
<source>Position</source>
<translation type="unfinished">Posisjon</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Lengd</translation>
</message>
</context>
<context>
<name>RDMarkerView</name>

View File

@ -3517,11 +3517,11 @@ ut</translation>
</message>
<message>
<source>Position</source>
<translation type="unfinished">Posisjon</translation>
<translation type="obsolete">Posisjon</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Lengd</translation>
<translation type="obsolete">Lengd</translation>
</message>
<message>
<source>Unsaved Changes</source>
@ -3535,6 +3535,21 @@ ut</translation>
<source>Do you want to save them?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to open cut in audio player!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDMarkerPlayer</name>
<message>
<source>Position</source>
<translation type="unfinished">Posisjon</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Lengd</translation>
</message>
</context>
<context>
<name>RDMarkerView</name>

View File

@ -3557,11 +3557,11 @@ Mínimo</translation>
</message>
<message>
<source>Position</source>
<translation type="unfinished">Posição</translation>
<translation type="obsolete">Posição</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Duração</translation>
<translation type="obsolete">Duração</translation>
</message>
<message>
<source>Unsaved Changes</source>
@ -3575,6 +3575,21 @@ Mínimo</translation>
<source>Do you want to save them?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to open cut in audio player!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDMarkerPlayer</name>
<message>
<source>Position</source>
<translation type="unfinished">Posição</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Duração</translation>
</message>
</context>
<context>
<name>RDMarkerView</name>

View File

@ -194,12 +194,12 @@ void RDCae::unloadPlay(int handle)
}
void RDCae::positionPlay(int handle,int pos)
void RDCae::positionPlay(int handle,int msec)
{
if(pos<0) {
if(msec<0) {
return;
}
SendCommand(QString().sprintf("PP %d %u!",handle,pos));
SendCommand(QString().sprintf("PP %d %u!",handle,msec));
}

View File

@ -44,7 +44,7 @@ class RDCae : public QObject
void enableMetering(QList<int> *cards);
bool loadPlay(int card,QString name,int *stream,int *handle);
void unloadPlay(int handle);
void positionPlay(int handle,int pos);
void positionPlay(int handle,int msec);
void play(int handle,unsigned length,int speed,bool pitch);
void stopPlay(int handle);
void loadRecord(int card,int stream,QString name,AudioCoding coding,
@ -75,7 +75,7 @@ class RDCae : public QObject
signals:
void isConnected(bool state);
void playLoaded(int handle);
void playPositioned(int handle,unsigned pos);
void playPositioned(int handle,unsigned msec);
void playing(int handle);
void playStopped(int handle);
void playUnloaded(int handle);

View File

@ -75,80 +75,12 @@ RDMarkerDialog::RDMarkerDialog(const QString &caption,int card,int port,
/**************************************************************************
* Transport Section
**************************************************************************/
//
// Time Counters
//
d_overall_label=new QLabel(tr("Position"),this);
d_overall_label->setFont(subLabelFont());
d_overall_label->setAlignment(Qt::AlignHCenter);
d_overall_label->
setPalette(QPalette(palette().color(QPalette::Background),
QColor(RDMARKERDIALOG_HIGHLIGHT_COLOR)));
d_overall_edit=new QLineEdit(this);
d_overall_edit->setAcceptDrops(false);
d_overall_edit->setReadOnly(true);
d_region_edit_label=new QLabel("Region",this);
d_region_edit_label->setFont(subLabelFont());
d_region_edit_label->setAlignment(Qt::AlignHCenter);
d_region_edit_label->
setPalette(QPalette(palette().color(QPalette::Background),QColor(RDMARKERDIALOG_HIGHLIGHT_COLOR)));
d_region_edit=new QLineEdit(this);
d_region_edit->setAcceptDrops(false);
d_region_edit->setReadOnly(true);
d_size_label=new QLabel(tr("Length"),this);
d_size_label->setFont(subLabelFont());
d_size_label->setAlignment(Qt::AlignHCenter);
d_size_label->
setPalette(QPalette(palette().color(QPalette::Background),QColor(RDMARKERDIALOG_HIGHLIGHT_COLOR)));
d_size_edit=new QLineEdit(this);
d_size_edit->setAcceptDrops(false);
d_size_edit->setReadOnly(true);
//
// Transport Buttons
//
d_play_cursor_button=
new RDTransportButton(RDTransportButton::PlayBetween,this);
d_play_cursor_button->setFocusPolicy(Qt::NoFocus);
// d_play_cursor_button->setEnabled((d_card>=0)&&(d_port>=0));
// connect(d_play_cursor_button,SIGNAL(clicked()),
// this,SLOT(playCursorData()));
d_play_start_button=
new RDTransportButton(RDTransportButton::Play,this);
d_play_start_button->setFocusPolicy(Qt::NoFocus);
// d_play_start_button->setEnabled((d_card>=0)&&(d_port>=0));
// connect(d_play_start_button,SIGNAL(clicked()),
// this,SLOT(playStartData()));
d_pause_button=new RDTransportButton(RDTransportButton::Pause,this);
d_pause_button->setFocusPolicy(Qt::NoFocus);
d_pause_button->setOnColor(QColor(Qt::red));
// d_pause_button->setEnabled((d_card>=0)&&(d_port>=0));
// connect(d_pause_button,SIGNAL(clicked()),this,SLOT(pauseData()));
d_stop_button=new RDTransportButton(RDTransportButton::Stop,this);
d_stop_button->setFocusPolicy(Qt::NoFocus);
d_stop_button->on();
d_stop_button->setOnColor(QColor(Qt::red));
// d_stop_button->setEnabled((d_card>=0)&&(d_port>=0));
// connect(d_stop_button,SIGNAL(clicked()),this,SLOT(stopData()));
d_loop_button=new RDTransportButton(RDTransportButton::Loop,this);
d_loop_button->off();
// d_loop_button->setEnabled((d_card>=0)&&(d_port>=0));
// connect(d_loop_button,SIGNAL(clicked()),this,SLOT(loopData()));
//
// The Audio Meter
//
d_meter=new RDStereoMeter(this);
d_meter->setSegmentSize(5);
d_meter->setMode(RDSegMeter::Peak);
// d_meter_timer=new QTimer(this);
// connect(d_meter_timer,SIGNAL(timeout()),this,SLOT(meterData()));
d_player=new RDMarkerPlayer(card,port,this);
connect(d_player,SIGNAL(cursorPositionChanged(unsigned)),
d_marker_view,SLOT(setCursorPosition(unsigned)));
connect(d_marker_view,
SIGNAL(pointerValueChanged(RDMarkerHandle::PointerRole,int)),
d_player,SLOT(setPointerValue(RDMarkerHandle::PointerRole,int)));
//
// Marker Readouts
@ -205,6 +137,8 @@ RDMarkerDialog::RDMarkerDialog(const QString &caption,int card,int port,
RDMarkerDialog::~RDMarkerDialog()
{
delete d_player;
delete d_marker_view;
}
@ -227,6 +161,11 @@ int RDMarkerDialog::exec(unsigned cartnum,int cutnum)
QMessageBox::critical(this,d_caption+" - "+tr("Error"),err_msg);
return false;
}
if(!d_player->setCut(cartnum,cutnum)) {
QMessageBox::critical(this,d_caption+" - "+tr("Error"),
tr("Unable to open cut in audio player!"));
return false;
}
for(int i=0;i<RDMarkerHandle::LastRole;i++) {
RDMarkerHandle::PointerRole role=(RDMarkerHandle::PointerRole)i;
d_cut_readout->setValue(role,d_marker_view->pointerValue(role));
@ -235,6 +174,7 @@ int RDMarkerDialog::exec(unsigned cartnum,int cutnum)
d_hook_readout->setValue(role,d_marker_view->pointerValue(role));
d_fadeup_readout->setValue(role,d_marker_view->pointerValue(role));
d_fadedown_readout->setValue(role,d_marker_view->pointerValue(role));
d_player->setPointerValue(role,d_marker_view->pointerValue(role));
}
return QDialog::exec();
}
@ -276,6 +216,7 @@ void RDMarkerDialog::timeOutData()
void RDMarkerDialog::okData()
{
d_marker_view->save();
d_player->clearCut();
done(true);
}
@ -293,6 +234,7 @@ void RDMarkerDialog::cancelData()
break;
case QMessageBox::No:
d_player->clearCut();
done(false);
break;
@ -300,6 +242,7 @@ void RDMarkerDialog::cancelData()
return;
}
}
d_player->clearCut();
done(false);
}
@ -331,9 +274,6 @@ void RDMarkerDialog::resizeEvent(QResizeEvent *e)
d_time_out_button->setGeometry(5,124,80,50);
d_time_fullout_button->setGeometry(5,174,80,50);
d_meter->setGeometry(380,398,
d_meter->sizeHint().width(),d_meter->sizeHint().height());
//
// Readout Section
//
@ -371,35 +311,10 @@ void RDMarkerDialog::resizeEvent(QResizeEvent *e)
//
// Transport Section
//
d_overall_label->setGeometry(60,385,70,20);
d_overall_edit->setGeometry(60,400,70,21);
d_region_edit_label->setGeometry(158,385,70,20);
d_region_edit->setGeometry(158,400,70,21);
d_size_label->setGeometry(256,385,70,20);
d_size_edit->setGeometry(256,400,70,21);
d_play_cursor_button->setGeometry(20,425,65,45);
d_play_start_button->setGeometry(90,425,65,45);
d_pause_button->setGeometry(160,425,65,45);
d_stop_button->setGeometry(230,425,65,45);
d_loop_button->setGeometry(300,425,65,45);
d_player->setGeometry(2,2+d_marker_view->sizeHint().height(),
d_player->sizeHint().width(),
d_player->sizeHint().height());
d_ok_button->setGeometry(w-180,h-60,80,50);
d_cancel_button->setGeometry(w-90,h-60,80,50);
}
void RDMarkerDialog::paintEvent(QPaintEvent *e)
{
QPainter *p=new QPainter(this);
//
// Transport Control Area
//
p->setPen(QColor(palette().shadow().color()));
p->fillRect(11,30+RDMARKERDIALOG_WAVEFORM_HEIGHT,RDMARKERDIALOG_WAVEFORM_WIDTH,92,
QColor(RDMARKERDIALOG_HIGHLIGHT_COLOR));
p->drawRect(11,30+RDMARKERDIALOG_WAVEFORM_HEIGHT,RDMARKERDIALOG_WAVEFORM_WIDTH,92);
delete p;
}

View File

@ -28,6 +28,7 @@
#include <QTimer>
#include <rddialog.h>
#include <rdmarkerplayer.h>
#include <rdmarkerreadout.h>
#include <rdmarkerview.h>
#include <rdstereometer.h>
@ -80,7 +81,6 @@ class RDMarkerDialog : public RDDialog
protected:
void closeEvent(QCloseEvent *e);
void resizeEvent(QResizeEvent *e);
void paintEvent(QPaintEvent *e);
private:
RDMarkerView *d_marker_view;
@ -95,19 +95,7 @@ class RDMarkerDialog : public RDDialog
RDTransportButton *d_time_out_button;
QPushButton *d_time_fullout_button;
// QGroupBox *d_transport_group;
QLabel *d_overall_label;
QLineEdit *d_overall_edit;
QLabel *d_region_edit_label;
QLineEdit *d_region_edit;
QLabel *d_size_label;
QLineEdit *d_size_edit;
RDTransportButton *d_loop_button;
RDTransportButton *d_play_start_button;
RDTransportButton *d_play_cursor_button;
RDTransportButton *d_pause_button;
RDTransportButton *d_stop_button;
RDStereoMeter *d_meter;
RDMarkerPlayer *d_player;
RDMarkerReadout *d_cut_readout;
RDMarkerReadout *d_fadeup_readout;

303
lib/rdmarkerplayer.cpp Normal file
View File

@ -0,0 +1,303 @@
// rdmarkerplayer.cpp
//
// Audio player for RDMarkerDialog
//
// (C) Copyright 2021 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 "rdmixer.h"
#include "rdmarkerplayer.h"
RDMarkerPlayer::RDMarkerPlayer(int card,int port,QWidget *parent)
: RDWidget(parent)
{
d_cards.push_back(card);
d_port=port;
d_cae_stream=-1;
d_cae_handle=-1;
d_is_playing=false;
//
// CAE
//
rda->cae()->enableMetering(&d_cards);
connect(rda->cae(),SIGNAL(playing(int)),this,SLOT(caePlayedData(int)));
connect(rda->cae(),SIGNAL(playStopped(int)),this,SLOT(caePausedData(int)));
connect(rda->cae(),SIGNAL(playPositionChanged(int,unsigned)),
this,SLOT(caePositionData(int,unsigned)));
//
// Time Counters
//
d_overall_label=new QLabel(tr("Position"),this);
d_overall_label->setFont(subLabelFont());
d_overall_label->setAlignment(Qt::AlignHCenter);
d_overall_label->
setPalette(QPalette(palette().color(QPalette::Background),
QColor(RDMARKERPLAYER_HIGHLIGHT_COLOR)));
d_overall_edit=new QLineEdit(this);
d_overall_edit->setAcceptDrops(false);
d_overall_edit->setReadOnly(true);
d_region_edit_label=new QLabel("Region",this);
d_region_edit_label->setFont(subLabelFont());
d_region_edit_label->setAlignment(Qt::AlignHCenter);
d_region_edit_label->
setPalette(QPalette(palette().color(QPalette::Background),QColor(RDMARKERPLAYER_HIGHLIGHT_COLOR)));
d_region_edit=new QLineEdit(this);
d_region_edit->setAcceptDrops(false);
d_region_edit->setReadOnly(true);
d_size_label=new QLabel(tr("Length"),this);
d_size_label->setFont(subLabelFont());
d_size_label->setAlignment(Qt::AlignHCenter);
d_size_label->
setPalette(QPalette(palette().color(QPalette::Background),QColor(RDMARKERPLAYER_HIGHLIGHT_COLOR)));
d_size_edit=new QLineEdit(this);
d_size_edit->setAcceptDrops(false);
d_size_edit->setReadOnly(true);
//
// Transport Buttons
//
d_play_cursor_button=
new RDTransportButton(RDTransportButton::PlayBetween,this);
d_play_cursor_button->setFocusPolicy(Qt::NoFocus);
d_play_cursor_button->setEnabled((d_cards.first()>=0)&&(d_port>=0));
connect(d_play_cursor_button,SIGNAL(clicked()),
this,SLOT(playCursorData()));
d_play_start_button=
new RDTransportButton(RDTransportButton::Play,this);
d_play_start_button->setFocusPolicy(Qt::NoFocus);
d_play_start_button->setEnabled((d_cards.first()>=0)&&(d_port>=0));
connect(d_play_start_button,SIGNAL(clicked()),
this,SLOT(playStartData()));
d_pause_button=new RDTransportButton(RDTransportButton::Pause,this);
d_pause_button->setFocusPolicy(Qt::NoFocus);
d_pause_button->setOnColor(QColor(Qt::red));
d_pause_button->setEnabled((d_cards.first()>=0)&&(d_port>=0));
connect(d_pause_button,SIGNAL(clicked()),this,SLOT(pauseData()));
d_stop_button=new RDTransportButton(RDTransportButton::Stop,this);
d_stop_button->setFocusPolicy(Qt::NoFocus);
d_stop_button->on();
d_stop_button->setOnColor(QColor(Qt::red));
d_stop_button->setEnabled((d_cards.first()>=0)&&(d_port>=0));
connect(d_stop_button,SIGNAL(clicked()),this,SLOT(stopData()));
d_loop_button=new RDTransportButton(RDTransportButton::Loop,this);
d_loop_button->off();
d_loop_button->setEnabled((d_cards.first()>=0)&&(d_port>=0));
connect(d_loop_button,SIGNAL(clicked()),this,SLOT(loopData()));
//
// The Audio Meter
//
d_meter=new RDStereoMeter(this);
d_meter->setSegmentSize(5);
d_meter->setMode(RDSegMeter::Peak);
d_meter_timer=new QTimer(this);
connect(d_meter_timer,SIGNAL(timeout()),this,SLOT(meterData()));
}
RDMarkerPlayer::~RDMarkerPlayer()
{
}
QSize RDMarkerPlayer::sizeHint() const
{
return QSize(717,92);
}
QSizePolicy RDMarkerPlayer::sizePolicy() const
{
return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
}
bool RDMarkerPlayer::setCut(unsigned cartnum,int cutnum)
{
clearCut();
if(!rda->cae()->loadPlay(d_cards.first(),RDCut::cutName(cartnum,cutnum),
&d_cae_stream,&d_cae_handle)) {
return false;
}
RDSetMixerOutputPort(rda->cae(),d_cards.first(),d_cae_stream,d_port);
return true;
}
void RDMarkerPlayer::clearCut()
{
if(d_cae_handle>=0) {
rda->cae()->stopPlay(d_cae_handle);
rda->cae()->unloadPlay(d_cae_handle);
d_cae_stream=-1;
d_cae_handle=-1;
d_is_playing=false;
}
for(int i=0;i<RDMarkerHandle::LastRole;i++) {
d_pointers[i]=-1;
}
}
void RDMarkerPlayer::setPlayPosition(int msec)
{
}
void RDMarkerPlayer::setPointerValue(RDMarkerHandle::PointerRole role,int ptr)
{
d_pointers[role]=ptr;
}
void RDMarkerPlayer::playCursorData()
{
}
void RDMarkerPlayer::playStartData()
{
if(d_cae_handle>=0) {
if(d_is_playing) {
rda->cae()->stopPlay(d_cae_handle);
}
rda->cae()->positionPlay(d_cae_handle,d_pointers[RDMarkerHandle::CutStart]);
rda->cae()->play(d_cae_handle,
d_pointers[RDMarkerHandle::CutEnd]-
d_pointers[RDMarkerHandle::CutStart],100000,false);
rda->cae()->setPlayPortActive(d_cards.first(),d_port,d_cae_stream);
// FIXME: Implement variable gain here!
rda->cae()->setOutputVolume(d_cards.first(),d_cae_stream,d_port,0);
// rda->cae()->
// setOutputVolume(d_cards.first(),d_cae_stream,d_port,0+edit_gain_control->value());
d_meter_timer->start(RD_METER_UPDATE_INTERVAL);
}
}
void RDMarkerPlayer::pauseData()
{
}
void RDMarkerPlayer::stopData()
{
if(d_cae_handle>=0) {
if(d_is_playing) {
rda->cae()->stopPlay(d_cae_handle);
}
}
}
void RDMarkerPlayer::loopData()
{
}
void RDMarkerPlayer::meterData()
{
short lvls[2];
rda->cae()->outputMeterUpdate(d_cards.first(),d_port,lvls);
d_meter->setLeftPeakBar(lvls[0]);
d_meter->setRightPeakBar(lvls[1]);
}
void RDMarkerPlayer::caePlayedData(int handle)
{
if(handle==d_cae_handle) {
if(!d_is_playing) {
d_play_start_button->setState(RDTransportButton::On);
d_pause_button->setState(RDTransportButton::Off);
d_stop_button->setState(RDTransportButton::Off);
d_is_playing=true;
}
}
}
void RDMarkerPlayer::caePausedData(int handle)
{
if(handle==d_cae_handle) {
if(d_is_playing) {
if(d_meter_timer->isActive()) {
d_meter_timer->stop();
d_meter->setLeftPeakBar(-10000);
d_meter->setRightPeakBar(-10000);
}
d_play_start_button->setState(RDTransportButton::Off);
d_pause_button->setState(RDTransportButton::Off);
d_stop_button->setState(RDTransportButton::On);
d_is_playing=false;
}
}
}
void RDMarkerPlayer::caePositionData(int handle,unsigned msec)
{
if(handle==d_cae_handle) {
emit cursorPositionChanged(msec);
}
}
void RDMarkerPlayer::resizeEvent(QResizeEvent *)
{
d_overall_label->setGeometry(50,3,70,20);
d_overall_edit->setGeometry(50,18,70,21);
d_region_edit_label->setGeometry(148,3,70,20);
d_region_edit->setGeometry(148,18,70,21);
d_size_label->setGeometry(246,3,70,20);
d_size_edit->setGeometry(246,18,70,21);
d_play_cursor_button->setGeometry(10,42,65,45);
d_play_start_button->setGeometry(80,42,65,45);
d_pause_button->setGeometry(150,42,65,45);
d_stop_button->setGeometry(220,42,65,45);
d_loop_button->setGeometry(290,42,65,45);
d_meter->setGeometry(370,15,d_meter->sizeHint().width(),
d_meter->sizeHint().height());
}
void RDMarkerPlayer::paintEvent(QPaintEvent *e)
{
QPainter *p=new QPainter(this);
//
// Transport Control Area
//
p->setPen(QColor(palette().shadow().color()));
p->fillRect(1,1,size().width()-2,size().height()-2,
QColor(RDMARKERPLAYER_HIGHLIGHT_COLOR));
p->drawRect(0,0,size().width(),size().height());
delete p;
}

92
lib/rdmarkerplayer.h Normal file
View File

@ -0,0 +1,92 @@
// rdmarkerplayer.h
//
// Audio player for RDMarkerDialog
//
// (C) Copyright 2021 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.
//
#ifndef RDMARKERPLAYER_H
#define RDMARKERPLAYER_H
#include <QLabel>
#include <QLineEdit>
#include <QTimer>
#include <rdmarkerview.h>
#include <rdstereometer.h>
#include <rdtransportbutton.h>
#include <rdwidget.h>
#define RDMARKERPLAYER_HIGHLIGHT_COLOR palette().mid().color()
class RDMarkerPlayer : public RDWidget
{
Q_OBJECT;
public:
RDMarkerPlayer(int card,int port,QWidget *parent=0);
~RDMarkerPlayer();
QSize sizeHint() const;
QSizePolicy sizePolicy() const;
bool setCut(unsigned cartnum,int cutnum);
void clearCut();
public slots:
void setPlayPosition(int msec);
void setPointerValue(RDMarkerHandle::PointerRole role,int ptr);
signals:
void cursorPositionChanged(unsigned msec);
private slots:
void playCursorData();
void playStartData();
void pauseData();
void stopData();
void loopData();
void meterData();
void caePlayedData(int handle);
void caePausedData(int handle);
void caePositionData(int handle,unsigned pos);
protected:
void resizeEvent(QResizeEvent *);
void paintEvent(QPaintEvent *e);
private:
QLabel *d_overall_label;
QLineEdit *d_overall_edit;
QLabel *d_region_edit_label;
QLineEdit *d_region_edit;
QLabel *d_size_label;
QLineEdit *d_size_edit;
RDTransportButton *d_play_cursor_button;
RDTransportButton *d_play_start_button;
RDTransportButton *d_pause_button;
RDTransportButton *d_stop_button;
RDTransportButton *d_loop_button;
RDStereoMeter *d_meter;
QTimer *d_meter_timer;
QList<int> d_cards;
int d_port;
int d_cae_stream;
int d_cae_handle;
bool d_is_playing;
int d_pointers[RDMarkerHandle::LastRole];
};
#endif // RDMARKERPLAYER_H

View File

@ -18,7 +18,6 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#include <QGraphicsLineItem>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QMouseEvent>
@ -450,6 +449,8 @@ void RDMarkerView::setMaximumShrinkFactor()
bool RDMarkerView::setCut(QString *err_msg,unsigned cartnum,int cutnum)
{
clear();
d_cart_number=cartnum;
d_cut_number=cutnum;
d_right_margin=LEFT_MARGIN; // Default value
@ -476,6 +477,14 @@ bool RDMarkerView::setCut(QString *err_msg,unsigned cartnum,int cutnum)
}
void RDMarkerView::setCursorPosition(unsigned msec)
{
qreal x=(qreal)msec*(qreal)d_sample_rate/(1152000*(qreal)d_shrink_factor)+
(qreal)LEFT_MARGIN;
d_cursor->setPos(x,d_cursor->pos().y());
}
void RDMarkerView::save()
{
QString sql;
@ -504,6 +513,7 @@ void RDMarkerView::clear()
d_handles[i][j]=NULL;
}
}
d_cursor=NULL;
d_shrink_factor=1;
d_max_shrink_factor=1;
d_pad_size=0;
@ -552,6 +562,8 @@ void RDMarkerView::addTalkData()
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::TalkEnd,60);
InterlockMarkerPair(RDMarkerHandle::TalkStart);
d_has_unsaved_changes=true;
emit pointerValueChanged(RDMarkerHandle::TalkStart,
d_pointers[RDMarkerHandle::TalkStart]);
emit pointerValueChanged(RDMarkerHandle::TalkEnd,
@ -568,6 +580,8 @@ void RDMarkerView::addSegueData()
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::SegueEnd,40);
InterlockMarkerPair(RDMarkerHandle::SegueStart);
d_has_unsaved_changes=true;
emit pointerValueChanged(RDMarkerHandle::SegueStart,
d_pointers[RDMarkerHandle::SegueStart]);
emit pointerValueChanged(RDMarkerHandle::SegueEnd,
@ -584,6 +598,8 @@ void RDMarkerView::addHookData()
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::HookEnd,100);
InterlockMarkerPair(RDMarkerHandle::HookStart);
d_has_unsaved_changes=true;
emit pointerValueChanged(RDMarkerHandle::HookStart,
d_pointers[RDMarkerHandle::HookStart]);
emit pointerValueChanged(RDMarkerHandle::HookEnd,
@ -598,6 +614,8 @@ void RDMarkerView::addFadeupData()
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::FadeUp,80);
InterlockMarkerPair(RDMarkerHandle::FadeUp);
d_has_unsaved_changes=true;
emit pointerValueChanged(RDMarkerHandle::FadeUp,
d_pointers[RDMarkerHandle::FadeUp]);
}
@ -610,6 +628,8 @@ void RDMarkerView::addFadedownData()
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::FadeDown,80);
InterlockMarkerPair(RDMarkerHandle::FadeUp);
d_has_unsaved_changes=true;
emit pointerValueChanged(RDMarkerHandle::FadeDown,
d_pointers[RDMarkerHandle::FadeDown]);
}
@ -621,6 +641,8 @@ void RDMarkerView::deleteMarkerData()
RemoveMarker(d_deleting_roles.at(i));
}
d_deleting_roles.clear();
d_has_unsaved_changes=true;
}
@ -847,6 +869,10 @@ void RDMarkerView::WriteWave()
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::CutStart,20);
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::CutEnd,20);
d_cursor=new QGraphicsLineItem(0,0,0,d_height);
d_cursor->setPen(QPen(Qt::black));
d_scene->addItem(d_cursor);
d_view->setScene(d_scene);
updateInterlocks();

View File

@ -21,6 +21,7 @@
#ifndef RDMARKERVIEW_H
#define RDMARKERVIEW_H
#include <QGraphicsLineItem>
#include <QGraphicsPolygonItem>
#include <QGraphicsScene>
#include <QGraphicsView>
@ -86,18 +87,18 @@ class RDMarkerView : public QWidget
const QPointF &pos);
void updatePosition(RDMarkerHandle::PointerRole role,int ptr);
signals:
void positionClicked(int msec);
void pointerValueChanged(RDMarkerHandle::PointerRole role,int msec);
public slots:
void setAudioGain(int lvl);
void setShrinkFactor(int sf);
void setMaximumShrinkFactor();
bool setCut(QString *err_msg,unsigned cartnum,int cutnum);
void setCursorPosition(unsigned msec);
void save();
void clear();
int Frame(int msec) const;
int Msec(int frame) const;
signals:
void pointerValueChanged(RDMarkerHandle::PointerRole role,int msec);
private slots:
void updateMenuData();
@ -114,6 +115,8 @@ class RDMarkerView : public QWidget
void mousePressEvent(QMouseEvent *e);
private:
int Frame(int msec) const;
int Msec(int frame) const;
void InterlockMarkerPair(RDMarkerHandle::PointerRole start_marker);
bool LoadCutData();
void WriteWave();
@ -140,6 +143,7 @@ class RDMarkerView : public QWidget
bool d_has_unsaved_changes;
int d_pointers[RDMarkerHandle::LastRole];
RDMarkerHandle *d_handles[RDMarkerHandle::LastRole][2];
QGraphicsLineItem *d_cursor;
int d_audio_end;
QMenu *d_main_menu;
QAction *d_add_fadedown_action;