Remove more soundout stuff.

This commit is contained in:
Joe Taylor 2022-12-05 13:58:12 -05:00
parent 2a2bc4e69b
commit 8a70f9c131
7 changed files with 0 additions and 722 deletions

View File

@ -12,7 +12,6 @@ DevSetup::DevSetup(QWidget *parent) : QDialog(parent)
{
ui.setupUi(this); //setup the dialog form
m_restartSoundIn=false;
m_restartSoundOut=false;
}
DevSetup::~DevSetup()
@ -149,9 +148,6 @@ void DevSetup::accept()
m_xpol!=ui.cbXpol->isChecked() or
m_udpPort!=ui.sbPort->value()) m_restartSoundIn=true;
if(m_nDevOut!=ui.comboBoxSndOut->currentIndex() or
m_paOutDevice!=m_outDevList[m_nDevOut]) m_restartSoundOut=true;
m_myCall=ui.myCallEntry->text();
m_myGrid=ui.myGridEntry->text();
m_idInt=ui.idIntSpinBox->value();

View File

@ -39,7 +39,6 @@ public:
bool m_xpol;
bool m_IQswap;
bool m_restartSoundIn;
bool m_restartSoundOut;
bool m_initIQplus;
bool m_bIQxt;

View File

@ -1,207 +0,0 @@
#include "soundout.h"
#ifdef Q_OS_WIN32
#include <windows.h>
#endif
#define FRAMES_PER_BUFFER 256
#include <portaudio.h>
extern float gran(); //Noise generator (for tests only)
extern short int iwave[2*60*11025]; //Wave file for Tx audio
extern int nwave;
extern bool btxok;
extern bool bTune;
extern bool bIQxt;
extern int iqAmp;
extern int iqPhase;
extern int txPower;
extern double outputLatency;
typedef struct //Parameters sent to or received from callback function
{
int nTRperiod;
} paUserData;
//--------------------------------------------------------------- d2aCallback
extern "C" int d2aCallback(const void * /*inputBuffer*/, void *outputBuffer,
unsigned long framesToProcess,
const PaStreamCallbackTimeInfo* /*timeInfo*/,
PaStreamCallbackFlags /*statusFlags*/,
void *userData )
{
paUserData *udata=(paUserData*)userData;
short *wptr = (short*)outputBuffer;
unsigned int i;
static int n;
static int ic=0;
static bool btxok0=false;
static bool bTune0=false;
static int nStart=0;
static double phi=0.;
double tsec,tstart,dphi;
int nsec;
int nTRperiod=udata->nTRperiod;
// Get System time
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
tsec = 0.001*ms;
nsec = ms/1000;
qreal dPhase=iqPhase/5729.57795131;
qreal amp=1.0 + 0.0001*iqAmp;
qreal xAmp=txPower*295.00*qSqrt(2.0 - amp*amp);
qreal yAmp=txPower*295.00*amp;
static int nsec0=0;
if(bTune) {
ic=0;
dphi=6.28318530718*1270.46/11025.0;
}
if(bTune0 and !bTune) btxok=false;
bTune0=bTune;
if(nsec!=nsec0) {
// qDebug() << txPower << iqAmp << iqPhase << amp << xAmp << yAmp << dPhase << bTune;
// qDebug() << "A" << nsec%60 << bTune << btxok;
// ic=0;
nsec0=nsec;
}
if(btxok and !btxok0) { //Start (or re-start) a transmission
n=nsec/nTRperiod;
tstart=tsec - n*nTRperiod - 1.0;
if(tstart<1.0) {
ic=0; //Start of Tx cycle, set starting index to 0
nStart=n;
} else {
if(n != nStart) { //Late start in new Tx cycle: compute starting index
ic=(int)(tstart*11025.0);
ic=2*ic;
nStart=n;
}
}
}
btxok0=btxok;
if(btxok) {
for(i=0 ; i<framesToProcess; i++ ) {
short int i2a=iwave[ic++];
short int i2b=iwave[ic++];
if(ic > nwave) {i2a=0; i2b=0;}
// i2 = 500.0*(i2/32767.0 + 5.0*gran()); //Add noise (tests only!)
// if(bIQxt) {
if(1) {
if(bTune) {
phi += dphi;
} else {
phi=qAtan2(qreal(i2b),qreal(i2a));
}
i2a=xAmp*qCos(phi);
i2b=yAmp*qSin(phi + dPhase);
// qDebug() << xAmp << yAmp << phi << i2a << i2b;
}
// i2a=0.01*txPower*i2a;
// i2b=0.01*txPower*i2b;
*wptr++ = i2b; //left
*wptr++ = i2a; //right
}
} else {
for(i=0 ; i<framesToProcess; i++ ) {
*wptr++ = 0;
*wptr++ = 0;
ic++; ic++;
}
}
if(ic > nwave) {
btxok=0;
ic=0;
}
return 0;
}
namespace
{
struct COMWrapper
{
explicit COMWrapper ()
{
#ifdef Q_OS_WIN32
// required because Qt only does this for GUI thread
CoInitializeEx (nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
#endif
}
~COMWrapper ()
{
#ifdef Q_OS_WIN32
CoUninitialize ();
#endif
}
};
}
void SoundOutThread::run()
{
COMWrapper c;
PaError paerr;
PaStreamParameters outParam;
PaStream *outStream;
paUserData udata;
quitExecution = false;
auto device_info = Pa_GetDeviceInfo (m_nDevOut);
outParam.device=m_nDevOut; //Output device number
outParam.channelCount=2; //Number of analog channels
outParam.sampleFormat=paInt16; //Send short ints to PortAudio
outParam.suggestedLatency=device_info->defaultLowOutputLatency;
outParam.hostApiSpecificStreamInfo=NULL;
udata.nTRperiod=m_TRperiod;
paerr=Pa_IsFormatSupported(NULL,&outParam,11025.0);
if(paerr<0) {
qDebug() << "PortAudio says requested output format not supported.";
qDebug() << paerr;
return;
}
paerr=Pa_OpenStream(&outStream, //Output stream
NULL, //No input parameters
&outParam, //Output parameters
11025.0, //Sample rate
FRAMES_PER_BUFFER, //Frames per buffer
paClipOff, //No clipping
d2aCallback, //output callbeck routine
&udata); //userdata
paerr=Pa_StartStream(outStream);
if(paerr<0) {
qDebug() << "Failed to start audio output stream.";
return;
}
const PaStreamInfo* p=Pa_GetStreamInfo(outStream);
outputLatency = p->outputLatency;
bool qe = quitExecution;
//---------------------------------------------- Soundcard output loop
while (!qe) {
qe = quitExecution;
if (qe) break;
msleep(100);
}
Pa_StopStream(outStream);
Pa_CloseStream(outStream);
}
void SoundOutThread::setOutputDevice(int n) //setOutputDevice()
{
if (isRunning()) return;
this->m_nDevOut=n;
}
void SoundOutThread::setPeriod(int n)
{
m_TRperiod=n;
}

View File

@ -1,44 +0,0 @@
#ifndef SOUNDOUT_H
#define SOUNDOUT_H
#include <QtCore>
#include <QDebug>
// An instance of this thread sends audio data to a specified soundcard.
// Output can be muted while underway, preserving waveform timing when
// transmission is resumed.
class SoundOutThread : public QThread
{
Q_OBJECT
protected:
virtual void run();
public:
// Constructs (but does not start) a SoundOutThread
SoundOutThread()
: quitExecution(false) // Initialize some private members
, m_rate(0)
, m_nwave(48*11025)
, m_txOK(false)
, m_txMute(false)
{
}
public:
void setOutputDevice(qint32 n);
void setPeriod(int n);
bool quitExecution; //If true, thread exits gracefully
// Private members
private:
double m_rate; //Sample rate
qint32 m_nDevOut; //Output device number
qint32 m_nwave; //Length of wave file
qint32 m_TRperiod; //T/R period (30 or 60 s)
bool m_txOK; //Enable Tx audio
bool m_txMute; //Mute temporarily
};
#endif

View File

@ -1,116 +0,0 @@
#include "txtune.h"
#include "ui_txtune.h"
#include <QDebug>
extern int txPower;
extern int iqAmp;
extern int iqPhase;
extern bool bTune;
TxTune::TxTune(QWidget *parent) :
QDialog(parent),
ui(new Ui::TxTune)
{
ui->setupUi(this);
}
TxTune::~TxTune()
{
delete ui;
}
void TxTune::accept()
{
if(bTune) on_pbTune_clicked();
QDialog::accept();
}
void TxTune::reject()
{
if(bTune) on_pbTune_clicked();
set_iqAmp(m_saveAmp);
set_iqPhase(m_savePha);
set_txPower(m_saveTxPower);
QDialog::reject();
}
void TxTune::on_pwrSlider_valueChanged(int n)
{
txPower=n;
ui->labPower->setText (QString {"%1 %"}.arg (n));
}
void TxTune::on_ampSlider_valueChanged(int n)
{
m_iqAmp1=n;
iqAmp=10*m_iqAmp1 + m_iqAmp2;
ui->labAmpReal->setText (QString::number (1.0 + 0.0001 * iqAmp, 'f', 4));
}
void TxTune::on_fineAmpSlider_valueChanged(int n)
{
m_iqAmp2=n;
iqAmp=10*m_iqAmp1 + m_iqAmp2;
ui->labAmpReal->setText (QString::number (1.0 + 0.0001*iqAmp, 'f', 4));
}
void TxTune::on_phaSlider_valueChanged(int n)
{
m_iqPha1=n;
iqPhase=10*m_iqPha1 + m_iqPha2;
ui->labPhaReal->setText (QString::number (0.01*iqPhase, 'f', 2));
}
void TxTune::on_finePhaSlider_valueChanged(int n)
{
m_iqPha2=n;
iqPhase=10*m_iqPha1 + m_iqPha2;
ui->labPhaReal->setText (QString::number (0.01*iqPhase, 'f', 2));
}
void TxTune::set_iqAmp(int n)
{
m_saveAmp=n;
m_iqAmp1=n/10;
m_iqAmp2=n%10;
ui->ampSlider->setValue(m_iqAmp1);
ui->fineAmpSlider->setValue(m_iqAmp2);
}
void TxTune::set_iqPhase(int n)
{
m_savePha=n;
m_iqPha1=n/10;
m_iqPha2=n%10;
ui->phaSlider->setValue(m_iqPha1);
ui->finePhaSlider->setValue(m_iqPha2);
}
void TxTune::set_txPower(int n)
{
m_saveTxPower=n;
ui->pwrSlider->setValue(n);
}
void TxTune::on_cbTxImage_toggled(bool b)
{
ui->ampSlider->setEnabled(b);
ui->fineAmpSlider->setEnabled(b);
ui->labAmp->setEnabled(b);
ui->labFineAmp->setEnabled(b);
ui->phaSlider->setEnabled(b);
ui->finePhaSlider->setEnabled(b);
ui->labPha->setEnabled(b);
ui->labFinePha->setEnabled(b);
}
void TxTune::on_pbTune_clicked()
{
bTune = !bTune;
if(bTune) {
QString style="QPushButton{background-color: red;}";
ui->pbTune->setStyleSheet(style);
} else {
ui->pbTune->setStyleSheet("");
}
}

View File

@ -1,48 +0,0 @@
#ifndef TXTUNE_H
#define TXTUNE_H
#include <QDialog>
namespace Ui {
class TxTune;
}
class TxTune : public QDialog
{
Q_OBJECT
public:
explicit TxTune(QWidget *parent = 0);
~TxTune();
public slots:
void accept();
void reject();
private slots:
void on_pwrSlider_valueChanged(int n);
void on_ampSlider_valueChanged(int n);
void on_phaSlider_valueChanged(int n);
void on_cbTxImage_toggled(bool b);
void on_pbTune_clicked();
void on_fineAmpSlider_valueChanged(int n);
void on_finePhaSlider_valueChanged(int n);
public:
void set_iqAmp(int n);
void set_iqPhase(int n);
void set_txPower(int n);
private:
qint32 m_iqAmp1;
qint32 m_iqAmp2;
qint32 m_iqPha1;
qint32 m_iqPha2;
qint32 m_saveAmp;
qint32 m_savePha;
qint32 m_saveTxPower;
Ui::TxTune *ui;
};
#endif // TXTUNE_H

View File

@ -1,302 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TxTune</class>
<widget class="QDialog" name="TxTune">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Tx Tune</string>
</property>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="geometry">
<rect>
<x>30</x>
<y>240</y>
<width>341</width>
<height>32</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
<property name="centerButtons">
<bool>false</bool>
</property>
</widget>
<widget class="QWidget" name="">
<property name="geometry">
<rect>
<x>13</x>
<y>38</y>
<width>351</width>
<height>191</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="minimumSize">
<size>
<width>70</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Tx Power:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSlider" name="pwrSlider">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="cbTxImage">
<property name="text">
<string>Enable Tx I/Q Adjustment</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labAmp">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>70</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>I/Q Amplitude:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSlider" name="ampSlider">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimum">
<number>-100</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labFineAmp">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Fine:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSlider" name="fineAmpSlider">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimum">
<number>-100</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="labPha">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>70</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>I/Q Phase:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSlider" name="phaSlider">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimum">
<number>-100</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labFinePha">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Fine:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSlider" name="finePhaSlider">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimum">
<number>-100</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="labAmpReal">
<property name="text">
<string>1.0000</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="labPhaReal">
<property name="text">
<string>0.000</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pbTune">
<property name="text">
<string>Tune</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="labPower">
<property name="text">
<string>100 %</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>TxTune</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>TxTune</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>