266 lines
8.0 KiB
C++
266 lines
8.0 KiB
C++
#include <Audio.h>
|
|
#include <dynamicFilters.h>
|
|
//#include <Wire.h>
|
|
//#include <SPI.h>
|
|
//#include <SD.h>
|
|
//#include <SerialFlash.h>
|
|
|
|
#include "dsp_audio.h"
|
|
|
|
namespace dsp_audio {
|
|
|
|
// GUItool: begin automatically generated code
|
|
AudioInputI2S line_in; //xy=166,415
|
|
AudioInputUSB usb_in; //xy=168,678
|
|
AudioAnalyzeRMS key_level; //xy=333,714
|
|
AudioAnalyzeRMS rx_rms; //xy=342,218
|
|
AudioAnalyzePeak rx_peak; //xy=345,250
|
|
AudioSynthWaveformSine sine1; //xy=416,770
|
|
AudioSynthWaveformSine sine2; //xy=416,802
|
|
AudioEffectFade tx_comp; //xy=480,517
|
|
AudioAnalyzeRMS tx_comp_rms; //xy=494,485
|
|
AudioMixer4 tx_mix; //xy=653,679
|
|
AudioFilterFIR rx_fir_filter; //xy=664,188
|
|
AudioFilterBiquad rx_biquad_filter; //xy=858,208
|
|
AudioAnalyzeRMS tx_rms; //xy=878,551
|
|
AudioSynthWaveformSine sidetone; //xy=881,249
|
|
AudioAnalyzePeak tx_peak; //xy=881,519
|
|
AudioEffectEnvelope key_shape; //xy=1039.888916015625,249.33334350585938
|
|
AudioMixer4 rx_mix; //xy=1207,208
|
|
AudioAmplifier tx_line_out_cal; //xy=1449,680
|
|
AudioAmplifier rx_usb_out_cal; //xy=1450,473
|
|
AudioAmplifier rx_line_out_cal; //xy=1452,208
|
|
AudioMixer4 l_ch_mix; //xy=1689,226
|
|
AudioMixer4 r_ch_mix; //xy=1691,686
|
|
AudioOutputI2S line_out; //xy=1868,427
|
|
AudioOutputUSB usb_out; //xy=1868,476
|
|
AudioConnection patchCord1(line_in, 0, rx_rms, 0);
|
|
AudioConnection patchCord2(line_in, 0, rx_peak, 0);
|
|
AudioConnection patchCord3(line_in, 0, rx_fir_filter, 0);
|
|
AudioConnection patchCord4(line_in, 1, tx_comp, 0);
|
|
AudioConnection patchCord5(line_in, 1, tx_comp_rms, 0);
|
|
AudioConnection patchCord6(usb_in, 0, tx_mix, 1);
|
|
AudioConnection patchCord7(usb_in, 1, key_level, 0);
|
|
AudioConnection patchCord8(sine1, 0, tx_mix, 2);
|
|
AudioConnection patchCord9(sine2, 0, tx_mix, 3);
|
|
AudioConnection patchCord10(tx_comp, 0, tx_mix, 0);
|
|
AudioConnection patchCord11(tx_mix, tx_line_out_cal);
|
|
AudioConnection patchCord12(tx_mix, tx_peak);
|
|
AudioConnection patchCord13(tx_mix, tx_rms);
|
|
AudioConnection patchCord14(rx_fir_filter, rx_biquad_filter);
|
|
AudioConnection patchCord15(rx_fir_filter, 0, rx_mix, 0);
|
|
AudioConnection patchCord16(rx_biquad_filter, 0, rx_mix, 1);
|
|
AudioConnection patchCord17(sidetone, key_shape);
|
|
AudioConnection patchCord18(key_shape, 0, rx_mix, 2);
|
|
AudioConnection patchCord19(rx_mix, rx_line_out_cal);
|
|
AudioConnection patchCord20(rx_mix, rx_usb_out_cal);
|
|
AudioConnection patchCord21(tx_line_out_cal, 0, r_ch_mix, 1);
|
|
AudioConnection patchCord22(tx_line_out_cal, 0, l_ch_mix, 1);
|
|
AudioConnection patchCord23(rx_usb_out_cal, 0, usb_out, 0);
|
|
AudioConnection patchCord24(rx_usb_out_cal, 0, usb_out, 1);
|
|
AudioConnection patchCord25(rx_line_out_cal, 0, l_ch_mix, 0);
|
|
AudioConnection patchCord26(rx_line_out_cal, 0, r_ch_mix, 0);
|
|
AudioConnection patchCord27(l_ch_mix, 0, line_out, 0);
|
|
AudioConnection patchCord28(r_ch_mix, 0, line_out, 1);
|
|
AudioControlSGTL5000 audioCtrl; //xy=1084,801
|
|
// GUItool: end automatically generated code
|
|
|
|
bool vox_use_r_chan = false;
|
|
|
|
short coefficients[NUM_COEFFICIENTS];
|
|
|
|
bool notch_active = false;
|
|
|
|
}; // dsp_audio
|
|
|
|
//======================================================================
|
|
|
|
void dsp_audio::init(audio_config& c) {
|
|
// setup the CW sidetone and key shape
|
|
sidetone.amplitude(1.0);
|
|
sidetone.frequency(c.cw_sidetone);
|
|
key_shape.delay(0);
|
|
key_shape.attack(c.cw_rise_time);
|
|
key_shape.hold(0);
|
|
key_shape.decay(0);
|
|
key_shape.sustain(1.0);
|
|
key_shape.release(c.cw_fall_time);
|
|
}
|
|
|
|
//======================================================================
|
|
|
|
void dsp_audio::update(unsigned long msec) {
|
|
}
|
|
|
|
//======================================================================
|
|
|
|
void dsp_audio::set_stereo_rx() {
|
|
l_ch_mix.gain(0, 1.0);
|
|
l_ch_mix.gain(1, 0.0);
|
|
r_ch_mix.gain(0, 1.0);
|
|
r_ch_mix.gain(1, 0.0);
|
|
}
|
|
|
|
void dsp_audio::set_stereo_tx() {
|
|
l_ch_mix.gain(0, 0.0);
|
|
l_ch_mix.gain(1, 1.0);
|
|
r_ch_mix.gain(0, 0.0);
|
|
r_ch_mix.gain(1, 1.0);
|
|
}
|
|
|
|
//======================================================================
|
|
|
|
void dsp_audio::mute_rx() {
|
|
rx_mix.gain(0, 0.0);
|
|
rx_mix.gain(1, 0.0);
|
|
}
|
|
|
|
void dsp_audio::unmute_rx() {
|
|
if (notch_active) {
|
|
rx_mix.gain(0, 0.0);
|
|
rx_mix.gain(1, 1.0);
|
|
} else {
|
|
rx_mix.gain(0, 1.0);
|
|
rx_mix.gain(1, 0.0);
|
|
}
|
|
}
|
|
|
|
//======================================================================
|
|
|
|
void dsp_audio::vox_use_l_channel() {
|
|
vox_use_r_chan = false;
|
|
}
|
|
|
|
void dsp_audio::vox_use_r_channel() {
|
|
vox_use_r_chan = true;
|
|
}
|
|
|
|
//======================================================================
|
|
|
|
void dsp_audio::enable_sidetone() {
|
|
rx_mix.gain(3, 1.0);
|
|
}
|
|
|
|
void dsp_audio::disable_sidetone() {
|
|
rx_mix.gain(3, 0.0);
|
|
}
|
|
|
|
//======================================================================
|
|
|
|
void dsp_audio::enable_bpf(double lo, double hi) {
|
|
set_bpf(lo, hi);
|
|
}
|
|
|
|
void dsp_audio::disable_bpf() {
|
|
rx_fir_filter.begin(FIR_PASSTHRU, NUM_COEFFICIENTS);
|
|
}
|
|
|
|
void dsp_audio::set_bpf(double lo, double gi) {
|
|
audioFilter(coefficients, NUM_COEFFICIENTS, ID_BANDPASS, W_HAMMING, lo, hi);
|
|
rx_fir_filter.begin(coefficients, NUM_COEFFICIENTS);
|
|
}
|
|
|
|
//======================================================================
|
|
|
|
void dsp_audio::enable_notch(double freq) {
|
|
set_notch(freq);
|
|
notch_active = true;
|
|
rx_mix.gain(0, 0.0);
|
|
rx_mix.gain(1, 1.0);
|
|
}
|
|
|
|
void dsp_audio::disable_notch() {
|
|
rx_mix.gain(0, 1.0);
|
|
rx_mix.gain(1, 0.0);
|
|
notch_active = false;
|
|
}
|
|
|
|
void dsp_audio::set_notch(double freq) {
|
|
rx_biquad_filter.setNotch(0, freq, 10);
|
|
rx_biquad_filter.setNotch(1, freq, 10);
|
|
rx_biquad_filter.setNotch(2, freq, 10);
|
|
rx_biquad_filter.setNotch(3, freq, 10);
|
|
}
|
|
|
|
//======================================================================
|
|
|
|
|
|
class digibox_mode {
|
|
public:
|
|
virtual void enter() = 0;
|
|
virtual void exit() = 0;
|
|
virtual void tx() = 0;
|
|
virtual void rx() = 0;
|
|
};
|
|
|
|
class cw_mode : audio_mode {
|
|
public:
|
|
virtual void enter() {
|
|
// setup receive audio chain
|
|
dsp_audio::line_in.lineInLevel(5, 5);
|
|
dsp_audio::rx_mix.gain(0, 1.0);
|
|
dsp_audio::rx_mix.gain(1, 0.0);
|
|
dsp_audio::rx_mix.gain(2, 1.0);
|
|
dsp_audio::rx_mix.gain(3, 0.0);
|
|
dsp_audio::rx_line_out_cal.gain(1.0);
|
|
dsp_audio::l_ch_mix(0, 1.0);
|
|
dsp_audio::l_ch_mix(1, 0.0);
|
|
dsp_audio::l_ch_mix(2, 0.0);
|
|
dsp_audio::l_ch_mix(3, 0.0);
|
|
dsp_audio::r_ch_mix(0, 1.0);
|
|
dsp_audio::r_ch_mix(1, 0.0);
|
|
dsp_audio::r_ch_mix(2, 0.0);
|
|
dsp_audio::r_ch_mix(3, 0.0);
|
|
|
|
// setup transmit audio chain
|
|
}
|
|
|
|
virtual void tx() {
|
|
dsp_audio::r_ch_mix.gain(0, 0.0);
|
|
dsp_audio::r_ch_mix.gain(1, 1.0);
|
|
}
|
|
|
|
virtual void rx() {
|
|
dsp_audio::r_ch_mix.gain();
|
|
dsp_audio::r_ch_mix.gain();
|
|
}
|
|
};
|
|
|
|
class ssb_mode : audio_mode {
|
|
public:
|
|
virtual void tx() {
|
|
}
|
|
|
|
virtual void rx() {
|
|
}
|
|
};
|
|
|
|
class digi_mode : audio_mode {
|
|
public:
|
|
virtual void enter() }
|
|
dsp_audio::audio_ctrl.lineInLevel(5, 5);
|
|
dsp_audio::audio_ctrl.lineOutLevel(29, 29);
|
|
|
|
// setup receive audio chain
|
|
dsp_audio::rx_line_out_cal.gain(1.0);
|
|
dsp_audio::rx_usb_out_cal.gain(1.0);
|
|
dsp_audio::set_stereo_rx();
|
|
dsp_audio::disable_bpf();
|
|
dsp_audio::disable_notch();
|
|
|
|
// setup transmit audio chain
|
|
dsp_audio::tx_line_out_cal.gain(1.0);
|
|
}
|
|
|
|
virtual void tx() {
|
|
dsp_audio::r_ch_mix.gain(0, 0.0);
|
|
dsp_audio::r_ch_mix.gain(1, 1.0);
|
|
}
|
|
|
|
virtual void rx() {
|
|
dsp_audio::r_ch_mix.gain(0, 1.0);
|
|
dsp_audio::r_ch_mix.gain(1, 0.0);
|
|
}
|
|
};
|
|
|