digibox/digibox/dsp_audio.cpp

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);
}
};