diff --git a/doc/img/film.xcf b/doc/img/film.xcf
index 1c188bdfe..0ad721dd8 100644
Binary files a/doc/img/film.xcf and b/doc/img/film.xcf differ
diff --git a/plugins/channelrx/demoddatv/datvdemod.cpp b/plugins/channelrx/demoddatv/datvdemod.cpp
index 45ba214e7..af9d6fd7b 100644
--- a/plugins/channelrx/demoddatv/datvdemod.cpp
+++ b/plugins/channelrx/demoddatv/datvdemod.cpp
@@ -961,6 +961,13 @@ void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force)
}
}
+ if ((settings.m_videoMute) != (m_settings.m_videoMute) || force)
+ {
+ if (m_objRegisteredVideoRender) {
+ m_objRegisteredVideoRender->setVideoMute(settings.m_videoMute);
+ }
+ }
+
if (m_settings.isDifferent(settings) || force)
{
m_objSettingsMutex.lock();
diff --git a/plugins/channelrx/demoddatv/datvdemodgui.cpp b/plugins/channelrx/demoddatv/datvdemodgui.cpp
index 01b61ffec..b6a3f4ae3 100644
--- a/plugins/channelrx/demoddatv/datvdemodgui.cpp
+++ b/plugins/channelrx/demoddatv/datvdemodgui.cpp
@@ -186,10 +186,10 @@ DATVDemodGUI::DATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, Ba
m_deviceUISet->addChannelMarker(&m_objChannelMarker);
m_deviceUISet->addRollupWidget(this);
- QPixmap pixmapTarget = QPixmap(":/film.png");
- pixmapTarget = pixmapTarget.scaled(16, 16, Qt::KeepAspectRatio, Qt::SmoothTransformation);
- ui->videoPlay->setAlignment(Qt::AlignCenter);
- ui->videoPlay->setPixmap(pixmapTarget);
+ // QPixmap pixmapTarget = QPixmap(":/film.png");
+ // pixmapTarget = pixmapTarget.scaled(16, 16, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ // ui->videoPlay->setAlignment(Qt::AlignCenter);
+ // ui->videoPlay->setPixmap(pixmapTarget);
CRightClickEnabler *audioMuteRightClickEnabler = new CRightClickEnabler(ui->audioMute);
connect(audioMuteRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioSelect()));
@@ -234,9 +234,9 @@ void DATVDemodGUI::displaySettings()
ui->rfBandwidth->setValue(m_settings.m_rfBandwidth);
ui->spiSymbolRate->setValue(m_settings.m_symbolRate);
ui->spiExcursion->setValue(m_settings.m_excursion);
- ui->audioMute->setChecked(m_settings.m_audioMute);
ui->audioVolume->setValue(m_settings.m_audioVolume);
ui->audioVolumeText->setText(tr("%1").arg(m_settings.m_audioVolume));
+ ui->videoMute->setChecked(m_settings.m_videoMute);
blockApplySettings(false);
m_objChannelMarker.blockSignals(false);
@@ -352,6 +352,7 @@ void DATVDemodGUI::applySettings(bool force)
m_settings.m_excursion = ui->spiExcursion->value();
m_settings.m_audioMute = ui->audioMute->isChecked();
m_settings.m_audioVolume = ui->audioVolume->value();
+ m_settings.m_videoMute = ui->videoMute->isChecked();
QString msg = tr("DATVDemodGUI::applySettings: force: %1").arg(force);
m_settings.debug(msg);
@@ -639,6 +640,12 @@ void DATVDemodGUI::on_audioMute_toggled(bool checked)
applySettings();
}
+void DATVDemodGUI::on_videoMute_toggled(bool checked)
+{
+ (void) checked;
+ applySettings();
+}
+
void DATVDemodGUI::on_audioVolume_valueChanged(int value)
{
ui->audioVolumeText->setText(tr("%1").arg(value));
@@ -669,9 +676,9 @@ void DATVDemodGUI::on_StreamMetaDataChanged(DataTSMetaData2 *objMetaData)
ui->chkDecoding->setChecked(objMetaData->OK_Decoding);
if (objMetaData->OK_Decoding) {
- ui->videoPlay->setStyleSheet("QLabel { background-color : green; }");
+ ui->videoMute->setStyleSheet("QToolButton { background-color : green; }");
} else {
- ui->videoPlay->setStyleSheet("QLabel { background:rgb(79,79,79); }");
+ ui->videoMute->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
}
if (objMetaData->Height > 0) {
diff --git a/plugins/channelrx/demoddatv/datvdemodgui.h b/plugins/channelrx/demoddatv/datvdemodgui.h
index 8dfb66c5f..5d64516c3 100644
--- a/plugins/channelrx/demoddatv/datvdemodgui.h
+++ b/plugins/channelrx/demoddatv/datvdemodgui.h
@@ -94,6 +94,7 @@ private slots:
void on_rfBandwidth_changed(qint64 value);
void on_audioMute_toggled(bool checked);
void on_audioVolume_valueChanged(int value);
+ void on_videoMute_toggled(bool checked);
private:
Ui::DATVDemodGUI* ui;
diff --git a/plugins/channelrx/demoddatv/datvdemodgui.ui b/plugins/channelrx/demoddatv/datvdemodgui.ui
index 586c8c7a1..457259acc 100644
--- a/plugins/channelrx/demoddatv/datvdemodgui.ui
+++ b/plugins/channelrx/demoddatv/datvdemodgui.ui
@@ -204,7 +204,7 @@
QTabWidget::West
- 1
+ 0
@@ -913,34 +913,15 @@
Audio mute (right click: Audio select)
- ...
+
:/sound_on.png
:/sound_off.png:/sound_on.png
-
-
-
-
- 400
- 300
- 24
- 24
-
-
-
- Video play indicator
-
-
- QFrame::StyledPanel
-
-
- QFrame::Plain
-
-
-
+
+ true
@@ -956,14 +937,17 @@
Audio volume control
- -32
+ 0
- 32
+ 100
1
+
+ 80
+
Qt::Horizontal
@@ -981,12 +965,36 @@
Audio volume
- -32
+ 100
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ 400
+ 300
+ 24
+ 24
+
+
+
+ Video mute
+
+
+
+
+
+
+ :/film.png
+ :/no_film.png:/film.png
+
+
+ true
+
+
diff --git a/plugins/channelrx/demoddatv/datvdemodsettings.cpp b/plugins/channelrx/demoddatv/datvdemodsettings.cpp
index 704d3bf43..a7bf67550 100644
--- a/plugins/channelrx/demoddatv/datvdemodsettings.cpp
+++ b/plugins/channelrx/demoddatv/datvdemodsettings.cpp
@@ -50,6 +50,7 @@ void DATVDemodSettings::resetToDefaults()
m_audioMute = false;
m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName;
m_audioVolume = 0;
+ m_videoMute = false;
}
QByteArray DATVDemodSettings::serialize() const
@@ -79,6 +80,7 @@ QByteArray DATVDemodSettings::serialize() const
s.writeS32(19, m_excursion);
s.writeString(20, m_audioDeviceName);
s.writeS32(21, m_audioVolume);
+ s.writeBool(22, m_videoMute);
return s.final();
}
@@ -139,6 +141,7 @@ bool DATVDemodSettings::deserialize(const QByteArray& data)
d.readS32(19, &m_excursion, 10);
d.readString(20, &m_audioDeviceName, AudioDeviceManager::m_defaultDeviceName);
d.readS32(21, &m_audioVolume, 0);
+ d.readBool(22, &m_videoMute, false);
return true;
}
@@ -168,7 +171,8 @@ void DATVDemodSettings::debug(const QString& msg) const
<< " m_excursion: " << m_excursion
<< " m_audioMute: " << m_audioMute
<< " m_audioDeviceName: " << m_audioDeviceName
- << " m_audioVolume: " << m_audioVolume;
+ << " m_audioVolume: " << m_audioVolume
+ << " m_videoMute: " << m_videoMute;
}
bool DATVDemodSettings::isDifferent(const DATVDemodSettings& other)
diff --git a/plugins/channelrx/demoddatv/datvdemodsettings.h b/plugins/channelrx/demoddatv/datvdemodsettings.h
index 1c031a451..cb4c33808 100644
--- a/plugins/channelrx/demoddatv/datvdemodsettings.h
+++ b/plugins/channelrx/demoddatv/datvdemodsettings.h
@@ -73,6 +73,7 @@ struct DATVDemodSettings
bool m_viterbi;
int m_excursion;
int m_audioVolume;
+ bool m_videoMute;
DATVDemodSettings();
void resetToDefaults();
diff --git a/plugins/channelrx/demoddatv/datvideorender.cpp b/plugins/channelrx/demoddatv/datvideorender.cpp
index 5d490ef85..509e19122 100644
--- a/plugins/channelrx/demoddatv/datvideorender.cpp
+++ b/plugins/channelrx/demoddatv/datvideorender.cpp
@@ -37,8 +37,6 @@ DATVideoRender::DATVideoRender(QWidget *parent) : TVScreen(true, parent)
m_formatCtx = nullptr;
m_videoDecoderCtx = nullptr;
m_swsCtx = nullptr;
- m_audioBuffer.resize(1 << 14);
- m_audioBufferFill = 0;
m_audioFifo = nullptr;
m_audioSWR = nullptr;
m_audioSampleRate = 48000;
@@ -46,6 +44,7 @@ DATVideoRender::DATVideoRender(QWidget *parent) : TVScreen(true, parent)
m_videoStreamIndex = -1;
m_audioStreamIndex = -1;
m_audioMute = false;
+ m_videoMute = false;
m_audioVolume = 0;
m_updateAudioResampler = false;
@@ -481,7 +480,7 @@ bool DATVideoRender::RenderStream()
}
//Video channel
- if (packet.stream_index == m_videoStreamIndex)
+ if ((packet.stream_index == m_videoStreamIndex) && (!m_videoMute))
{
memset(m_frame, 0, sizeof(AVFrame));
av_frame_unref(m_frame);
@@ -580,7 +579,7 @@ bool DATVideoRender::RenderStream()
}
}
// Audio channel
- else if ((packet.stream_index == m_audioStreamIndex) && (m_audioFifo) && (swr_is_initialized(m_audioSWR)))
+ else if ((packet.stream_index == m_audioStreamIndex) && (m_audioFifo) && (swr_is_initialized(m_audioSWR)) && (!m_audioMute))
{
if (m_updateAudioResampler)
{
@@ -597,37 +596,45 @@ bool DATVideoRender::RenderStream()
{
if (gotFrame)
{
- uint16_t *audioBuffer;
+ int16_t *audioBuffer;
av_samples_alloc((uint8_t**) &audioBuffer, nullptr, 2, m_frame->nb_samples, AV_SAMPLE_FMT_S16, 0);
int frame_count = swr_convert(m_audioSWR, (uint8_t**) &audioBuffer, m_frame->nb_samples, (const uint8_t**) m_frame->data, m_frame->nb_samples);
+ // direct writing:
// int ret = m_audioFifo->write((const quint8*) &audioBuffer[0], frame_count);
// if (ret < frame_count) {
// qDebug("DATVideoRender::RenderStream: audio frames missing %d vs %d", ret, frame_count);
// }
- if (m_audioFifoBufferIndex + frame_count < m_audioFifoBufferSize)
- {
- std::copy(&audioBuffer[0], &audioBuffer[2*frame_count], &m_audioFifoBuffer[2*m_audioFifoBufferIndex]);
- m_audioFifoBufferIndex += frame_count;
- }
- else
- {
- int remainder = m_audioFifoBufferSize - m_audioFifoBufferIndex;
- std::copy(&audioBuffer[0], &audioBuffer[2*remainder], &m_audioFifoBuffer[2*m_audioFifoBufferIndex]);
- m_audioFifo->write((const quint8*) &m_audioFifoBuffer[0], m_audioFifoBufferSize);
- std::copy(&audioBuffer[2*remainder], &audioBuffer[2*frame_count], &m_audioFifoBuffer[0]);
- m_audioFifoBufferIndex = frame_count - remainder;
- }
-
- // m_audioFifoBufferIndex += frame_count;
-
- // if (m_audioFifoBufferIndex >= m_audioFifoBufferSize)
+ // buffered writing:
+ // if (m_audioFifoBufferIndex + frame_count < m_audioFifoBufferSize)
// {
- // m_audioFifo->write((const quint8*)&m_audioFifoBuffer[0], m_audioFifoBufferSize);
- // m_audioFifoBufferIndex -= m_audioFifoBufferSize;
+ // std::copy(&audioBuffer[0], &audioBuffer[2*frame_count], &m_audioFifoBuffer[2*m_audioFifoBufferIndex]);
+ // m_audioFifoBufferIndex += frame_count;
// }
+ // else
+ // {
+ // int remainder = m_audioFifoBufferSize - m_audioFifoBufferIndex;
+ // std::copy(&audioBuffer[0], &audioBuffer[2*remainder], &m_audioFifoBuffer[2*m_audioFifoBufferIndex]);
+ // m_audioFifo->write((const quint8*) &m_audioFifoBuffer[0], m_audioFifoBufferSize);
+ // std::copy(&audioBuffer[2*remainder], &audioBuffer[2*frame_count], &m_audioFifoBuffer[0]);
+ // m_audioFifoBufferIndex = frame_count - remainder;
+ // }
+
+ // Apply volume:
+ for (int i = 0; i < frame_count; i++)
+ {
+ m_audioFifoBuffer[2*m_audioFifoBufferIndex] = m_audioVolume * audioBuffer[2*i];
+ m_audioFifoBuffer[2*m_audioFifoBufferIndex+1] = m_audioVolume * audioBuffer[2*i+1];
+ m_audioFifoBufferIndex++;
+
+ if (m_audioFifoBufferIndex >= m_audioFifoBufferSize)
+ {
+ m_audioFifo->write((const quint8*) &m_audioFifoBuffer[0], m_audioFifoBufferSize);
+ m_audioFifoBufferIndex = 0;
+ }
+ }
}
}
else
@@ -647,8 +654,8 @@ bool DATVideoRender::RenderStream()
void DATVideoRender::setAudioVolume(int audioVolume)
{
- m_audioVolume = audioVolume < -32 ? -32 : audioVolume > 32 ? 32 : audioVolume;
- m_updateAudioResampler = true;
+ int audioVolumeConstrained = audioVolume < 0 ? 0 : audioVolume > 100 ? 100 : audioVolume;
+ m_audioVolume = audioVolumeConstrained / 100.0f;
}
void DATVideoRender::setResampler()
@@ -666,9 +673,6 @@ void DATVideoRender::setResampler()
av_opt_set_int(m_audioSWR, "out_sample_rate", m_audioSampleRate, 0);
av_opt_set_sample_fmt(m_audioSWR, "in_sample_fmt", m_audioDecoderCtx->sample_fmt, 0);
av_opt_set_sample_fmt(m_audioSWR, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);
- av_opt_set_int(m_audioSWR, "center_mix_level", m_audioVolume, 0);
- av_opt_set_int(m_audioSWR, "surround_mix_level", m_audioVolume, 0);
- av_opt_set_int(m_audioSWR, "lfe_mix_level", m_audioVolume, 0);
swr_init(m_audioSWR);
@@ -680,10 +684,7 @@ void DATVideoRender::setResampler()
<< " in_sample_rate: " << m_audioDecoderCtx->sample_rate
<< " out_sample_rate: " << m_audioSampleRate
<< " in_sample_fmt: " << m_audioDecoderCtx->sample_fmt
- << " out_sample_fmt: " << AV_SAMPLE_FMT_S16
- << " center_mix_level: " << m_audioVolume
- << " surround_mix_level: " << m_audioVolume
- << " lfe_mix_level: " << m_audioVolume;
+ << " out_sample_fmt: " << AV_SAMPLE_FMT_S16;
}
bool DATVideoRender::CloseStream(QIODevice *device)
diff --git a/plugins/channelrx/demoddatv/datvideorender.h b/plugins/channelrx/demoddatv/datvideorender.h
index bb23623b7..c4b304ecd 100644
--- a/plugins/channelrx/demoddatv/datvideorender.h
+++ b/plugins/channelrx/demoddatv/datvideorender.h
@@ -100,6 +100,7 @@ class DATVideoRender : public TVScreen
int getAudioStreamIndex() const { return m_audioStreamIndex; }
void setAudioMute(bool audioMute) { m_audioMute = audioMute; }
+ void setVideoMute(bool videoMute) { m_videoMute = videoMute; }
void setAudioVolume(int audioVolume);
struct DataTSMetaData2 MetaData;
@@ -116,16 +117,15 @@ class DATVideoRender : public TVScreen
AVCodecContext *m_videoDecoderCtx;
AVCodecContext *m_audioDecoderCtx;
AVFrame *m_frame;
- AudioVector m_audioBuffer;
- uint32_t m_audioBufferFill;
AudioFifo *m_audioFifo;
struct SwrContext* m_audioSWR;
int m_audioSampleRate;
static const int m_audioFifoBufferSize = 16000;
- uint16_t m_audioFifoBuffer[m_audioFifoBufferSize*2]; // 2 channels
+ int16_t m_audioFifoBuffer[m_audioFifoBufferSize*2]; // 2 channels
int m_audioFifoBufferIndex;
bool m_audioMute;
- int m_audioVolume;
+ bool m_videoMute;
+ float m_audioVolume;
bool m_updateAudioResampler;
uint8_t *m_pbytDecodedData[4];
diff --git a/sdrgui/resources/no_film.png b/sdrgui/resources/no_film.png
new file mode 100644
index 000000000..c2c106605
Binary files /dev/null and b/sdrgui/resources/no_film.png differ
diff --git a/sdrgui/resources/res.qrc b/sdrgui/resources/res.qrc
index e94749960..74030e747 100644
--- a/sdrgui/resources/res.qrc
+++ b/sdrgui/resources/res.qrc
@@ -1,5 +1,6 @@
+ no_film.png
gps.png
linear.png
logarithmic.png