kopia lustrzana https://github.com/jamescoxon/dl-fldigi
TX Attenuator
* Added Tx attenuator control to Audio configuration tab * Added main dialog short cut keys for tx attenuator control alt - ==> decrease by 0.1 dB alt = ==> increase by 0.1 dB * Modify two-tone generator in Olivia / Contestia to avoid remultiplication by txlevelpull/2/head
rodzic
46339070c7
commit
24ce84eb97
|
@ -88,25 +88,26 @@ void contestia::tx_init(SoundBase *sc)
|
|||
|
||||
void contestia::send_tones()
|
||||
{
|
||||
if (tone_midfreq != txbasefreq || tone_bw != bandwidth) {
|
||||
double freqa, freqb;
|
||||
tone_bw = bandwidth;
|
||||
tone_midfreq = txbasefreq;
|
||||
if (reverse) {
|
||||
freqa = tone_midfreq + (tone_bw / 2.0);
|
||||
freqb = tone_midfreq - (tone_bw / 2.0);
|
||||
} else {
|
||||
freqa = tone_midfreq - (tone_bw / 2.0);
|
||||
freqb = tone_midfreq + (tone_bw / 2.0);
|
||||
}
|
||||
preamblephase = 0;
|
||||
for (int i = 0; i < SR4; i++)
|
||||
tonebuff[2*SR4 + i] = tonebuff[i] = nco(freqa) * ampshape[i];
|
||||
double freqa, freqb;
|
||||
tone_bw = bandwidth;
|
||||
tone_midfreq = txbasefreq;
|
||||
|
||||
preamblephase = 0;
|
||||
for (int i = 0; i < SR4; i++)
|
||||
tonebuff[3*SR4 + i] = tonebuff[SR4 + i] = nco(freqb) * ampshape[i];
|
||||
if (reverse) {
|
||||
freqa = tone_midfreq + (tone_bw / 2.0);
|
||||
freqb = tone_midfreq - (tone_bw / 2.0);
|
||||
} else {
|
||||
freqa = tone_midfreq - (tone_bw / 2.0);
|
||||
freqb = tone_midfreq + (tone_bw / 2.0);
|
||||
}
|
||||
|
||||
preamblephase = 0;
|
||||
for (int i = 0; i < SR4; i++)
|
||||
tonebuff[2*SR4 + i] = tonebuff[i] = nco(freqa) * ampshape[i];
|
||||
|
||||
preamblephase = 0;
|
||||
for (int i = 0; i < SR4; i++)
|
||||
tonebuff[3*SR4 + i] = tonebuff[SR4 + i] = nco(freqb) * ampshape[i];
|
||||
|
||||
for (int j = 0; j < TONE_DURATION; j += SCBLOCKSIZE)
|
||||
ModulateXmtr(&tonebuff[j], SCBLOCKSIZE);
|
||||
|
||||
|
|
|
@ -2417,6 +2417,14 @@ static void cb_valPCMvolume(Fl_Value_Slider2* o, void*) {
|
|||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabTxLevel=(Fl_Group *)0;
|
||||
|
||||
Fl_Counter *valTxLevel=(Fl_Counter *)0;
|
||||
|
||||
static void cb_valTxLevel(Fl_Counter* o, void*) {
|
||||
progdefaults.txlevel=o->value();
|
||||
}
|
||||
|
||||
Fl_Group *tabID=(Fl_Group *)0;
|
||||
|
||||
Fl_Check_Button *btnsendid=(Fl_Check_Button *)0;
|
||||
|
@ -4116,7 +4124,6 @@ an merging"));
|
|||
cntCWdash2dot->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
cntCWdash2dot->minimum(2.5);
|
||||
cntCWdash2dot->maximum(4);
|
||||
cntCWdash2dot->step(0.1);
|
||||
cntCWdash2dot->value(3);
|
||||
cntCWdash2dot->callback((Fl_Callback*)cb_cntCWdash2dot);
|
||||
cntCWdash2dot->align(FL_ALIGN_RIGHT);
|
||||
|
@ -4136,7 +4143,6 @@ an merging"));
|
|||
cntCWrisetime->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
cntCWrisetime->minimum(0);
|
||||
cntCWrisetime->maximum(15);
|
||||
cntCWrisetime->step(0.1);
|
||||
cntCWrisetime->value(4);
|
||||
cntCWrisetime->callback((Fl_Callback*)cb_cntCWrisetime);
|
||||
cntCWrisetime->align(FL_ALIGN_RIGHT);
|
||||
|
@ -4345,7 +4351,6 @@ an merging"));
|
|||
valDominoEX_BW->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
valDominoEX_BW->minimum(1);
|
||||
valDominoEX_BW->maximum(2);
|
||||
valDominoEX_BW->step(0.1);
|
||||
valDominoEX_BW->value(1.5);
|
||||
valDominoEX_BW->callback((Fl_Callback*)cb_valDominoEX_BW);
|
||||
valDominoEX_BW->align(FL_ALIGN_RIGHT);
|
||||
|
@ -4369,7 +4374,6 @@ an merging"));
|
|||
valDomCWI->labelfont(0);
|
||||
valDomCWI->labelsize(14);
|
||||
valDomCWI->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
valDomCWI->step(0.01);
|
||||
valDomCWI->textsize(14);
|
||||
valDomCWI->callback((Fl_Callback*)cb_valDomCWI);
|
||||
valDomCWI->align(FL_ALIGN_TOP);
|
||||
|
@ -5005,7 +5009,6 @@ an merging"));
|
|||
valTHOR_BW->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
valTHOR_BW->minimum(1);
|
||||
valTHOR_BW->maximum(2);
|
||||
valTHOR_BW->step(0.1);
|
||||
valTHOR_BW->value(1.5);
|
||||
valTHOR_BW->callback((Fl_Callback*)cb_valTHOR_BW);
|
||||
valTHOR_BW->align(FL_ALIGN_RIGHT);
|
||||
|
@ -5023,7 +5026,6 @@ an merging"));
|
|||
valThorCWI->labelfont(0);
|
||||
valThorCWI->labelsize(14);
|
||||
valThorCWI->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
valThorCWI->step(0.01);
|
||||
valThorCWI->textsize(14);
|
||||
valThorCWI->callback((Fl_Callback*)cb_valThorCWI);
|
||||
valThorCWI->align(FL_ALIGN_TOP);
|
||||
|
@ -5760,7 +5762,6 @@ ll with your audio device."));
|
|||
valPCMvolume->labelfont(0);
|
||||
valPCMvolume->labelsize(14);
|
||||
valPCMvolume->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
valPCMvolume->step(0.01);
|
||||
valPCMvolume->value(0.8);
|
||||
valPCMvolume->textsize(14);
|
||||
valPCMvolume->callback((Fl_Callback*)cb_valPCMvolume);
|
||||
|
@ -5772,6 +5773,23 @@ ll with your audio device."));
|
|||
} // Fl_Group* o
|
||||
tabMixer->end();
|
||||
} // Fl_Group* tabMixer
|
||||
{ tabTxLevel = new Fl_Group(0, 50, 500, 320, _("TxLevel"));
|
||||
tabTxLevel->hide();
|
||||
{ Fl_Group* o = new Fl_Group(5, 60, 490, 86, _("Tx Attenuator"));
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
|
||||
{ Fl_Counter* o = valTxLevel = new Fl_Counter(196, 85, 120, 21, _("Tx Atten (dB)"));
|
||||
valTxLevel->minimum(-30);
|
||||
valTxLevel->maximum(0);
|
||||
valTxLevel->value(-6);
|
||||
valTxLevel->callback((Fl_Callback*)cb_valTxLevel);
|
||||
o->value(progdefaults.txlevel);
|
||||
o->lstep(1.0);
|
||||
} // Fl_Counter* valTxLevel
|
||||
o->end();
|
||||
} // Fl_Group* o
|
||||
tabTxLevel->end();
|
||||
} // Fl_Group* tabTxLevel
|
||||
tabsSoundCard->end();
|
||||
} // Fl_Tabs* tabsSoundCard
|
||||
tabSoundCard->end();
|
||||
|
@ -5954,7 +5972,6 @@ d frequency"));
|
|||
val_pretone->tooltip(_("Use for triggering amplifier carrier detect"));
|
||||
val_pretone->minimum(0);
|
||||
val_pretone->maximum(10);
|
||||
val_pretone->step(0.1);
|
||||
val_pretone->callback((Fl_Callback*)cb_val_pretone);
|
||||
o->value(progdefaults.pretone);
|
||||
} // Fl_Counter* val_pretone
|
||||
|
|
|
@ -188,7 +188,7 @@ progdefaults.changed = true;}
|
|||
label UI open
|
||||
xywh {0 25 502 346} hide
|
||||
} {
|
||||
Fl_Tabs tabsUI {open
|
||||
Fl_Tabs tabsUI {
|
||||
xywh {0 25 502 346} selection_color 50
|
||||
} {
|
||||
Fl_Group tabUserInterface {
|
||||
|
@ -1188,7 +1188,7 @@ behaves inside the waterfall} xywh {15 196 150 22} down_box BORDER_BOX align 8
|
|||
}
|
||||
}
|
||||
Fl_Group tabModems {
|
||||
label Modems open
|
||||
label Modems
|
||||
xywh {-4 25 521 347} hide
|
||||
} {
|
||||
Fl_Tabs tabsModems {open
|
||||
|
@ -2792,7 +2792,7 @@ progdefaults.changed = true;}
|
|||
}
|
||||
}
|
||||
Fl_Group tabSoundCard {
|
||||
label Audio
|
||||
label Audio open
|
||||
tooltip {Audio devices} xywh {0 25 500 345} hide
|
||||
} {
|
||||
Fl_Tabs tabsSoundCard {open
|
||||
|
@ -3039,6 +3039,23 @@ progdefaults.changed = true;}
|
|||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabTxLevel {
|
||||
label TxLevel open
|
||||
xywh {0 50 500 320} hide
|
||||
} {
|
||||
Fl_Group {} {
|
||||
label {Tx Attenuator} open
|
||||
xywh {5 60 490 86} box ENGRAVED_FRAME align 21
|
||||
} {
|
||||
Fl_Counter valTxLevel {
|
||||
label {Tx Atten (dB)}
|
||||
callback {progdefaults.txlevel=o->value();}
|
||||
xywh {196 85 120 21} minimum -30 maximum 0 value -6
|
||||
code0 {o->value(progdefaults.txlevel);}
|
||||
code1 {o->lstep(1.0);}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabID {
|
||||
|
@ -3230,7 +3247,7 @@ progdefaults.changed = true;}
|
|||
}
|
||||
}
|
||||
Fl_Group tabMisc {
|
||||
label Misc open
|
||||
label Misc
|
||||
xywh {0 25 500 345} hide
|
||||
} {
|
||||
Fl_Tabs tabsMisc {open
|
||||
|
|
|
@ -2298,6 +2298,26 @@ int default_handler(int event)
|
|||
w->take_focus(); // remove this to leave tx text focused
|
||||
return 1;
|
||||
}
|
||||
#ifdef __APPLE__
|
||||
if ((key == '=') && (Fl::event_state() == FL_COMMAND)) {
|
||||
#else
|
||||
if (key == '=' && Fl::event_alt()) {
|
||||
#endif
|
||||
progdefaults.txlevel += 0.1;
|
||||
if (progdefaults.txlevel > 0) progdefaults.txlevel = 0;
|
||||
valTxLevel->value(progdefaults.txlevel);
|
||||
return 1;
|
||||
}
|
||||
#ifdef __APPLE__
|
||||
if ((key == '-') && (Fl::event_state() == FL_COMMAND)) {
|
||||
#else
|
||||
if (key == '-' && Fl::event_alt()) {
|
||||
#endif
|
||||
progdefaults.txlevel -= 0.1;
|
||||
if (progdefaults.txlevel < -30) progdefaults.txlevel = -30;
|
||||
valTxLevel->value(progdefaults.txlevel);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (w == dlgLogbook || w->window() == dlgLogbook)
|
||||
return log_search_handler(event);
|
||||
|
|
|
@ -329,6 +329,8 @@ extern void setMixerInput(int);
|
|||
extern Fl_Light_Button *btnLineIn;
|
||||
extern void setPCMvolume(double);
|
||||
extern Fl_Value_Slider2 *valPCMvolume;
|
||||
extern Fl_Group *tabTxLevel;
|
||||
extern Fl_Counter *valTxLevel;
|
||||
extern Fl_Group *tabID;
|
||||
extern Fl_Check_Button *btnsendid;
|
||||
extern Fl_Check_Button *btnsendvideotext;
|
||||
|
|
|
@ -947,6 +947,9 @@
|
|||
ELEM_(double, PCMvolume, "PCMVOLUME", \
|
||||
"PCM channel level", \
|
||||
0.8) \
|
||||
ELEM_(double, txlevel, "TXATTEN", \
|
||||
"TX attenuator (db) -30 .. 0", \
|
||||
-3.0) \
|
||||
ELEM_(bool, MuteInput, "MUTEINPUT", \
|
||||
"This setting is currently unused", \
|
||||
true) \
|
||||
|
|
|
@ -89,25 +89,26 @@ void olivia::tx_init(SoundBase *sc)
|
|||
|
||||
void olivia::send_tones()
|
||||
{
|
||||
if (tone_midfreq != txbasefreq || tone_bw != bandwidth) {
|
||||
double freqa, freqb;
|
||||
tone_bw = bandwidth;
|
||||
tone_midfreq = txbasefreq;
|
||||
if (reverse) {
|
||||
freqa = tone_midfreq + (tone_bw / 2.0);
|
||||
freqb = tone_midfreq - (tone_bw / 2.0);
|
||||
} else {
|
||||
freqa = tone_midfreq - (tone_bw / 2.0);
|
||||
freqb = tone_midfreq + (tone_bw / 2.0);
|
||||
}
|
||||
preamblephase = 0;
|
||||
for (int i = 0; i < SR4; i++)
|
||||
tonebuff[2*SR4 + i] = tonebuff[i] = nco(freqa) * ampshape[i];
|
||||
double freqa, freqb;
|
||||
tone_bw = bandwidth;
|
||||
tone_midfreq = txbasefreq;
|
||||
|
||||
preamblephase = 0;
|
||||
for (int i = 0; i < SR4; i++)
|
||||
tonebuff[3*SR4 + i] = tonebuff[SR4 + i] = nco(freqb) * ampshape[i];
|
||||
if (reverse) {
|
||||
freqa = tone_midfreq + (tone_bw / 2.0);
|
||||
freqb = tone_midfreq - (tone_bw / 2.0);
|
||||
} else {
|
||||
freqa = tone_midfreq - (tone_bw / 2.0);
|
||||
freqb = tone_midfreq + (tone_bw / 2.0);
|
||||
}
|
||||
|
||||
preamblephase = 0;
|
||||
for (int i = 0; i < SR4; i++)
|
||||
tonebuff[2*SR4 + i] = tonebuff[i] = nco(freqa) * ampshape[i];
|
||||
|
||||
preamblephase = 0;
|
||||
for (int i = 0; i < SR4; i++)
|
||||
tonebuff[3*SR4 + i] = tonebuff[SR4 + i] = nco(freqb) * ampshape[i];
|
||||
|
||||
for (int j = 0; j < TONE_DURATION; j += SCBLOCKSIZE)
|
||||
ModulateXmtr(&tonebuff[j], SCBLOCKSIZE);
|
||||
|
||||
|
|
|
@ -376,7 +376,15 @@ void modem::ModulateXmtr(double *buffer, int len)
|
|||
ModulateStereo( buffer, PTTchannel, len);
|
||||
return;
|
||||
}
|
||||
|
||||
if (progdefaults.viewXmtSignal)
|
||||
trx_xmit_wfall_queue(samplerate, buffer, (size_t)len);
|
||||
|
||||
if (withnoise && progdefaults.noise) add_noise(buffer, len);
|
||||
|
||||
double mult = pow(10, progdefaults.txlevel / 20.0);
|
||||
for (int i = 0; i < len; i++) buffer[i] *= mult;
|
||||
|
||||
try {
|
||||
unsigned n = 4;
|
||||
while (scard->Write(buffer, len) == 0 && --n);
|
||||
|
@ -388,15 +396,20 @@ void modem::ModulateXmtr(double *buffer, int len)
|
|||
return;
|
||||
}
|
||||
|
||||
if (progdefaults.viewXmtSignal)
|
||||
trx_xmit_wfall_queue(samplerate, buffer, (size_t)len);
|
||||
}
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
void modem::ModulateStereo(double *left, double *right, int len)
|
||||
{
|
||||
if (progdefaults.viewXmtSignal)
|
||||
trx_xmit_wfall_queue(samplerate, left, (size_t)len);
|
||||
|
||||
if (withnoise && progdefaults.noise) add_noise(left, len);
|
||||
|
||||
double mult = pow(10, progdefaults.txlevel / 20.0);
|
||||
for (int i = 0; i < len; i++) left[i] *= mult;
|
||||
|
||||
try {
|
||||
unsigned n = 4;
|
||||
while (scard->Write_stereo(left, right, len) == 0 && --n);
|
||||
|
@ -408,8 +421,6 @@ void modem::ModulateStereo(double *left, double *right, int len)
|
|||
return;
|
||||
}
|
||||
|
||||
if (progdefaults.viewXmtSignal)
|
||||
trx_xmit_wfall_queue(samplerate, left, (size_t)len);
|
||||
}
|
||||
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue