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

* Implemented loop mode in 'RDMarkerDialog'.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2021-03-20 20:02:09 -04:00
parent 346fe9ec1e
commit 7d72ad0676
4 changed files with 59 additions and 24 deletions

View File

@ -21304,3 +21304,5 @@
2021-03-20 Fred Gleason <fredg@paravelsystems.com>
* Refactored the 'RDMarkerDialog' dialog to select markers by pairs
rather than singly.
2021-03-20 Fred Gleason <fredg@paravelsystems.com>
* Implemented loop mode in 'RDMarkerDialog'.

View File

@ -87,7 +87,7 @@ RDMarkerDialog::RDMarkerDialog(const QString &caption,int card,int port,
d_player,SLOT(setSelectedMarkers(RDMarkerHandle::PointerRole,
RDMarkerHandle::PointerRole)));
connect(d_marker_view,SIGNAL(positionClicked(int)),
d_player,SLOT(setPlayPosition(int)));
d_player,SLOT(setCursorPosition(int)));
//
// Marker Readouts

View File

@ -30,6 +30,7 @@ RDMarkerPlayer::RDMarkerPlayer(int card,int port,QWidget *parent)
d_cae_stream=-1;
d_cae_handle=-1;
d_is_playing=false;
d_looping=false;
//
// CAE
@ -167,10 +168,18 @@ void RDMarkerPlayer::clearCut()
for(int i=0;i<RDMarkerHandle::LastRole;i++) {
d_pointers[i]=-1;
}
d_looping=false;
d_stopping=false;
}
void RDMarkerPlayer::setPlayPosition(int msec)
int RDMarkerPlayer::cursorPosition() const
{
return d_cursor_position;
}
void RDMarkerPlayer::setCursorPosition(int msec)
{
rda->cae()->positionPlay(d_cae_handle,msec);
}
@ -215,9 +224,9 @@ void RDMarkerPlayer::buttonPlayData()
rda->cae()->stopPlay(d_cae_handle);
}
}
rda->cae()->play(d_cae_handle,
d_pointers[RDMarkerHandle::CutEnd]-
d_pointers[RDMarkerHandle::CutStart],100000,false);
d_loop_start_msec=d_cursor_position;
d_loop_start_length=0;
rda->cae()->play(d_cae_handle,d_loop_start_length,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);
@ -236,8 +245,10 @@ void RDMarkerPlayer::buttonPlayFromData()
}
}
if(d_selected_markers[RDMarkerHandle::Start]!=RDMarkerHandle::LastRole) {
rda->cae()->positionPlay(d_cae_handle,d_pointers[d_selected_markers[0]]);
rda->cae()->play(d_cae_handle,0,100000,false);
d_loop_start_msec=d_pointers[d_selected_markers[0]];
rda->cae()->positionPlay(d_cae_handle,d_loop_start_msec);
d_loop_start_length=0;
rda->cae()->play(d_cae_handle,d_loop_start_length,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);
@ -257,14 +268,14 @@ void RDMarkerPlayer::buttonPlayToData()
}
}
if(d_selected_markers[RDMarkerHandle::End]!=RDMarkerHandle::LastRole) {
int start=d_pointers[d_selected_markers[1]]-2000;
int len=2000;
if(start<0) {
start=0;
len=d_selected_markers[1];
d_loop_start_msec=d_pointers[d_selected_markers[1]]-2000;
d_loop_start_length=2000;
if(d_loop_start_msec<0) {
d_loop_start_msec=0;
d_loop_start_length=d_selected_markers[1];
}
rda->cae()->positionPlay(d_cae_handle,start);
rda->cae()->play(d_cae_handle,len,100000,false);
rda->cae()->positionPlay(d_cae_handle,d_loop_start_msec);
rda->cae()->play(d_cae_handle,d_loop_start_length,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);
@ -279,6 +290,7 @@ void RDMarkerPlayer::buttonStopData()
{
if(d_cae_handle>=0) {
if(d_is_playing) {
d_stopping=true;
rda->cae()->stopPlay(d_cae_handle);
}
}
@ -287,6 +299,13 @@ void RDMarkerPlayer::buttonStopData()
void RDMarkerPlayer::buttonLoopData()
{
d_looping=!d_looping;
if(d_looping) {
d_loop_button->setState(RDTransportButton::On);
}
else {
d_loop_button->setState(RDTransportButton::Off);
}
}
@ -316,16 +335,23 @@ 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);
if(d_looping&&(!d_stopping)) {
rda->cae()->positionPlay(d_cae_handle,d_loop_start_msec);
rda->cae()->play(d_cae_handle,d_loop_start_length,100000,false);
}
else {
d_stopping=false;
if(d_meter_timer->isActive()) {
d_meter_timer->stop();
d_meter->setLeftPeakBar(-10000);
d_meter->setRightPeakBar(-10000);
}
d_play_from_button->setState(RDTransportButton::Off);
d_play_button->setState(RDTransportButton::Off);
d_play_to_button->setState(RDTransportButton::Off);
d_stop_button->setState(RDTransportButton::On);
d_is_playing=false;
}
d_play_from_button->setState(RDTransportButton::Off);
d_play_button->setState(RDTransportButton::Off);
d_play_to_button->setState(RDTransportButton::Off);
d_stop_button->setState(RDTransportButton::On);
d_is_playing=false;
}
}
}
@ -335,6 +361,7 @@ void RDMarkerPlayer::caePositionData(int handle,unsigned msec)
{
if(handle==d_cae_handle) {
d_position_edit->setText(RDGetTimeLength(msec-d_pointers[RDMarkerHandle::CutStart],true,true));
d_cursor_position=msec;
emit cursorPositionChanged(msec);
}
}

View File

@ -42,9 +42,10 @@ class RDMarkerPlayer : public RDWidget
QSizePolicy sizePolicy() const;
bool setCut(unsigned cartnum,int cutnum);
void clearCut();
int cursorPosition() const;
public slots:
void setPlayPosition(int msec);
void setCursorPosition(int msec);
void setPointerValue(RDMarkerHandle::PointerRole role,int ptr);
void setSelectedMarkers(RDMarkerHandle::PointerRole start_role,
RDMarkerHandle::PointerRole end_role);
@ -92,6 +93,11 @@ class RDMarkerPlayer : public RDWidget
bool d_is_playing;
RDMarkerHandle::PointerRole d_selected_markers[2];
int d_pointers[RDMarkerHandle::LastRole];
bool d_looping;
bool d_stopping;
int d_loop_start_msec;
int d_loop_start_length;
int d_cursor_position;
};