kopia lustrzana https://github.com/f4exb/sdrangel
ATV Modulator: transmit video full features
rodzic
b6b972638a
commit
dee348a2ad
|
@ -76,9 +76,18 @@ void ATVMod::configure(MessageQueue* messageQueue,
|
||||||
ATVModInput atvModInput,
|
ATVModInput atvModInput,
|
||||||
Real uniformLevel,
|
Real uniformLevel,
|
||||||
ATVModulation atvModulation,
|
ATVModulation atvModulation,
|
||||||
|
bool videoPlayLoop,
|
||||||
|
bool videoPlay,
|
||||||
bool channelMute)
|
bool channelMute)
|
||||||
{
|
{
|
||||||
Message* cmd = MsgConfigureATVMod::create(rfBandwidth, atvStd, atvModInput, uniformLevel, atvModulation);
|
Message* cmd = MsgConfigureATVMod::create(
|
||||||
|
rfBandwidth,
|
||||||
|
atvStd,
|
||||||
|
atvModInput,
|
||||||
|
uniformLevel,
|
||||||
|
atvModulation,
|
||||||
|
videoPlayLoop,
|
||||||
|
videoPlay);
|
||||||
messageQueue->push(cmd);
|
messageQueue->push(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +194,7 @@ void ATVMod::pullVideo(Real& sample)
|
||||||
m_lineCount = 0;
|
m_lineCount = 0;
|
||||||
m_evenImage = !m_evenImage;
|
m_evenImage = !m_evenImage;
|
||||||
|
|
||||||
if ((m_running.m_atvModInput == ATVModInputVideo) && m_videoOK)
|
if ((m_running.m_atvModInput == ATVModInputVideo) && m_videoOK && (m_running.m_videoPlay))
|
||||||
{
|
{
|
||||||
int grabOK;
|
int grabOK;
|
||||||
int fpsIncrement = (int) m_videoFPSCount - m_videoPrevFPSCount;
|
int fpsIncrement = (int) m_videoFPSCount - m_videoPrevFPSCount;
|
||||||
|
@ -212,7 +221,10 @@ void ATVMod::pullVideo(Real& sample)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO: handle play loop
|
if (m_running.m_videoPlayLoop) // play loop
|
||||||
|
{
|
||||||
|
seekVideoFileStream(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_videoFPSCount < m_videoFPS)
|
if (m_videoFPSCount < m_videoFPS)
|
||||||
|
@ -287,6 +299,8 @@ bool ATVMod::handleMessage(const Message& cmd)
|
||||||
m_config.m_atvStd = cfg.getATVStd();
|
m_config.m_atvStd = cfg.getATVStd();
|
||||||
m_config.m_uniformLevel = cfg.getUniformLevel();
|
m_config.m_uniformLevel = cfg.getUniformLevel();
|
||||||
m_config.m_atvModulation = cfg.getModulation();
|
m_config.m_atvModulation = cfg.getModulation();
|
||||||
|
m_config.m_videoPlayLoop = cfg.getVideoPlayLoop();
|
||||||
|
m_config.m_videoPlay = cfg.getVideoPlay();
|
||||||
|
|
||||||
apply();
|
apply();
|
||||||
|
|
||||||
|
@ -295,7 +309,9 @@ bool ATVMod::handleMessage(const Message& cmd)
|
||||||
<< " m_atvStd: " << (int) m_config.m_atvStd
|
<< " m_atvStd: " << (int) m_config.m_atvStd
|
||||||
<< " m_atvModInput: " << (int) m_config.m_atvModInput
|
<< " m_atvModInput: " << (int) m_config.m_atvModInput
|
||||||
<< " m_uniformLevel: " << m_config.m_uniformLevel
|
<< " m_uniformLevel: " << m_config.m_uniformLevel
|
||||||
<< " m_atvModulation: " << (int) m_config.m_atvModulation;
|
<< " m_atvModulation: " << (int) m_config.m_atvModulation
|
||||||
|
<< " m_videoPlayLoop: " << m_config.m_videoPlayLoop
|
||||||
|
<< " m_videoPlay: " << m_config.m_videoPlay;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -382,6 +398,8 @@ void ATVMod::apply(bool force)
|
||||||
m_running.m_atvStd = m_config.m_atvStd;
|
m_running.m_atvStd = m_config.m_atvStd;
|
||||||
m_running.m_uniformLevel = m_config.m_uniformLevel;
|
m_running.m_uniformLevel = m_config.m_uniformLevel;
|
||||||
m_running.m_atvModulation = m_config.m_atvModulation;
|
m_running.m_atvModulation = m_config.m_atvModulation;
|
||||||
|
m_running.m_videoPlayLoop = m_config.m_videoPlayLoop;
|
||||||
|
m_running.m_videoPlay = m_config.m_videoPlay;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ATVMod::getSampleRateUnits(ATVStd std)
|
int ATVMod::getSampleRateUnits(ATVStd std)
|
||||||
|
|
|
@ -194,6 +194,8 @@ public:
|
||||||
ATVModInput atvModInput,
|
ATVModInput atvModInput,
|
||||||
Real uniformLevel,
|
Real uniformLevel,
|
||||||
ATVModulation atvModulation,
|
ATVModulation atvModulation,
|
||||||
|
bool videoPlayLoop,
|
||||||
|
bool videoPlay,
|
||||||
bool channelMute);
|
bool channelMute);
|
||||||
|
|
||||||
virtual void pull(Sample& sample);
|
virtual void pull(Sample& sample);
|
||||||
|
@ -226,15 +228,26 @@ private:
|
||||||
ATVModInput getATVModInput() const { return m_atvModInput; }
|
ATVModInput getATVModInput() const { return m_atvModInput; }
|
||||||
Real getUniformLevel() const { return m_uniformLevel; }
|
Real getUniformLevel() const { return m_uniformLevel; }
|
||||||
ATVModulation getModulation() const { return m_atvModulation; }
|
ATVModulation getModulation() const { return m_atvModulation; }
|
||||||
|
bool getVideoPlayLoop() const { return m_videoPlayLoop; }
|
||||||
|
bool getVideoPlay() const { return m_videoPlay; }
|
||||||
|
|
||||||
static MsgConfigureATVMod* create(
|
static MsgConfigureATVMod* create(
|
||||||
Real rfBandwidth,
|
Real rfBandwidth,
|
||||||
ATVStd atvStd,
|
ATVStd atvStd,
|
||||||
ATVModInput atvModInput,
|
ATVModInput atvModInput,
|
||||||
Real uniformLevel,
|
Real uniformLevel,
|
||||||
ATVModulation atvModulation)
|
ATVModulation atvModulation,
|
||||||
|
bool videoPlayLoop,
|
||||||
|
bool videoPlay)
|
||||||
{
|
{
|
||||||
return new MsgConfigureATVMod(rfBandwidth, atvStd, atvModInput, uniformLevel, atvModulation);
|
return new MsgConfigureATVMod(
|
||||||
|
rfBandwidth,
|
||||||
|
atvStd,
|
||||||
|
atvModInput,
|
||||||
|
uniformLevel,
|
||||||
|
atvModulation,
|
||||||
|
videoPlayLoop,
|
||||||
|
videoPlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -243,19 +256,25 @@ private:
|
||||||
ATVModInput m_atvModInput;
|
ATVModInput m_atvModInput;
|
||||||
Real m_uniformLevel;
|
Real m_uniformLevel;
|
||||||
ATVModulation m_atvModulation;
|
ATVModulation m_atvModulation;
|
||||||
|
bool m_videoPlayLoop;
|
||||||
|
bool m_videoPlay;
|
||||||
|
|
||||||
MsgConfigureATVMod(
|
MsgConfigureATVMod(
|
||||||
Real rfBandwidth,
|
Real rfBandwidth,
|
||||||
ATVStd atvStd,
|
ATVStd atvStd,
|
||||||
ATVModInput atvModInput,
|
ATVModInput atvModInput,
|
||||||
Real uniformLevel,
|
Real uniformLevel,
|
||||||
ATVModulation atvModulation) :
|
ATVModulation atvModulation,
|
||||||
|
bool videoPlayLoop,
|
||||||
|
bool videoPlay) :
|
||||||
Message(),
|
Message(),
|
||||||
m_rfBandwidth(rfBandwidth),
|
m_rfBandwidth(rfBandwidth),
|
||||||
m_atvStd(atvStd),
|
m_atvStd(atvStd),
|
||||||
m_atvModInput(atvModInput),
|
m_atvModInput(atvModInput),
|
||||||
m_uniformLevel(uniformLevel),
|
m_uniformLevel(uniformLevel),
|
||||||
m_atvModulation(atvModulation)
|
m_atvModulation(atvModulation),
|
||||||
|
m_videoPlayLoop(videoPlayLoop),
|
||||||
|
m_videoPlay(videoPlay)
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -268,6 +287,8 @@ private:
|
||||||
ATVModInput m_atvModInput; //!< Input source type
|
ATVModInput m_atvModInput; //!< Input source type
|
||||||
Real m_uniformLevel; //!< Percentage between black and white for uniform screen display
|
Real m_uniformLevel; //!< Percentage between black and white for uniform screen display
|
||||||
ATVModulation m_atvModulation; //!< RF modulation type
|
ATVModulation m_atvModulation; //!< RF modulation type
|
||||||
|
bool m_videoPlayLoop; //!< Play video in a loop
|
||||||
|
bool m_videoPlay; //!< True to play video and false to pause
|
||||||
|
|
||||||
Config() :
|
Config() :
|
||||||
m_outputSampleRate(-1),
|
m_outputSampleRate(-1),
|
||||||
|
@ -276,7 +297,9 @@ private:
|
||||||
m_atvStd(ATVStdPAL625),
|
m_atvStd(ATVStdPAL625),
|
||||||
m_atvModInput(ATVModInputHBars),
|
m_atvModInput(ATVModInputHBars),
|
||||||
m_uniformLevel(0.5f),
|
m_uniformLevel(0.5f),
|
||||||
m_atvModulation(ATVModulationAM)
|
m_atvModulation(ATVModulationAM),
|
||||||
|
m_videoPlayLoop(false),
|
||||||
|
m_videoPlay(false)
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -270,6 +270,29 @@ void ATVModGUI::on_videoFileDialog_clicked(bool checked)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ATVModGUI::on_playLoop_toggled(bool checked)
|
||||||
|
{
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ATVModGUI::on_play_toggled(bool checked)
|
||||||
|
{
|
||||||
|
ui->navTimeSlider->setEnabled(!checked);
|
||||||
|
m_enableNavTime = !checked;
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ATVModGUI::on_navTimeSlider_valueChanged(int value)
|
||||||
|
{
|
||||||
|
if (m_enableNavTime && ((value >= 0) && (value <= 100)))
|
||||||
|
{
|
||||||
|
int seekFame = (m_videoLength * value) / 100;
|
||||||
|
ATVMod::MsgConfigureVideoFileSourceSeek* message = ATVMod::MsgConfigureVideoFileSourceSeek::create(value);
|
||||||
|
m_atvMod->getInputMessageQueue()->push(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ATVModGUI::configureImageFileName()
|
void ATVModGUI::configureImageFileName()
|
||||||
{
|
{
|
||||||
qDebug() << "ATVModGUI::configureImageFileName: " << m_imageFileName.toStdString().c_str();
|
qDebug() << "ATVModGUI::configureImageFileName: " << m_imageFileName.toStdString().c_str();
|
||||||
|
@ -380,6 +403,8 @@ void ATVModGUI::applySettings()
|
||||||
(ATVMod::ATVModInput) ui->inputSelect->currentIndex(),
|
(ATVMod::ATVModInput) ui->inputSelect->currentIndex(),
|
||||||
ui->uniformLevel->value() / 100.0f,
|
ui->uniformLevel->value() / 100.0f,
|
||||||
(ATVMod::ATVModulation) ui->modulation->currentIndex(),
|
(ATVMod::ATVModulation) ui->modulation->currentIndex(),
|
||||||
|
ui->playLoop->isChecked(),
|
||||||
|
ui->play->isChecked(),
|
||||||
ui->channelMute->isChecked());
|
ui->channelMute->isChecked());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,6 +69,10 @@ private slots:
|
||||||
void on_imageFileDialog_clicked(bool checked);
|
void on_imageFileDialog_clicked(bool checked);
|
||||||
void on_videoFileDialog_clicked(bool checked);
|
void on_videoFileDialog_clicked(bool checked);
|
||||||
|
|
||||||
|
void on_play_toggled(bool checked);
|
||||||
|
void on_playLoop_toggled(bool checked);
|
||||||
|
void on_navTimeSlider_valueChanged(int value);
|
||||||
|
|
||||||
void onWidgetRolled(QWidget* widget, bool rollDown);
|
void onWidgetRolled(QWidget* widget, bool rollDown);
|
||||||
void onMenuDoubleClicked();
|
void onMenuDoubleClicked();
|
||||||
|
|
||||||
|
|
|
@ -169,7 +169,7 @@
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="channelMute">
|
<widget class="QToolButton" name="channelMute">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Mute/Unmute channel</string>
|
<string>Mute/Unmute channel (not implemented)</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>...</string>
|
<string>...</string>
|
||||||
|
@ -223,7 +223,7 @@
|
||||||
<item>
|
<item>
|
||||||
<widget class="QSlider" name="rfBW">
|
<widget class="QSlider" name="rfBW">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Demodulator (RF) bandwidth</string>
|
<string>Modulator (RF) bandwidth when interpolation takes place</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
|
@ -285,7 +285,7 @@
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Audio input gain</string>
|
<string>Video input gain (not implemented)</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>20</number>
|
<number>20</number>
|
||||||
|
@ -346,6 +346,9 @@
|
||||||
<layout class="QHBoxLayout" name="recordFileSelectLayout">
|
<layout class="QHBoxLayout" name="recordFileSelectLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="standard">
|
<widget class="QComboBox" name="standard">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>TV standard</string>
|
||||||
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>PAL625L</string>
|
<string>PAL625L</string>
|
||||||
|
@ -355,6 +358,9 @@
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="inputSelect">
|
<widget class="QComboBox" name="inputSelect">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Video pattern or input source</string>
|
||||||
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Uniform</string>
|
<string>Uniform</string>
|
||||||
|
|
Ładowanie…
Reference in New Issue