m_col(0),
m_cols(n),
m_isRadio(false),
+ m_isSDR(false),
m_isVbi(false),
+ m_freqFac(16),
+ m_freqRfFac(16),
m_videoInput(NULL),
m_videoOutput(NULL),
m_audioInput(NULL),
m_freqChannel(NULL),
m_audioMode(NULL),
m_subchannels(NULL),
+ m_freqRf(NULL),
m_stereoMode(NULL),
m_rdsMode(NULL),
m_detectSubchans(NULL),
}
g_tuner(m_tuner);
+ g_tuner(m_tuner_rf, 1);
g_modulator(m_modulator);
v4l2_input vin;
bool needsStd = false;
bool needsTimings = false;
- if (m_tuner.capability && m_tuner.capability & V4L2_TUNER_CAP_LOW)
+ if (m_tuner.capability &&
+ (m_tuner.capability & (V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_1HZ)))
m_isRadio = true;
- if (m_modulator.capability && m_modulator.capability & V4L2_TUNER_CAP_LOW)
+ if (m_modulator.capability &&
+ (m_modulator.capability & (V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_1HZ)))
m_isRadio = true;
- if (m_querycap.capabilities & V4L2_CAP_DEVICE_CAPS)
+ if (m_querycap.capabilities & V4L2_CAP_DEVICE_CAPS) {
m_isVbi = caps() & (V4L2_CAP_VBI_CAPTURE | V4L2_CAP_SLICED_VBI_CAPTURE);
+ m_isSDR = m_isRadio = caps() & V4L2_CAP_SDR_CAPTURE;
+ }
if (hasAlsaAudio()) {
m_audioInDevice = new QComboBox(parent);
if (m_tuner.capability) {
QDoubleValidator *val;
- const char *unit = (m_tuner.capability & V4L2_TUNER_CAP_LOW) ? "kHz" : "MHz";
+ const char *unit = (m_tuner.capability & V4L2_TUNER_CAP_LOW) ? "kHz" :
+ (m_tuner.capability & V4L2_TUNER_CAP_1HZ ? "Hz" : "MHz");
- val = new QDoubleValidator(m_tuner.rangelow / 16, m_tuner.rangehigh / 16, 3, parent);
+ m_freqFac = (m_tuner.capability & V4L2_TUNER_CAP_1HZ) ? 1 : 16;
+ val = new QDoubleValidator(m_tuner.rangelow / m_freqFac, m_tuner.rangehigh / m_freqFac, 3, parent);
m_freq = new QLineEdit(parent);
m_freq->setValidator(val);
m_freq->setWhatsThis(QString("Frequency\nLow: %1 %3\nHigh: %2 %3")
- .arg(m_tuner.rangelow / 16)
- .arg((double)m_tuner.rangehigh / 16, 0, 'f', 2)
+ .arg(m_tuner.rangelow / m_freqFac)
+ .arg((double)m_tuner.rangehigh / m_freqFac, 0, 'f', 2)
.arg(unit));
m_freq->setStatusTip(m_freq->whatsThis());
connect(m_freq, SIGNAL(lostFocus()), SLOT(freqChanged()));
connect(m_freq, SIGNAL(returnPressed()), SLOT(freqChanged()));
updateFreq();
- if (m_tuner.capability & V4L2_TUNER_CAP_LOW)
+ if (m_tuner.capability & V4L2_TUNER_CAP_1HZ)
+ addLabel("Frequency (Hz)");
+ else if (m_tuner.capability & V4L2_TUNER_CAP_LOW)
addLabel("Frequency (kHz)");
else
addLabel("Frequency (MHz)");
addWidget(m_freq);
+ }
- if (!(m_tuner.capability & V4L2_TUNER_CAP_LOW)) {
- addLabel("Frequency Table");
- m_freqTable = new QComboBox(parent);
- for (int i = 0; v4l2_channel_lists[i].name; i++) {
- m_freqTable->addItem(v4l2_channel_lists[i].name);
- }
- addWidget(m_freqTable);
- connect(m_freqTable, SIGNAL(activated(int)), SLOT(freqTableChanged(int)));
-
- addLabel("Channels");
- m_freqChannel = new QComboBox(parent);
- m_freqChannel->setSizeAdjustPolicy(QComboBox::AdjustToContents);
- addWidget(m_freqChannel);
- connect(m_freqChannel, SIGNAL(activated(int)), SLOT(freqChannelChanged(int)));
- updateFreqChannel();
+ if (m_tuner.capability && !isRadio()) {
+ addLabel("Frequency Table");
+ m_freqTable = new QComboBox(parent);
+ for (int i = 0; v4l2_channel_lists[i].name; i++) {
+ m_freqTable->addItem(v4l2_channel_lists[i].name);
}
+ addWidget(m_freqTable);
+ connect(m_freqTable, SIGNAL(activated(int)), SLOT(freqTableChanged(int)));
+
+ addLabel("Channels");
+ m_freqChannel = new QComboBox(parent);
+ m_freqChannel->setSizeAdjustPolicy(QComboBox::AdjustToContents);
+ addWidget(m_freqChannel);
+ connect(m_freqChannel, SIGNAL(activated(int)), SLOT(freqChannelChanged(int)));
+ updateFreqChannel();
+ }
+
+ if (m_tuner.capability && !isSDR()) {
addLabel("Audio Mode");
m_audioMode = new QComboBox(parent);
m_audioMode->setMinimumContentsLength(12);
detectSubchansClicked();
}
+ if (m_tuner_rf.capability) {
+ QDoubleValidator *val;
+ const char *unit = (m_tuner_rf.capability & V4L2_TUNER_CAP_LOW) ? "kHz" :
+ (m_tuner_rf.capability & V4L2_TUNER_CAP_1HZ ? "Hz" : "MHz");
+
+ m_freqRfFac = (m_tuner_rf.capability & V4L2_TUNER_CAP_1HZ) ? 1 : 16;
+ val = new QDoubleValidator(m_tuner_rf.rangelow / m_freqRfFac, m_tuner_rf.rangehigh / m_freqRfFac, 3, parent);
+ val->setNotation(QDoubleValidator::StandardNotation);
+ m_freqRf = new QLineEdit(parent);
+ m_freqRf->setValidator(val);
+ m_freqRf->setWhatsThis(QString("RF Frequency\nLow: %1 %3\nHigh: %2 %3")
+ .arg(m_tuner_rf.rangelow / m_freqRfFac)
+ .arg((double)m_tuner_rf.rangehigh / m_freqRfFac, 0, 'f', 2)
+ .arg(unit));
+ m_freqRf->setStatusTip(m_freqRf->whatsThis());
+ connect(m_freqRf, SIGNAL(lostFocus()), SLOT(freqRfChanged()));
+ connect(m_freqRf, SIGNAL(returnPressed()), SLOT(freqRfChanged()));
+ updateFreqRf();
+ if (m_tuner_rf.capability & V4L2_TUNER_CAP_1HZ)
+ addLabel("RF Frequency (Hz)");
+ else if (m_tuner_rf.capability & V4L2_TUNER_CAP_LOW)
+ addLabel("RF Frequency (kHz)");
+ else
+ addLabel("RF Frequency (MHz)");
+ addWidget(m_freqRf);
+ }
+
if (m_modulator.capability) {
QDoubleValidator *val;
- const char *unit = (m_modulator.capability & V4L2_TUNER_CAP_LOW) ? "kHz" : "MHz";
+ const char *unit = (m_tuner.capability & V4L2_TUNER_CAP_LOW) ? "kHz" :
+ (m_tuner.capability & V4L2_TUNER_CAP_1HZ ? "Hz" : "MHz");
- val = new QDoubleValidator(m_modulator.rangelow / 16, m_modulator.rangehigh / 16, 3, parent);
+ m_freqFac = (m_tuner.capability & V4L2_TUNER_CAP_1HZ) ? 1 : 16;
+ val = new QDoubleValidator(m_modulator.rangelow / m_freqFac, m_modulator.rangehigh / m_freqFac, 3, parent);
m_freq = new QLineEdit(parent);
m_freq->setValidator(val);
m_freq->setWhatsThis(QString("Frequency\nLow: %1 %3\nHigh: %2 %3")
- .arg(m_tuner.rangelow / 16)
- .arg((double)m_tuner.rangehigh / 16, 0, 'f', 2)
+ .arg(m_tuner.rangelow / m_freqFac)
+ .arg((double)m_tuner.rangehigh / m_freqFac, 0, 'f', 2)
.arg(unit));
m_freq->setStatusTip(m_freq->whatsThis());
connect(m_freq, SIGNAL(lostFocus()), SLOT(freqChanged()));
connect(m_freq, SIGNAL(returnPressed()), SLOT(freqChanged()));
updateFreq();
- if (m_modulator.capability & V4L2_TUNER_CAP_LOW)
+ if (m_modulator.capability & V4L2_TUNER_CAP_1HZ)
+ addLabel("Frequency (Hz)");
+ else if (m_modulator.capability & V4L2_TUNER_CAP_LOW)
addLabel("Frequency (kHz)");
else
addLabel("Frequency (MHz)");
addWidget(m_freq);
+ }
+ if (m_modulator.capability && !isSDR()) {
if (m_modulator.capability & V4L2_TUNER_CAP_STEREO) {
addLabel("Stereo");
m_stereoMode = new QCheckBox(parent);
void GeneralTab::freqChanged()
{
double f = m_freq->text().toDouble();
+ v4l2_frequency freq;
- if (m_freq->hasAcceptableInput())
- s_frequency(f * 16, m_isRadio);
+ if (m_freq->hasAcceptableInput()) {
+ g_frequency(freq);
+ freq.frequency = f * m_freqFac;
+ s_frequency(freq);
+ }
updateFreq();
}
+void GeneralTab::freqRfChanged()
+{
+ double f = m_freqRf->text().toDouble();
+ v4l2_frequency freq;
+
+ if (m_freqRf->hasAcceptableInput()) {
+ g_frequency(freq, 1);
+ freq.frequency = f * m_freqRfFac;
+ s_frequency(freq);
+ }
+ updateFreqRf();
+}
+
void GeneralTab::audioModeChanged(int)
{
m_tuner.audmode = m_audioModes[m_audioMode->currentIndex()];
g_frequency(f);
/* m_freq listens to valueChanged block it to avoid recursion */
m_freq->blockSignals(true);
- m_freq->setText(QString::number(f.frequency / 16.0));
+ m_freq->setText(QString::number(f.frequency / m_freqFac));
m_freq->blockSignals(false);
}
m_freqChannel->addItem(list[i].name);
}
+void GeneralTab::updateFreqRf()
+{
+ v4l2_frequency f;
+
+ g_frequency(f, 1);
+ /* m_freqRf listens to valueChanged block it to avoid recursion */
+ m_freqRf->blockSignals(true);
+ m_freqRf->setText(QString::number(f.frequency / m_freqRfFac));
+ m_freqRf->blockSignals(false);
+}
+
void GeneralTab::updateVidCapFormat()
{
v4l2_fmtdesc desc;
void ApplicationWindow::opendev()
{
- QFileDialog d(this, "Select v4l device", "/dev", "V4L Devices (video* vbi* radio*)");
+ QFileDialog d(this, "Select v4l device", "/dev", "V4L Devices (video* vbi* radio* swradio*)");
d.setFilter(QDir::AllDirs | QDir::Files | QDir::System);
d.setFileMode(QFileDialog::ExistingFile);
void ApplicationWindow::openrawdev()
{
- QFileDialog d(this, "Select v4l device", "/dev", "V4L Devices (video* vbi* radio*)");
+ QFileDialog d(this, "Select v4l device", "/dev", "V4L Devices (video* vbi* radio* swradio*)");
d.setFilter(QDir::AllDirs | QDir::Files | QDir::System);
d.setFileMode(QFileDialog::ExistingFile);
" qv4l2 [-R] [-h] [-d <dev>] [-r <dev>] [-V <dev>]\n"
"\n -d, --device=<dev> use device <dev> as the video device\n"
" if <dev> is a number, then /dev/video<dev> is used\n"
- " -r, --radio-device=<dev> use device <dev> as the radio device\n"
- " if <dev> is a number, then /dev/radio<dev> is used\n"
" -V, --vbi-device=<dev> use device <dev> as the vbi device\n"
" if <dev> is a number, then /dev/vbi<dev> is used\n"
+ " -r, --radio-device=<dev> use device <dev> as the radio device\n"
+ " if <dev> is a number, then /dev/radio<dev> is used\n"
+ " -S, --sdr-device=<dev> use device <dev> as the SDR device\n"
+ " if <dev> is a number, then /dev/swradio<dev> is used\n"
" -h, --help display this help message\n"
" -R, --raw open device in raw mode.\n");
}
bool raw = false;
QString device;
QString video_device;
- QString radio_device;
QString vbi_device;
+ QString radio_device;
+ QString sdr_device;
a.setWindowIcon(QIcon(":/qv4l2.png"));
g_mw = new ApplicationWindow();
usageError("-d");
return 0;
}
+ } else if (args[i] == "-V" || args[i] == "--vbi-device") {
+ ++i;
+ if (i >= args.size()) {
+ usageError("-V");
+ return 0;
+ }
+ vbi_device = args[i];
+ if (vbi_device.startsWith("-")) {
+ usageError("-V");
+ return 0;
+ }
} else if (args[i] == "-r" || args[i] == "--radio-device") {
++i;
if (i >= args.size()) {
usageError("-r");
return 0;
}
-
- } else if (args[i] == "-V" || args[i] == "--vbi-device") {
+ } else if (args[i] == "-S" || args[i] == "--sdr-device") {
++i;
if (i >= args.size()) {
- usageError("-V");
+ usageError("-S");
return 0;
}
- vbi_device = args[i];
- if (vbi_device.startsWith("-")) {
- usageError("-V");
+ sdr_device = args[i];
+ if (sdr_device.startsWith("-")) {
+ usageError("-S");
return 0;
}
-
} else if (args[i].startsWith("--device")) {
QStringList param = args[i].split("=");
if (param.size() == 2) {
usageError("--device");
return 0;
}
-
+ } else if (args[i].startsWith("--vbi-device")) {
+ QStringList param = args[i].split("=");
+ if (param.size() == 2) {
+ vbi_device = param[1];
+ } else {
+ usageError("--vbi-device");
+ return 0;
+ }
} else if (args[i].startsWith("--radio-device")) {
QStringList param = args[i].split("=");
if (param.size() == 2) {
usageError("--radio-device");
return 0;
}
-
-
- } else if (args[i].startsWith("--vbi-device")) {
+ } else if (args[i].startsWith("--sdr-device")) {
QStringList param = args[i].split("=");
if (param.size() == 2) {
- vbi_device = param[1];
+ sdr_device = param[1];
} else {
- usageError("--vbi-device");
+ usageError("--sdr-device");
return 0;
}
-
} else if (args[i] == "-h" || args[i] == "--help") {
usage();
return 0;
if (video_device != NULL)
device = getDeviceName("/dev/video", video_device);
- else if (radio_device != NULL)
- device = getDeviceName("/dev/radio", radio_device);
else if (vbi_device != NULL)
device = getDeviceName("/dev/vbi", vbi_device);
+ else if (radio_device != NULL)
+ device = getDeviceName("/dev/radio", radio_device);
+ else if (sdr_device != NULL)
+ device = getDeviceName("/dev/swradio", sdr_device);
else
device = "/dev/video0";