Right Channel audio

* Write silence stream to right channel if not enabled
  * Added separate tab for right channel configuration items
  * Replicated right channel control items on the new tab.
    Original controls on PTT, CW and RTTY tabs or the
    replicants may be toggled to control right channel
    operation
  * Added check button to enable reversal of left-right audio
    channels
pull/2/head
David Freese 2011-12-09 03:41:13 -06:00
rodzic 00d4308ef9
commit a68d917066
7 zmienionych plików z 336 dodań i 104 usunięć

Wyświetl plik

@ -1165,12 +1165,15 @@ progdefaults.changed = true;
Fl_Check_Button *btnQSK=(Fl_Check_Button *)0;
static void cb_btnQSK(Fl_Check_Button* o, void*) {
if (o->value() && !sound_check_right_channel()) {
o->value(0);
return;
}
progdefaults.QSK = o->value();
progdefaults.QSK = o->value();
progdefaults.changed = true;
if (o->value()) {
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
progdefaults.PTTrightchannel = false;
btnPTTrightchannel->value(0);
}
btnQSK2->value(o->value());
}
Fl_Counter2 *cntPreTiming=(Fl_Counter2 *)0;
@ -1729,12 +1732,15 @@ progdefaults.changed = true;
Fl_Check_Button *chkPseudoFSK=(Fl_Check_Button *)0;
static void cb_chkPseudoFSK(Fl_Check_Button* o, void*) {
if (o->value() && !sound_check_right_channel()) {
o->value(0);
return;
}
progdefaults.PseudoFSK = o->value();
progdefaults.PseudoFSK = o->value();
progdefaults.changed = true;
if (o->value()) {
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
progdefaults.PTTrightchannel = false;
btnPTTrightchannel->value(0);
}
chkPseudoFSK2->value(o->value());
}
Fl_Choice *mnuRTTYAFCSpeed=(Fl_Choice *)0;
@ -1903,12 +1909,17 @@ progdefaults.changed = true;
Fl_Check_Button *btnPTTrightchannel=(Fl_Check_Button *)0;
static void cb_btnPTTrightchannel(Fl_Check_Button* o, void*) {
if (o->value() && !sound_check_right_channel()) {
o->value(0);
return;
progdefaults.PTTrightchannel = o->value();
if (o->value()) {
progdefaults.QSK = false;
btnQSK->value(0);
progdefaults.PseudoFSK = false;
chkPseudoFSK->value(0);
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
}
progdefaults.PTTrightchannel = o->value();
progdefaults.changed = true;
btnPTTrightchannel2->value(o->value());
}
Fl_Check_Button *chkUSERIGCAT=(Fl_Check_Button *)0;
@ -2454,17 +2465,6 @@ static void cb_cntTxOffset(Fl_Spinner2* o, void*) {
progdefaults.changed = true;
}
Fl_Check_Button *chkAudioStereoOut=(Fl_Check_Button *)0;
static void cb_chkAudioStereoOut(Fl_Check_Button* o, void*) {
if (!o->value() && (progdefaults.PseudoFSK || progdefaults.QSK || progdefaults.PTTrightchannel))
LOG_WARN("Disabling right audio channel while in use by the QSK, pseudo-FSK or audio PTT options");
progdefaults.out_channels = o->value() + 1;
resetSoundCard();
progdefaults.changed = true;
}
Fl_Group *tabMixer=(Fl_Group *)0;
Fl_Check_Button *btnMixer=(Fl_Check_Button *)0;
@ -2520,6 +2520,81 @@ static void cb_valPCMvolume(Fl_Value_Slider2* o, void*) {
progdefaults.changed = true;
}
Fl_Group *tabAudioRightChannel=(Fl_Group *)0;
Fl_Check_Button *chkAudioStereoOut=(Fl_Check_Button *)0;
static void cb_chkAudioStereoOut(Fl_Check_Button* o, void*) {
progdefaults.sig_on_right_channel = o->value();
progdefaults.changed = true;
if (o->value()) {
progdefaults.QSK = false;
btnQSK->value(0);
btnQSK2->value(0);
progdefaults.PseudoFSK = false;
chkPseudoFSK->value(0);
chkPseudoFSK2->value(0);
progdefaults.PTTrightchannel = false;
btnPTTrightchannel->value(0);
btnPTTrightchannel2->value(0);
};
}
Fl_Check_Button *chkReverseAudio=(Fl_Check_Button *)0;
static void cb_chkReverseAudio(Fl_Check_Button* o, void*) {
progdefaults.ReverseAudio = o->value();
progdefaults.changed = true;
}
Fl_Check_Button *btnPTTrightchannel2=(Fl_Check_Button *)0;
static void cb_btnPTTrightchannel2(Fl_Check_Button* o, void*) {
progdefaults.PTTrightchannel = o->value();
if (o->value()) {
progdefaults.QSK = false;
btnQSK->value(0);
btnQSK2->value(0);
progdefaults.PseudoFSK = false;
chkPseudoFSK->value(0);
chkPseudoFSK2->value(0);
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
}
btnPTTrightchannel->value(o->value());
progdefaults.changed = true;
}
Fl_Check_Button *btnQSK2=(Fl_Check_Button *)0;
static void cb_btnQSK2(Fl_Check_Button* o, void*) {
progdefaults.QSK = o->value();
progdefaults.changed = true;
if (o->value()) {
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
progdefaults.PTTrightchannel = false;
btnPTTrightchannel->value(0);
btnPTTrightchannel2->value(0);
}
btnQSK->value(o->value());
}
Fl_Check_Button *chkPseudoFSK2=(Fl_Check_Button *)0;
static void cb_chkPseudoFSK2(Fl_Check_Button* o, void*) {
progdefaults.PseudoFSK = o->value();
progdefaults.changed = true;
if (o->value()) {
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
progdefaults.PTTrightchannel = false;
btnPTTrightchannel->value(0);
btnPTTrightchannel2->value(0);
}
chkPseudoFSK->value(o->value());
}
Fl_Group *tabID=(Fl_Group *)0;
Fl_Check_Button *btnsendid=(Fl_Check_Button *)0;
@ -4177,6 +4252,7 @@ an merging"));
tabsCW->selection_color((Fl_Color)FL_LIGHT1);
{ Fl_Group* o = new Fl_Group(0, 75, 500, 295, _("General"));
o->align(FL_ALIGN_TOP_LEFT);
o->hide();
{ Fl_Group* o = new Fl_Group(5, 85, 490, 130, _("Receive"));
o->box(FL_ENGRAVED_FRAME);
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
@ -4343,7 +4419,6 @@ an merging"));
} // Fl_Group* o
{ Fl_Group* o = new Fl_Group(0, 75, 500, 295, _("Timing and QSK"));
o->align(FL_ALIGN_TOP_LEFT);
o->hide();
{ Fl_Group* o = new Fl_Group(5, 85, 490, 120, _("Timing"));
o->box(FL_ENGRAVED_FRAME);
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
@ -5994,11 +6069,6 @@ ll with your audio device."));
} // Fl_Spinner2* cntTxOffset
o->end();
} // Fl_Group* o
{ chkAudioStereoOut = new Fl_Check_Button(15, 222, 220, 20, _("Enable right audio channel"));
chkAudioStereoOut->down_box(FL_DOWN_BOX);
chkAudioStereoOut->callback((Fl_Callback*)cb_chkAudioStereoOut);
chkAudioStereoOut->value(progdefaults.out_channels == 2);
} // Fl_Check_Button* chkAudioStereoOut
tabAudioOpt->end();
} // Fl_Group* tabAudioOpt
{ tabMixer = new Fl_Group(0, 50, 500, 320, _("Mixer"));
@ -6047,6 +6117,47 @@ ll with your audio device."));
} // Fl_Group* o
tabMixer->end();
} // Fl_Group* tabMixer
{ tabAudioRightChannel = new Fl_Group(0, 50, 500, 320, _("Right channel"));
tabAudioRightChannel->hide();
{ chkAudioStereoOut = new Fl_Check_Button(98, 93, 280, 20, _("Modem signal on left and right channels"));
chkAudioStereoOut->tooltip(_("Left and right channels both contain modem audio"));
chkAudioStereoOut->down_box(FL_DOWN_BOX);
chkAudioStereoOut->callback((Fl_Callback*)cb_chkAudioStereoOut);
chkAudioStereoOut->value(progdefaults.sig_on_right_channel);
} // Fl_Check_Button* chkAudioStereoOut
{ Fl_Check_Button* o = chkReverseAudio = new Fl_Check_Button(98, 130, 270, 20, _("Reverse Left/Right channels"));
chkReverseAudio->tooltip(_("Software reversal of left-right audio channels"));
chkReverseAudio->down_box(FL_DOWN_BOX);
chkReverseAudio->callback((Fl_Callback*)cb_chkReverseAudio);
o->value(progdefaults.ReverseAudio);
} // Fl_Check_Button* chkReverseAudio
{ Fl_Check_Button* o = btnPTTrightchannel2 = new Fl_Check_Button(98, 178, 250, 20, _("PTT tone on right audio channel "));
btnPTTrightchannel2->tooltip(_("1000 Hz tone when PTT enabled\nCan be used in lieu of or in addition to other\
PTT types"));
btnPTTrightchannel2->down_box(FL_DOWN_BOX);
btnPTTrightchannel2->callback((Fl_Callback*)cb_btnPTTrightchannel2);
o->value(progdefaults.PTTrightchannel);
} // Fl_Check_Button* btnPTTrightchannel2
{ Fl_Check_Button* o = btnQSK2 = new Fl_Check_Button(98, 216, 211, 20, _("CW QSK signal on right channel"));
btnQSK2->tooltip(_("Generate 1000 Hz square wave signal on right channel"));
btnQSK2->down_box(FL_DOWN_BOX);
btnQSK2->callback((Fl_Callback*)cb_btnQSK2);
o->value(progdefaults.QSK);
} // Fl_Check_Button* btnQSK2
{ Fl_Check_Button* o = chkPseudoFSK2 = new Fl_Check_Button(98, 254, 270, 20, _("Pseudo-FSK on right audio channel"));
chkPseudoFSK2->tooltip(_("Create 1000 Hz square wave on right channel"));
chkPseudoFSK2->down_box(FL_DOWN_BOX);
chkPseudoFSK2->callback((Fl_Callback*)cb_chkPseudoFSK2);
o->value(progdefaults.PseudoFSK);
} // Fl_Check_Button* chkPseudoFSK2
{ Fl_Group* o = new Fl_Group(25, 168, 454, 187, _("...\nThese controls are on other tabs.\nThey are replicated here for convenie\
nce.\nYou may change the state from either location.\n..."));
o->box(FL_ENGRAVED_FRAME);
o->align(FL_ALIGN_BOTTOM|FL_ALIGN_INSIDE);
o->end();
} // Fl_Group* o
tabAudioRightChannel->end();
} // Fl_Group* tabAudioRightChannel
tabsSoundCard->end();
} // Fl_Tabs* tabsSoundCard
tabSoundCard->end();

