Added AGC + Started working on channel selection

This commit is contained in:
Ryzerth 2020-12-07 04:13:16 +01:00
parent e5123dd8bf
commit 929ca50b06
4 changed files with 61 additions and 44 deletions

View File

@ -123,9 +123,8 @@ void windowInit() {
// TODO for 0.2.5
// Add "select folder" option for the file source
// FIX AUDIO ISSUE ON BOTH LINUX AND SOMETIMES WINDOWS (probly the ring buffer, though double buffering could help)
// Add default main config to avoid having to ship one
// Have a good directory system on both linux and windows
// Have a good directory system on both linux and windows (should fix occassional underruns)
// Switch to double buffering
// TODO for 0.2.6

View File

@ -1,27 +1,10 @@
{
"audio": {
"Radio": {
"device": "Speakers (Realtek High Definiti",
"sampleRate": 48000.0,
"volume": 0.4609375
},
"Radio 1": {
"device": "Speakers (Realtek High Definition Audio)",
"sampleRate": 48000.0,
"volume": 0.609375
},
"Radio 2": {
"device": "CABLE Input (VB-Audio Virtual Cable)",
"sampleRate": 48000.0,
"volume": 1.0
}
},
"bandPlan": "General",
"bandPlanEnabled": true,
"fftHeight": 296,
"frequency": 99000000,
"max": 0.0,
"maximized": false,
"maximized": true,
"menuOrder": [
"Source",
"Radio",
@ -33,7 +16,7 @@
"Display"
],
"menuWidth": 300,
"min": -54.41176986694336,
"min": -70.5882339477539,
"offset": 0.0,
"showWaterfall": true,
"source": "SoapySDR",
@ -42,17 +25,7 @@
"Radio": {
"muted": false,
"sink": "Audio",
"volume": 0.6887755393981934
},
"Radio 1": {
"muted": true,
"sink": "Audio",
"volume": 0.625
},
"Radio 2": {
"muted": false,
"sink": "Audio",
"volume": 1.0
"volume": 0.4285714328289032
}
},
"windowSize": {

View File

@ -18,11 +18,12 @@
"sampleRate": 96000.0
},
"Default Device": {
"sampleRate": 32000.0
"sampleRate": 192000.0
},
"Generic RTL2832U OEM :: 00000001": {
"agc": false,
"gains": {
"TUNER": 23.406999588012695
"TUNER": 37.3390007019043
},
"sampleRate": 2560000.0
},

View File

@ -114,20 +114,22 @@ private:
SoapySDR::Device* dev = SoapySDR::Device::make(devArgs);
gainList = dev->listGains(SOAPY_SDR_RX, 0);
gainList = dev->listGains(SOAPY_SDR_RX, channelId);
delete[] uiGains;
uiGains = new float[gainList.size()];
for (auto gain : gainList) {
gainRanges.push_back(dev->getGainRange(SOAPY_SDR_RX, 0, gain));
gainRanges.push_back(dev->getGainRange(SOAPY_SDR_RX, channelId, gain));
}
sampleRates = dev->listSampleRates(SOAPY_SDR_RX, 0);
sampleRates = dev->listSampleRates(SOAPY_SDR_RX, channelId);
txtSrList = "";
for (double sr : sampleRates) {
txtSrList += std::to_string((int)sr);
txtSrList += '\0';
}
hasAgc = dev->hasGainMode(SOAPY_SDR_RX, channelId);
SoapySDR::Device::unmake(dev);
config.aquire();
@ -137,16 +139,33 @@ private:
if (config.conf["devices"][name]["gains"].contains(gain)) {
uiGains[i] = config.conf["devices"][name]["gains"][gain];
}
else {
uiGains[i] = gainRanges[i].minimum();
}
i++;
}
if (hasAgc && config.conf["devices"][name].contains("agc")) {
agc = config.conf["devices"][name]["agc"];
}
else {
agc = false;
}
if (config.conf["devices"][name].contains("sampleRate")) {
selectSampleRate(config.conf["devices"][name]["sampleRate"]);
}
else {
selectSampleRate(sampleRates[0]);
}
}
else {
int i = 0;
for (auto gain : gainList) {
uiGains[i] = gainRanges[i].minimum();
i++;
}
if (hasAgc) {
agc = false;
}
selectSampleRate(sampleRates[0]); // Select default
}
config.release();
@ -161,6 +180,9 @@ private:
conf["gains"][gain] = uiGains[i];
i++;
}
if (hasAgc) {
conf["agc"] = agc;
}
config.aquire();
config.conf["devices"][devArgs["label"]] = conf;
config.release(true);
@ -184,15 +206,19 @@ private:
SoapyModule* _this = (SoapyModule*)ctx;
_this->dev = SoapySDR::Device::make(_this->devArgs);
_this->dev->setSampleRate(SOAPY_SDR_RX, 0, _this->sampleRate);
_this->dev->setSampleRate(SOAPY_SDR_RX, _this->channelId, _this->sampleRate);
int i = 0;
for (auto gain : _this->gainList) {
_this->dev->setGain(SOAPY_SDR_RX, 0, gain, _this->uiGains[i]);
_this->dev->setGain(SOAPY_SDR_RX, _this->channelId, gain, _this->uiGains[i]);
i++;
}
_this->dev->setFrequency(SOAPY_SDR_RX, 0, _this->freq);
if (_this->hasAgc) {
_this->dev->setGainMode(SOAPY_SDR_RX, _this->channelId, _this->agc);
}
_this->dev->setFrequency(SOAPY_SDR_RX, _this->channelId, _this->freq);
_this->devStream = _this->dev->setupStream(SOAPY_SDR_RX, "CF32");
_this->dev->activateStream(_this->devStream);
@ -218,12 +244,11 @@ private:
SoapyModule* _this = (SoapyModule*)ctx;
_this->freq = freq;
if (_this->running) {
_this->dev->setFrequency(SOAPY_SDR_RX, 0, freq);
_this->dev->setFrequency(SOAPY_SDR_RX, _this->channelId, freq);
}
spdlog::info("SoapyModule '{0}': Tune: {1}!", _this->name, freq);
}
static void menuHandler(void* ctx) {
SoapyModule* _this = (SoapyModule*)ctx;
@ -269,6 +294,21 @@ private:
}
gainNameLen += 5.0f;
if (_this->hasAgc) {
if (ImGui::Checkbox((std::string("AGC##_agc_sel_") + _this->name).c_str(), &_this->agc)) {
if (_this->running) { _this->dev->setGainMode(SOAPY_SDR_RX, _this->channelId, _this->agc); }
// When disabled, reset the gains
if (!_this->agc) {
int i = 0;
for (auto gain : _this->gainList) {
_this->dev->setGain(SOAPY_SDR_RX, _this->channelId, gain, _this->uiGains[i]);
i++;
}
}
_this->saveCurrent();
}
}
int i = 0;
for (auto gain : _this->gainList) {
ImGui::Text("%s gain", gain.c_str());
@ -278,7 +318,7 @@ private:
if (ImGui::SliderFloat((gain + std::string("##_gain_sel_") + _this->name).c_str(), &_this->uiGains[i],
_this->gainRanges[i].minimum(), _this->gainRanges[i].maximum())) {
if (_this->running) {
_this->dev->setGain(SOAPY_SDR_RX, 0, gain, _this->uiGains[i]);
_this->dev->setGain(SOAPY_SDR_RX, _this->channelId, gain, _this->uiGains[i]);
}
_this->saveCurrent();
}
@ -315,9 +355,13 @@ private:
double freq;
double sampleRate;
bool running = false;
bool hasAgc = false;
bool agc = false;
std::vector<double> sampleRates;
int srId = -1;
float* uiGains;
int channelCount = 1;
int channelId = 0;
std::vector<std::string> gainList;
std::vector<SoapySDR::Range> gainRanges;
};