Do tuner gain setting properly.
(cherry picked from commit c06a537c8143af8e363fde677043053cefff1612)
This commit is contained in:
parent
e54b290601
commit
e701f883b3
56
dump1090.c
56
dump1090.c
|
@ -235,17 +235,55 @@ int modesInitRTLSDR(void) {
|
||||||
rtlsdr_set_tuner_gain_mode(Modes.dev,
|
rtlsdr_set_tuner_gain_mode(Modes.dev,
|
||||||
(Modes.gain == MODES_AUTO_GAIN) ? 0 : 1);
|
(Modes.gain == MODES_AUTO_GAIN) ? 0 : 1);
|
||||||
if (Modes.gain != MODES_AUTO_GAIN) {
|
if (Modes.gain != MODES_AUTO_GAIN) {
|
||||||
if (Modes.gain == MODES_MAX_GAIN) {
|
int *gains;
|
||||||
// Find the maximum gain available
|
|
||||||
int numgains;
|
int numgains;
|
||||||
int gains[100];
|
|
||||||
|
|
||||||
numgains = rtlsdr_get_tuner_gains(Modes.dev, gains);
|
numgains = rtlsdr_get_tuner_gains(Modes.dev, NULL);
|
||||||
Modes.gain = gains[numgains-1];
|
if (numgains <= 0) {
|
||||||
fprintf(stderr, "Max available gain is: %.2f\n", Modes.gain/10.0);
|
fprintf(stderr, "Error getting tuner gains\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
gains = malloc(numgains * sizeof(int));
|
||||||
|
if (rtlsdr_get_tuner_gains(Modes.dev, gains) != numgains) {
|
||||||
|
fprintf(stderr, "Error getting tuner gains\n");
|
||||||
|
free(gains);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Modes.gain == MODES_MAX_GAIN) {
|
||||||
|
int highest = -1;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < numgains; ++i) {
|
||||||
|
if (gains[i] > highest)
|
||||||
|
highest = gains[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
Modes.gain = highest;
|
||||||
|
fprintf(stderr, "Max available gain is: %.2f dB\n", Modes.gain/10.0);
|
||||||
|
} else {
|
||||||
|
int closest = -1;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < numgains; ++i) {
|
||||||
|
if (closest == -1 || abs(gains[i] - Modes.gain) < abs(closest - Modes.gain))
|
||||||
|
closest = gains[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (closest != Modes.gain) {
|
||||||
|
Modes.gain = closest;
|
||||||
|
fprintf(stderr, "Closest available gain: %.2f dB\n", Modes.gain/10.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(gains);
|
||||||
|
|
||||||
|
fprintf(stderr, "Setting gain to: %.2f dB\n", Modes.gain/10.0);
|
||||||
|
if (rtlsdr_set_tuner_gain(Modes.dev, Modes.gain) < 0) {
|
||||||
|
fprintf(stderr, "Error setting tuner gains\n");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
rtlsdr_set_tuner_gain(Modes.dev, Modes.gain);
|
|
||||||
fprintf(stderr, "Setting gain to: %.2f\n", Modes.gain/10.0);
|
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Using automatic gain control.\n");
|
fprintf(stderr, "Using automatic gain control.\n");
|
||||||
}
|
}
|
||||||
|
@ -255,7 +293,7 @@ int modesInitRTLSDR(void) {
|
||||||
rtlsdr_set_sample_rate(Modes.dev, Modes.oversample ? MODES_OVERSAMPLE_RATE : MODES_DEFAULT_RATE);
|
rtlsdr_set_sample_rate(Modes.dev, Modes.oversample ? MODES_OVERSAMPLE_RATE : MODES_DEFAULT_RATE);
|
||||||
|
|
||||||
rtlsdr_reset_buffer(Modes.dev);
|
rtlsdr_reset_buffer(Modes.dev);
|
||||||
fprintf(stderr, "Gain reported by device: %.2f\n",
|
fprintf(stderr, "Gain reported by device: %.2f dB\n",
|
||||||
rtlsdr_get_tuner_gain(Modes.dev)/10.0);
|
rtlsdr_get_tuner_gain(Modes.dev)/10.0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue