From e8773cd83de2e283071c361e92aa9e5a47673f52 Mon Sep 17 00:00:00 2001 From: Vladisslav P Date: Fri, 31 Dec 2021 01:15:50 +0300 Subject: [PATCH] Implement audio sample rate selection Close #615. --- src/applications/gqrx/mainwindow.cpp | 4 +++ src/applications/gqrx/receiver.cpp | 38 +++++++++++++++++----------- src/applications/gqrx/receiver.h | 2 ++ src/qtgui/ioconfig.cpp | 18 +++++++++++++ src/qtgui/ioconfig.ui | 5 ---- 5 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/applications/gqrx/mainwindow.cpp b/src/applications/gqrx/mainwindow.cpp index a80f4a2db4..74d7b928b5 100644 --- a/src/applications/gqrx/mainwindow.cpp +++ b/src/applications/gqrx/mainwindow.cpp @@ -500,6 +500,10 @@ bool MainWindow::loadConfig(const QString& cfgfile, bool check_crash, restoreState(m_settings->value("gui/state", saveState()).toByteArray()); } + int_val = m_settings->value("output/sample_rate", 48000).toInt(&conv_ok); + if (conv_ok && (int_val > 0)) + rx->set_audio_rate(int_val); + QString indev = m_settings->value("input/device", "").toString(); if (!indev.isEmpty()) { diff --git a/src/applications/gqrx/receiver.cpp b/src/applications/gqrx/receiver.cpp index 0aac952ad7..ab0d93beb0 100644 --- a/src/applications/gqrx/receiver.cpp +++ b/src/applications/gqrx/receiver.cpp @@ -124,14 +124,7 @@ receiver::receiver(const std::string input_device, audio_udp_sink = make_udp_sink_f(); -#ifdef WITH_PULSEAUDIO - audio_snk = make_pa_sink(audio_device, d_audio_rate, "GQRX", "Audio output"); -#elif WITH_PORTAUDIO - audio_snk = make_portaudio_sink(audio_device, d_audio_rate, "GQRX", "Audio output"); -#else - audio_snk = gr::audio::sink::make(d_audio_rate, audio_device, true); -#endif - + create_audio_device(audio_device); output_devstr = audio_device; /* wav sink and source is created when rec/play is started */ @@ -267,13 +260,7 @@ void receiver::set_output_device(const std::string device) audio_snk.reset(); try { -#ifdef WITH_PULSEAUDIO - audio_snk = make_pa_sink(device, d_audio_rate, "GQRX", "Audio output"); -#elif WITH_PORTAUDIO - audio_snk = make_portaudio_sink(device, d_audio_rate, "GQRX", "Audio output"); -#else - audio_snk = gr::audio::sink::make(d_audio_rate, device, true); -#endif + create_audio_device(device); if (d_demod != RX_DEMOD_OFF) { @@ -961,6 +948,15 @@ receiver::status receiver::set_amsync_pll_bw(float pll_bw) return STATUS_OK; } +receiver::status receiver::set_audio_rate(int rate) +{ + if(d_audio_rate != rate) + { + d_audio_rate = rate; + } + return STATUS_OK; +} + receiver::status receiver::set_af_gain(float gain_db) { float k; @@ -1422,3 +1418,15 @@ std::string receiver::escape_filename(std::string filename) ss2 << std::quoted(ss1.str(), '\'', '\\'); return ss2.str(); } + +void receiver::create_audio_device(const std::string device) +{ +#ifdef WITH_PULSEAUDIO + audio_snk = make_pa_sink(device, d_audio_rate, "GQRX", "Audio output"); +#elif WITH_PORTAUDIO + audio_snk = make_portaudio_sink(device, d_audio_rate, "GQRX", "Audio output"); +#else + audio_snk = gr::audio::sink::make(d_audio_rate, device, true); +#endif + +} diff --git a/src/applications/gqrx/receiver.h b/src/applications/gqrx/receiver.h index abf827cb83..89a0dee2de 100644 --- a/src/applications/gqrx/receiver.h +++ b/src/applications/gqrx/receiver.h @@ -200,6 +200,7 @@ class receiver status set_amsync_pll_bw(float pll_bw); /* Audio parameters */ + status set_audio_rate(int rate); status set_af_gain(float gain_db); status start_audio_recording(const std::string filename); status stop_audio_recording(); @@ -296,6 +297,7 @@ class receiver //! Get a path to a file containing random bytes static std::string get_zero_file(void); + void make_audio_device(const std::string device); }; #endif // RECEIVER_H diff --git a/src/qtgui/ioconfig.cpp b/src/qtgui/ioconfig.cpp index 25667f7f2a..30d5173c8d 100644 --- a/src/qtgui/ioconfig.cpp +++ b/src/qtgui/ioconfig.cpp @@ -86,6 +86,18 @@ CIoConfig::CIoConfig(QSettings * settings, connect(ui->inSrCombo, SIGNAL(editTextChanged(QString)), this, SLOT(inputRateChanged(QString))); connect(ui->decimCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(decimationChanged(int))); connect(m_scanButton, SIGNAL(clicked(bool)), this, SLOT(onScanButtonClicked())); + ui->outSrCombo->addItem("48 kHz", 48000); + ui->outSrCombo->addItem("44.1 kHz", 44100); + ui->outSrCombo->addItem("24 kHz", 24000); + ui->outSrCombo->addItem("22.05 kHz", 22050); + ui->outSrCombo->addItem("12 kHz", 12000); + ui->outSrCombo->addItem("11.025 kHz", 11025); + ui->outSrCombo->addItem("8 kHz", 8000); + int found = ui->outSrCombo->findData(settings->value("output/sample_rate", 48000)); + if (found == -1) + ui->outSrCombo->setCurrentIndex(0); + else + ui->outSrCombo->setCurrentIndex(found); } CIoConfig::~CIoConfig() @@ -212,6 +224,12 @@ void CIoConfig::saveConfig() else m_settings->remove("input/sample_rate"); + int_val = ui->outSrCombo->currentData().toInt(&conv_ok); + if (conv_ok) + m_settings->setValue("output/sample_rate", int_val); + else + m_settings->remove("output/sample_rate"); + idx = ui->decimCombo->currentIndex(); int_val = idx2decim(idx); if (int_val < 2) diff --git a/src/qtgui/ioconfig.ui b/src/qtgui/ioconfig.ui index dd54af36ff..f3b93831d7 100644 --- a/src/qtgui/ioconfig.ui +++ b/src/qtgui/ioconfig.ui @@ -316,11 +316,6 @@ Leave it at default unless you know what you are doing. Select the audio sample rate - - - 48 kHz - -