Wyświetl plik

@ -1280,22 +1280,22 @@ behaves inside the waterfall} xywh {15 196 150 22} down_box BORDER_BOX align 8
}
}
Fl_Group tabModems {
label Modems
label Modems open
xywh {-4 25 521 347} hide
} {
Fl_Tabs tabsModems {open
xywh {-4 25 521 347} selection_color 50 align 9
} {
Fl_Group tabCW {
label CW
label CW open
xywh {0 50 504 320}
} {
Fl_Tabs tabsCW {
Fl_Tabs tabsCW {open
xywh {0 50 504 320} selection_color 50
} {
Fl_Group {} {
label General open
xywh {0 75 500 295} align 5
xywh {0 75 500 295} align 5 hide
} {
Fl_Group {} {
label Receive open
@ -1411,7 +1411,7 @@ progdefaults.changed = true;}
}
Fl_Group {} {
label {Timing and QSK} open
xywh {0 75 500 295} align 5 hide
xywh {0 75 500 295} align 5
} {
Fl_Group {} {
label Timing open
@ -1467,12 +1467,15 @@ progdefaults.changed = true;}
} {
Fl_Check_Button btnQSK {
label {QSK on right audio channel}
callback {if (o->value() && !sound_check_right_channel()) {
o->value(0);
return;
callback {progdefaults.QSK = o->value();
progdefaults.changed = true;
if (o->value()) {
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
progdefaults.PTTrightchannel = false;
btnPTTrightchannel->value(0);
}
progdefaults.QSK = o->value();
progdefaults.changed = true;}
btnQSK2->value(o->value());}
tooltip {Generate square wave signal on right channel} xywh {15 245 211 20} down_box DOWN_BOX
code0 {o->value(progdefaults.QSK);}
}
@ -2221,12 +2224,15 @@ progdefaults.changed = true;}
}
Fl_Check_Button chkPseudoFSK {
label {Pseudo-FSK on right audio channel}
callback {if (o->value() && !sound_check_right_channel()) {
o->value(0);
return;
callback {progdefaults.PseudoFSK = o->value();
progdefaults.changed = true;
if (o->value()) {
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
progdefaults.PTTrightchannel = false;
btnPTTrightchannel->value(0);
}
progdefaults.PseudoFSK = o->value();
progdefaults.changed = true;}
chkPseudoFSK2->value(o->value());}
tooltip {Create square wave on right channel} xywh {15 284 270 20} down_box DOWN_BOX
code0 {o->value(progdefaults.PseudoFSK);}
}
@ -2323,7 +2329,7 @@ progdefaults.changed = true;}
}
}
Fl_Group tabRig {
label Rig
label Rig open
tooltip {Transceiver control} xywh {0 25 500 345} hide
} {
Fl_Tabs tabsRig {open
@ -2424,12 +2430,17 @@ progdefaults.changed = true;}
} {
Fl_Check_Button btnPTTrightchannel {
label {PTT tone on right audio channel }
callback {if (o->value() && !sound_check_right_channel()) {
o->value(0);
return;
callback {progdefaults.PTTrightchannel = o->value();
if (o->value()) {
progdefaults.QSK = false;
btnQSK->value(0);
progdefaults.PseudoFSK = false;
chkPseudoFSK->value(0);
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
}
progdefaults.PTTrightchannel = o->value();
progdefaults.changed = true;}
progdefaults.changed = true;
btnPTTrightchannel2->value(o->value());}
tooltip {Can be used in lieu of or in addition to other PTT types} xywh {130 69 250 20} down_box DOWN_BOX
code0 {o->value(progdefaults.PTTrightchannel);}
}
@ -2910,7 +2921,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
@ -3080,17 +3091,6 @@ progdefaults.changed = true;}
class Fl_Spinner2
}
}
Fl_Check_Button chkAudioStereoOut {
label {Enable right audio channel}
callback {if (!o->value() && (progdefaults.PseudoFSK || progdefaults.QSK || progdefaults.PTTrightchannel))
LOG_WARN("Disabling right audio channel while in use by the QSK, pseudo-FSK or audio PTT options");
progdefaults.out_channels = o->value() + 1;
resetSoundCard();
progdefaults.changed = true;}
xywh {15 222 220 20} down_box DOWN_BOX
code0 {chkAudioStereoOut->value(progdefaults.out_channels == 2);}
}
}
Fl_Group tabMixer {
label Mixer open
@ -3157,6 +3157,93 @@ progdefaults.changed = true;}
}
}
}
Fl_Group tabAudioRightChannel {
label {Right channel} open
xywh {0 50 500 320} hide
} {
Fl_Check_Button chkAudioStereoOut {
label {Modem signal on left and right channels}
callback {progdefaults.sig_on_right_channel = o->value();
progdefaults.changed = true;
if (o->value()) {
progdefaults.QSK = false;
btnQSK->value(0);
btnQSK2->value(0);
progdefaults.PseudoFSK = false;
chkPseudoFSK->value(0);
chkPseudoFSK2->value(0);
progdefaults.PTTrightchannel = false;
btnPTTrightchannel->value(0);
btnPTTrightchannel2->value(0);
}}
tooltip {Left and right channels both contain modem audio} xywh {98 93 280 20} down_box DOWN_BOX
code0 {chkAudioStereoOut->value(progdefaults.sig_on_right_channel);}
}
Fl_Check_Button chkReverseAudio {
label {Reverse Left/Right channels}
callback {progdefaults.ReverseAudio = o->value();
progdefaults.changed = true;}
tooltip {Software reversal of left-right audio channels} xywh {98 130 270 20} down_box DOWN_BOX
code0 {o->value(progdefaults.ReverseAudio);}
}
Fl_Check_Button btnPTTrightchannel2 {
label {PTT tone on right audio channel }
callback {progdefaults.PTTrightchannel = o->value();
if (o->value()) {
progdefaults.QSK = false;
btnQSK->value(0);
btnQSK2->value(0);
progdefaults.PseudoFSK = false;
chkPseudoFSK->value(0);
chkPseudoFSK2->value(0);
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
}
btnPTTrightchannel->value(o->value());
progdefaults.changed = true;}
tooltip {1000 Hz tone when PTT enabled
Can be used in lieu of or in addition to other PTT types} xywh {98 178 250 20} down_box DOWN_BOX
code0 {o->value(progdefaults.PTTrightchannel);}
}
Fl_Check_Button btnQSK2 {
label {CW QSK signal on right channel}
callback {progdefaults.QSK = o->value();
progdefaults.changed = true;
if (o->value()) {
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
progdefaults.PTTrightchannel = false;
btnPTTrightchannel->value(0);
btnPTTrightchannel2->value(0);
}
btnQSK->value(o->value());}
tooltip {Generate 1000 Hz square wave signal on right channel} xywh {98 216 211 20} down_box DOWN_BOX
code0 {o->value(progdefaults.QSK);}
}
Fl_Check_Button chkPseudoFSK2 {
label {Pseudo-FSK on right audio channel}
callback {progdefaults.PseudoFSK = o->value();
progdefaults.changed = true;
if (o->value()) {
progdefaults.sig_on_right_channel = false;
chkAudioStereoOut->value(0);
progdefaults.PTTrightchannel = false;
btnPTTrightchannel->value(0);
btnPTTrightchannel2->value(0);
}
chkPseudoFSK->value(o->value());}
tooltip {Create 1000 Hz square wave on right channel} xywh {98 254 270 20} down_box DOWN_BOX
code0 {o->value(progdefaults.PseudoFSK);}
}
Fl_Group {} {
label {...
These controls are on other tabs.
They are replicated here for convenience.
You may change the state from either location.
...} open
xywh {25 168 454 187} box ENGRAVED_FRAME align 18
} {}
}
}
}
Fl_Group tabID {

Wyświetl plik

@ -335,7 +335,6 @@ extern Fl_Choice *menuSampleConverter;
extern Fl_Spinner2 *cntRxRateCorr;
extern Fl_Spinner2 *cntTxRateCorr;
extern Fl_Spinner2 *cntTxOffset;
extern Fl_Check_Button *chkAudioStereoOut;
extern Fl_Group *tabMixer;
extern void resetMixerControls();
extern Fl_Check_Button *btnMixer;
@ -345,6 +344,12 @@ extern void setMixerInput(int);
extern Fl_Light_Button *btnLineIn;
extern void setPCMvolume(double);
extern Fl_Value_Slider2 *valPCMvolume;
extern Fl_Group *tabAudioRightChannel;
extern Fl_Check_Button *chkAudioStereoOut;
extern Fl_Check_Button *chkReverseAudio;
extern Fl_Check_Button *btnPTTrightchannel2;
extern Fl_Check_Button *btnQSK2;
extern Fl_Check_Button *chkPseudoFSK2;
extern Fl_Group *tabID;
extern Fl_Check_Button *btnsendid;
extern Fl_Check_Button *btnsendvideotext;

Wyświetl plik

@ -881,9 +881,12 @@
ELEM_(int, in_channels, "INCHANNELS", \
"Number of audio input channels", \
1) \
ELEM_(int, out_channels, "OUTCHANNELS", \
"Number of audio output channels", \
2) \
ELEM_(bool, sig_on_right_channel, "SIGONRIGHTCHANNEL", \
"Duplicate modem signal on left & right", \
false) \
ELEM_(bool, ReverseAudio, "REVERSEAUDIO", \
"Reverse left-right audio channels", \
false) \
ELEM_(int, sample_rate, "SAMPLERATE", \
"For compatibility with older versions", \
SAMPLE_RATE_UNSET) \

Wyświetl plik

@ -19,6 +19,5 @@ extern int sample_rate_converters[FLDIGI_NUM_SRC];
void sound_init(void);
void sound_close(void);
void sound_update(unsigned idx);
bool sound_check_right_channel(void);
#endif // SOUNDCONF_H

Wyświetl plik

@ -663,8 +663,13 @@ size_t SoundOSS::Write_stereo(double *bufleft, double *bufright, size_t count)
wbuff = new short int[2*count];
p = (unsigned char *)wbuff;
for (size_t i = 0; i < count; i++) {
wbuff[2*i] = (short int)(bufleft[i] * maxsc);
wbuff[2*i + 1] = (short int)(bufright[i] * maxsc);
if (progdefaults.ReverseAudio) {
wbuff[2*i+1] = (short int)(bufleft[i] * maxsc);
wbuff[2*i] = (short int)(bufright[i] * maxsc);
} else {
wbuff[2*i] = (short int)(bufleft[i] * maxsc);
wbuff[2*i+1] = (short int)(bufright[i] * maxsc);
}
}
count *= sizeof(short int);
retval = write(device_fd, p, 2*count);
@ -677,8 +682,13 @@ size_t SoundOSS::Write_stereo(double *bufleft, double *bufright, size_t count)
inbuf = new float[2*count];
size_t bufsize;
for (size_t i = 0; i < count; i++) {
inbuf[2*i] = bufleft[i];
inbuf[2*i+1] = bufright[i];
if (progdefaults.ReverseAudio) {
inbuf[2*i+1] = bufleft[i];
inbuf[2*i] = bufright[i];
} else {
inbuf[2*i] = bufleft[i];
inbuf[2*i+1] = bufright[i];
}
}
tx_src_data->data_in = inbuf;
tx_src_data->input_frames = count;
@ -771,7 +781,7 @@ SoundPort::SoundPort(const char *in_dev, const char *out_dev)
sd[0].device = in_dev;
sd[1].device = out_dev;
sd[0].params.channelCount = progdefaults.in_channels;
sd[1].params.channelCount = progdefaults.out_channels;
sd[1].params.channelCount = 2;//progdefaults.out_channels;
sd[0].stream = sd[1].stream = 0;
sd[0].frames_per_buffer = sd[1].frames_per_buffer = paFramesPerBufferUnspecified;
sd[0].dev_sample_rate = sd[1].dev_sample_rate = 0;
@ -1070,11 +1080,21 @@ size_t SoundPort::Write(double *buf, size_t count)
write_file(ofGenerate, buf, count);
#endif
// copy input to both channels
for (size_t i = 0; i < count; i++)
fbuf[sd[1].params.channelCount * i] = fbuf[sd[1].params.channelCount * i + 1] = buf[i];
// copy input to both channels if right channel enabled
for (size_t i = 0; i < count; i++)
if (progdefaults.sig_on_right_channel)
fbuf[sd[1].params.channelCount * i] = fbuf[sd[1].params.channelCount * i + 1] = buf[i];
else {
if (progdefaults.ReverseAudio) {
fbuf[sd[1].params.channelCount *i + 1] = buf[i];
fbuf[sd[1].params.channelCount * i] = 0;
} else {
fbuf[sd[1].params.channelCount *i] = buf[i];
fbuf[sd[1].params.channelCount * i + 1] = 0;
}
}
return resample_write(fbuf, count);
return resample_write(fbuf, count);
}
size_t SoundPort::Write_stereo(double *bufleft, double *bufright, size_t count)
@ -1087,13 +1107,18 @@ size_t SoundPort::Write_stereo(double *bufleft, double *bufright, size_t count)
write_file(ofCapture, bufleft, count);
#endif
// interleave into fbuf
for (size_t i = 0; i < count; i++) {
fbuf[sd[1].params.channelCount * i] = bufleft[i];
fbuf[sd[1].params.channelCount * i + 1] = bufright[i];
}
// interleave into fbuf
for (size_t i = 0; i < count; i++) {
if (progdefaults.ReverseAudio) {
fbuf[sd[1].params.channelCount * i + 1] = bufleft[i];
fbuf[sd[1].params.channelCount * i] = bufright[i];
} else {
fbuf[sd[1].params.channelCount * i] = bufleft[i];
fbuf[sd[1].params.channelCount * i + 1] = bufright[i];
}
}
return resample_write(fbuf, count);
return resample_write(fbuf, count);
}
@ -1500,7 +1525,7 @@ void SoundPort::probe_supported_rates(const device_iterator& idev)
PaStreamParameters params[2];
params[0].device = params[1].device = idev - devs.begin();
params[0].channelCount = progdefaults.in_channels;
params[1].channelCount = progdefaults.out_channels;
params[1].channelCount = 2;//progdefaults.out_channels;
params[0].sampleFormat = params[1].sampleFormat = paFloat32;
params[0].suggestedLatency = (*idev)->defaultHighInputLatency;
params[1].suggestedLatency = (*idev)->defaultHighOutputLatency;
@ -1571,7 +1596,7 @@ SoundPulse::SoundPulse(const char *dev)
sd[0].dir = PA_STREAM_RECORD; sd[1].dir = PA_STREAM_PLAYBACK;
sd[0].stream_params.format = sd[1].stream_params.format = PA_SAMPLE_FLOAT32LE;
sd[0].stream_params.channels = progdefaults.in_channels;
sd[1].stream_params.channels = progdefaults.out_channels;
sd[1].stream_params.channels = 2;//progdefaults.out_channels;
sd[0].buffer_attrs.maxlength = sd[0].buffer_attrs.minreq = sd[0].buffer_attrs.prebuf =
sd[0].buffer_attrs.tlength = (uint32_t)-1;
@ -1700,8 +1725,19 @@ size_t SoundPulse::Write(double* buf, size_t count)
write_file(ofGenerate, buf, count);
#endif
for (size_t i = 0; i < count; i++)
fbuf[sd[1].stream_params.channels * i] = fbuf[sd[1].stream_params.channels * i + 1] = buf[i];
// copy input to both channels
for (size_t i = 0; i < count; i++)
if (progdefaults.sig_on_right_channel)
fbuf[sd[1].stream_params.channels * i] = fbuf[sd[1].stream_params.channels * i + 1] = buf[i];
else {
if (progdefaults.ReverseAudio) {
fbuf[sd[1].stream_params.channels * i + 1] = buf[i];
fbuf[sd[1].stream_params.channels * i] = 0;
} else {
fbuf[sd[1].stream_params.channels * i] = buf[i];
fbuf[sd[1].stream_params.channels * i + 1] = 0;
}
}
return resample_write(fbuf, count);
}
@ -1717,8 +1753,13 @@ size_t SoundPulse::Write_stereo(double* bufleft, double* bufright, size_t count)
#endif
for (size_t i = 0; i < count; i++) {
fbuf[sd[1].stream_params.channels * i] = bufleft[i];
fbuf[sd[1].stream_params.channels * i + 1] = bufright[i];
if (progdefaults.ReverseAudio) {
fbuf[sd[1].stream_params.channels * i + 1] = bufleft[i];
fbuf[sd[1].stream_params.channels * i] = bufright[i];
} else {
fbuf[sd[1].stream_params.channels * i] = bufleft[i];
fbuf[sd[1].stream_params.channels * i + 1] = bufright[i];
}
}
return resample_write(fbuf, count);

Wyświetl plik

@ -518,17 +518,3 @@ void sound_update(unsigned idx)
};
}
#include "icons.h"
#include "gettext.h"
bool sound_check_right_channel(void)
{
if (progdefaults.out_channels != 2) {
if (!fl_choice2(_("The right audio channel is disabled. Enable it now?"), _("Cancel"), _("OK"), NULL))
return false;
chkAudioStereoOut->value(1);
chkAudioStereoOut->do_callback();
}
return true;
}