diff --git a/plugins/samplesource/v4l/v4lgui.cpp b/plugins/samplesource/v4l/v4lgui.cpp index 8c9ca6706..d91b1e558 100644 --- a/plugins/samplesource/v4l/v4lgui.cpp +++ b/plugins/samplesource/v4l/v4lgui.cpp @@ -95,7 +95,7 @@ bool V4LGui::handleMessage(Message* message) void V4LGui::displaySettings() { ui->centerFrequency->setValue(m_generalSettings.m_centerFrequency / 1000); - ui->decimation->setValue(m_settings.m_decimation); + ui->samplerate->setValue(m_settings.m_samplerate); if(m_gains.size() > 0) { int dist = abs(m_settings.m_gain - m_gains[0]); @@ -139,10 +139,12 @@ void V4LGui::on_gain_valueChanged(int value) sendSettings(); } -void V4LGui::on_decimation_valueChanged(int value) +void V4LGui::on_samplerate_valueChanged(int value) { - ui->decimationText->setText(tr("1:%1").arg(1 << value)); - m_settings.m_decimation = value; + int Rates[] = { 2500, 1536, 3072, 288, 1000, 0}; + int newrate = Rates[value]; + ui->samplerateText->setText(tr("%1kHz").arg(newrate)); + m_settings.m_samplerate = 1000 * newrate; sendSettings(); } diff --git a/plugins/samplesource/v4l/v4lgui.h b/plugins/samplesource/v4l/v4lgui.h index f713ed1b3..2e84be2d4 100644 --- a/plugins/samplesource/v4l/v4lgui.h +++ b/plugins/samplesource/v4l/v4lgui.h @@ -45,7 +45,7 @@ private: private slots: void on_centerFrequency_changed(quint64 value); void on_gain_valueChanged(int value); - void on_decimation_valueChanged(int value); + void on_samplerate_valueChanged(int value); void updateHardware(); }; diff --git a/plugins/samplesource/v4l/v4lgui.ui b/plugins/samplesource/v4l/v4lgui.ui index 7dad38cb1..17b3f5c5e 100644 --- a/plugins/samplesource/v4l/v4lgui.ui +++ b/plugins/samplesource/v4l/v4lgui.ui @@ -106,9 +106,9 @@ 3 - + - Signal decimation factor + Device Samplerate 4 @@ -130,12 +130,12 @@ - Zoom Out + Samplerate - + 40 diff --git a/plugins/samplesource/v4l/v4linput.cpp b/plugins/samplesource/v4l/v4linput.cpp index 28495f39c..668f2276d 100644 --- a/plugins/samplesource/v4l/v4linput.cpp +++ b/plugins/samplesource/v4l/v4linput.cpp @@ -19,7 +19,6 @@ #include #include "v4linput.h" #include "v4lthread.h" -#include "v4lsource.h" #include "v4lgui.h" #include "util/simpleserializer.h" @@ -28,21 +27,21 @@ MESSAGE_CLASS_DEFINITION(V4LInput::MsgReportV4L, Message) V4LInput::Settings::Settings() : m_gain(0), - m_decimation(0) + m_samplerate(2500000) { } void V4LInput::Settings::resetToDefaults() { m_gain = 0; - m_decimation = 0; + m_samplerate = 2500000; } QByteArray V4LInput::Settings::serialize() const { SimpleSerializer s(1); s.writeS32(1, m_gain); - s.writeS32(2, m_decimation); + s.writeS32(2, m_samplerate); return s.final(); } @@ -57,7 +56,7 @@ bool V4LInput::Settings::deserialize(const QByteArray& data) if(d.getVersion() == 1) { d.readS32(1, &m_gain, 0); - d.readS32(2, &m_decimation, 0); + d.readS32(2, &m_samplerate, 0); return true; } else { resetToDefaults(); @@ -187,7 +186,9 @@ const QString& V4LInput::getDeviceDescription() const int V4LInput::getSampleRate() const { - return 96000 * (1 << m_settings.m_decimation); + int result = m_settings.m_samplerate / 4; + if (result > 200000) result /= 4; + return result; } quint64 V4LInput::getCenterFrequency() const @@ -215,18 +216,18 @@ bool V4LInput::applySettings(const GeneralSettings& generalSettings, const Setti if((m_generalSettings.m_centerFrequency != generalSettings.m_centerFrequency) || force) { m_generalSettings.m_centerFrequency = generalSettings.m_centerFrequency; if(m_dev > 0) - V4LInput::set_center_freq( (double)(m_generalSettings.m_centerFrequency - + 384000) ); // samplerate/4 + V4LInput::set_center_freq( (double)(generalSettings.m_centerFrequency + + (settings.m_samplerate / 4) )); } if((m_settings.m_gain != settings.m_gain) || force) { m_settings.m_gain = settings.m_gain; if(m_dev > 0) V4LInput::set_tuner_gain((double)m_settings.m_gain); } - if((m_settings.m_decimation != settings.m_decimation) || force) { - m_settings.m_decimation = settings.m_decimation; + if((m_settings.m_samplerate != settings.m_samplerate) || force) { + m_settings.m_samplerate = settings.m_samplerate; if(m_dev > 0) - m_V4LThread->setDecimation(m_settings.m_decimation); + m_V4LThread->setSamplerate((double)settings.m_samplerate); } return true; } diff --git a/plugins/samplesource/v4l/v4linput.h b/plugins/samplesource/v4l/v4linput.h index 12d8613c0..282da68f7 100644 --- a/plugins/samplesource/v4l/v4linput.h +++ b/plugins/samplesource/v4l/v4linput.h @@ -20,7 +20,11 @@ #include "dsp/samplesource/samplesource.h" #include -#include "v4lsource.h" + +struct v4l_buffer { + void *start; + size_t length; +}; class V4LThread; @@ -28,7 +32,7 @@ class V4LInput : public SampleSource { public: struct Settings { qint32 m_gain; - qint32 m_decimation; + qint32 m_samplerate; Settings(); void resetToDefaults(); @@ -96,9 +100,7 @@ public: void set_center_freq(double freq); void set_bandwidth(double bandwidth); void set_tuner_gain(double gain); - int work(int noutput_items, - void* input_items, - void* output_items); + int work(int noutput_items, qint16* output_items); private: int fd; quint32 pixelformat; diff --git a/plugins/samplesource/v4l/v4lplugin.cpp b/plugins/samplesource/v4l/v4lplugin.cpp index 702e4968c..57ad54663 100644 --- a/plugins/samplesource/v4l/v4lplugin.cpp +++ b/plugins/samplesource/v4l/v4lplugin.cpp @@ -35,7 +35,7 @@ void V4LPlugin::initPlugin(PluginAPI* pluginAPI) PluginInterface::SampleSourceDevices V4LPlugin::enumSampleSources() { SampleSourceDevices result; - int count = rtlsdr_get_device_count(); + int count = 1; //rtlsdr_get_device_count(); char vendor[256]; char product[256]; char serial[256]; @@ -45,9 +45,9 @@ PluginInterface::SampleSourceDevices V4LPlugin::enumSampleSources() product[0] = '\0'; serial[0] = '\0'; - if(rtlsdr_get_device_usb_strings((uint32_t)i, vendor, product, serial) != 0) - continue; - QString displayedName(QString("SDR #%1 (%2 #%3)").arg(i + 1).arg(product).arg(serial)); +// if(rtlsdr_get_device_usb_strings((uint32_t)i, vendor, product, serial) != 0) +// continue; + QString displayedName(QString("SDR #%1").arg(i + 1)); SimpleSerializer s(1); s.writeS32(1, i); result.append(SampleSourceDevice(displayedName, "org.osmocom.sdr.samplesource.v4l", s.final())); diff --git a/plugins/samplesource/v4l/v4lsource.cpp b/plugins/samplesource/v4l/v4lsource.cpp index dddaa4219..5ec363aba 100644 --- a/plugins/samplesource/v4l/v4lsource.cpp +++ b/plugins/samplesource/v4l/v4lsource.cpp @@ -17,8 +17,16 @@ * Boston, MA 02110-1301, USA. */ -#include "v4lsource.h" #include "v4linput.h" +#include +#include +#include +#include +#include +#include +#include "/usr/local/include/libv4l2.h" +#include +#include /* Control classes */ #define V4L2_CTRL_CLASS_USER 0x00980000 /* Old-style 'user' controls */ @@ -47,7 +55,7 @@ static void xioctl(int fh, unsigned long int request, void *arg) ret = v4l2_ioctl(fh, request, arg); } while (ret == -1 && ((errno == EINTR) || (errno == EAGAIN))); if (ret == -1) { - fprintf(stderr, "error %d\n", errno); + qCritical("error %d\n", errno); } } @@ -77,7 +85,7 @@ V4LInput::OpenSource(const char *filename) fmt.fmt.sdr.pixelformat = pixelformat; xioctl(fd, VIDIOC_S_FMT, &fmt); if (fmt.fmt.sdr.pixelformat != pixelformat) { - printf("Libv4l didn't accept FLOAT format. Cannot proceed. Pixelformat %4.4s\n", + qCritical("Libv4l didn't accept FLOAT format. Cannot proceed. Pixelformat %4.4s\n", (char *)&fmt.fmt.sdr.pixelformat); } @@ -211,9 +219,7 @@ V4LInput::set_tuner_gain(double gain) } int -V4LInput::work(int noutput_items, - void* input_items, - void* output_items) +V4LInput::work(int noutput_items, int16_t* output_items) { //complex *out = (complex *) output_items; int ret; diff --git a/plugins/samplesource/v4l/v4lsource.h b/plugins/samplesource/v4l/v4lsource.h deleted file mode 100644 index 5f691def7..000000000 --- a/plugins/samplesource/v4l/v4lsource.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2013 Antti Palosaari - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_KERNEL_LIBV4L2_X_IMPL_H -#define INCLUDED_KERNEL_LIBV4L2_X_IMPL_H - -#include -#include -#include -#include -#include -#include -#include "/usr/local/include/libv4l2.h" -#include "fcntl.h" -#include - -struct v4l_buffer { - void *start; - size_t length; -}; - - -#endif /* INCLUDED_KERNEL_LIBV4L2_X_IMPL_H */ - diff --git a/plugins/samplesource/v4l/v4lthread.cpp b/plugins/samplesource/v4l/v4lthread.cpp index c15c6faeb..69d668743 100644 --- a/plugins/samplesource/v4l/v4lthread.cpp +++ b/plugins/samplesource/v4l/v4lthread.cpp @@ -27,10 +27,9 @@ V4LThread::V4LThread(SampleFifo* sampleFifo, QObject* parent) : m_running(false), m_dev(1), m_convertBuffer(BLOCKSIZE), - m_sampleFifo(sampleFifo), - m_decimation(2) + m_sampleFifo(sampleFifo) { - m_localdecimation = 0; + m_samplerate = 2500000; } V4LThread::~V4LThread() @@ -53,9 +52,9 @@ void V4LThread::stopWork() wait(); } -void V4LThread::setDecimation(int decimation) +void V4LThread::setSamplerate(int samplerate) { - m_decimation = decimation; + m_samplerate = samplerate; } void V4LThread::run() @@ -140,12 +139,8 @@ void V4LThread::callback(const quint8* buf, qint32 len) { qint16 xreal, yimag, phase; SampleVector::iterator it = m_convertBuffer.begin(); - int decimationFactor[] = {1, 1, 1, 2, 4, 0}; - if (++m_localdecimation < decimationFactor[m_decimation]) return; - m_localdecimation = 0; - - switch(4 - m_decimation) { + switch(4) { case 0: // 1:1 = no decimation // just rotation phase = -(1<<2); diff --git a/plugins/samplesource/v4l/v4lthread.h b/plugins/samplesource/v4l/v4lthread.h index 773f400e0..5eddc05bf 100644 --- a/plugins/samplesource/v4l/v4lthread.h +++ b/plugins/samplesource/v4l/v4lthread.h @@ -34,7 +34,7 @@ public: void startWork(); void stopWork(); - void setDecimation(int decimation); + void setSamplerate(int samplerate); private: QMutex m_startWaitMutex; @@ -44,9 +44,7 @@ private: int m_dev; SampleVector m_convertBuffer; SampleFifo* m_sampleFifo; - - int m_decimation; - int m_localdecimation; + int m_samplerate; void run();