From 2d6730678d62bbfc3a47368c668d1758ae2a6bef Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 23 Mar 2019 06:06:42 +0100 Subject: [PATCH] DATV demod: implemented audio and video mute. Corrected audio volume --- doc/img/film.xcf | Bin 8972 -> 29621 bytes plugins/channelrx/demoddatv/datvdemod.cpp | 7 ++ plugins/channelrx/demoddatv/datvdemodgui.cpp | 21 ++++-- plugins/channelrx/demoddatv/datvdemodgui.h | 1 + plugins/channelrx/demoddatv/datvdemodgui.ui | 60 +++++++++------- .../channelrx/demoddatv/datvdemodsettings.cpp | 6 +- .../channelrx/demoddatv/datvdemodsettings.h | 1 + .../channelrx/demoddatv/datvideorender.cpp | 67 +++++++++--------- plugins/channelrx/demoddatv/datvideorender.h | 8 +-- sdrgui/resources/no_film.png | Bin 0 -> 445 bytes sdrgui/resources/res.qrc | 1 + 11 files changed, 101 insertions(+), 71 deletions(-) create mode 100644 sdrgui/resources/no_film.png diff --git a/doc/img/film.xcf b/doc/img/film.xcf index 1c188bdfeb520a27d87c482296f1b6c6f76d5c1f..0ad721dd8c2a1e9c68ebc6c7552b1e0a3a3366ee 100644 GIT binary patch literal 29621 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.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 0000000000000000000000000000000000000000..c2c10660540d4b46d21593e84fda8337911fd27d GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkEN2eM39X60?-9Nw0Z^a{q z4(^f`X@hX5GpX8(EM2t>mn=_s&BQFzAj#P|Q}zgBz|jy*8@3pOWt~FiqWQm;-gy7? z=k~umy3Uh4ttL#_!0B=7OY2E}LCGa(q&O5sd8RqUfzW1vtm+X=QhoyY?G0pp5I@^v>*)wuU z^Tfv*v5UeVa9H$-%&_jeq}HFDzeCMaL{}kGAu~+9^O8s7OL=p>1*<2oNK0AQ6XV$_ le`R(Rr^>m`t!MvoKI}Ux{QsKhMqscqc)I$ztaD0e0syL>vX1}& literal 0 HcmV?d00001 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