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