mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-18 01:52:05 -05:00
Cleaning up the soundin routine.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/jtms3@2480 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
f8c1b6ed23
commit
6703d4850d
@ -194,13 +194,6 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
|
|
||||||
// Assign input device and start input thread
|
// Assign input device and start input thread
|
||||||
soundInThread.setInputDevice(m_paInDevice);
|
soundInThread.setInputDevice(m_paInDevice);
|
||||||
if(m_fs96000) soundInThread.setRate(96000.0);
|
|
||||||
if(!m_fs96000) soundInThread.setRate(95238.1);
|
|
||||||
soundInThread.setBufSize(10*7056);
|
|
||||||
soundInThread.setNetwork(m_network);
|
|
||||||
soundInThread.setPort(m_udpPort);
|
|
||||||
if(!m_xpol) soundInThread.setNrx(1);
|
|
||||||
if(m_xpol) soundInThread.setNrx(2);
|
|
||||||
soundInThread.start(QThread::HighestPriority);
|
soundInThread.start(QThread::HighestPriority);
|
||||||
|
|
||||||
// Assign output device and start output thread
|
// Assign output device and start output thread
|
||||||
@ -363,20 +356,12 @@ void MainWindow::readSettings()
|
|||||||
m_dPhi=settings.value("dPhi",0).toInt();
|
m_dPhi=settings.value("dPhi",0).toInt();
|
||||||
m_fCal=settings.value("Fcal",0).toInt();
|
m_fCal=settings.value("Fcal",0).toInt();
|
||||||
m_fAdd=settings.value("FAdd",0).toDouble();
|
m_fAdd=settings.value("FAdd",0).toDouble();
|
||||||
soundInThread.setFadd(m_fAdd);
|
|
||||||
m_network = settings.value("NetworkInput",true).toBool();
|
m_network = settings.value("NetworkInput",true).toBool();
|
||||||
m_fs96000 = settings.value("FSam96000",true).toBool();
|
m_fs96000 = settings.value("FSam96000",true).toBool();
|
||||||
m_nDevIn = settings.value("SoundInIndex", 0).toInt();
|
m_nDevIn = settings.value("SoundInIndex", 0).toInt();
|
||||||
m_paInDevice = settings.value("paInDevice",0).toInt();
|
m_paInDevice = settings.value("paInDevice",0).toInt();
|
||||||
m_nDevOut = settings.value("SoundOutIndex", 0).toInt();
|
m_nDevOut = settings.value("SoundOutIndex", 0).toInt();
|
||||||
m_paOutDevice = settings.value("paOutDevice",0).toInt();
|
m_paOutDevice = settings.value("paOutDevice",0).toInt();
|
||||||
m_IQswap = settings.value("IQswap",false).toBool();
|
|
||||||
m_10db = settings.value("Plus10dB",false).toBool();
|
|
||||||
m_initIQplus = settings.value("InitIQplus",false).toBool();
|
|
||||||
m_udpPort = settings.value("UDPport",50004).toInt();
|
|
||||||
soundInThread.setSwapIQ(m_IQswap);
|
|
||||||
soundInThread.set10db(m_10db);
|
|
||||||
soundInThread.setPort(m_udpPort);
|
|
||||||
ui->actionCuteSDR->setChecked(settings.value(
|
ui->actionCuteSDR->setChecked(settings.value(
|
||||||
"PaletteCuteSDR",true).toBool());
|
"PaletteCuteSDR",true).toBool());
|
||||||
ui->actionLinrad->setChecked(settings.value(
|
ui->actionLinrad->setChecked(settings.value(
|
||||||
@ -556,20 +541,10 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog
|
|||||||
m_paInDevice=dlg.m_paInDevice;
|
m_paInDevice=dlg.m_paInDevice;
|
||||||
m_nDevOut=dlg.m_nDevOut;
|
m_nDevOut=dlg.m_nDevOut;
|
||||||
m_paOutDevice=dlg.m_paOutDevice;
|
m_paOutDevice=dlg.m_paOutDevice;
|
||||||
g_pWideGraph->m_mult570=m_mult570;
|
|
||||||
g_pWideGraph->m_cal570=m_cal570;
|
|
||||||
soundInThread.setSwapIQ(m_IQswap);
|
|
||||||
soundInThread.set10db(m_10db);
|
|
||||||
|
|
||||||
if(dlg.m_restartSoundIn) {
|
if(dlg.m_restartSoundIn) {
|
||||||
soundInThread.quit();
|
soundInThread.quit();
|
||||||
soundInThread.wait(1000);
|
soundInThread.wait(1000);
|
||||||
soundInThread.setNetwork(m_network);
|
|
||||||
if(m_fs96000) soundInThread.setRate(96000.0);
|
|
||||||
if(!m_fs96000) soundInThread.setRate(95238.1);
|
|
||||||
soundInThread.setFadd(m_fAdd);
|
|
||||||
if(!m_xpol) soundInThread.setNrx(1);
|
|
||||||
if(m_xpol) soundInThread.setNrx(2);
|
|
||||||
soundInThread.setInputDevice(m_paInDevice);
|
soundInThread.setInputDevice(m_paInDevice);
|
||||||
soundInThread.start(QThread::HighestPriority);
|
soundInThread.start(QThread::HighestPriority);
|
||||||
}
|
}
|
||||||
@ -1310,8 +1285,6 @@ void MainWindow::guiUpdate()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(nsec != m_sec0) { //Once per second
|
if(nsec != m_sec0) { //Once per second
|
||||||
soundInThread.setForceCenterFreqMHz(g_pWideGraph->m_dForceCenterFreq);
|
|
||||||
soundInThread.setForceCenterFreqBool(g_pWideGraph->m_bForceCenterFreq);
|
|
||||||
|
|
||||||
if(m_pctZap>30.0 and !m_transmitting) {
|
if(m_pctZap>30.0 and !m_transmitting) {
|
||||||
lab4->setStyleSheet("QLabel{background-color: #ff0000}");
|
lab4->setStyleSheet("QLabel{background-color: #ff0000}");
|
||||||
@ -1332,7 +1305,6 @@ void MainWindow::guiUpdate()
|
|||||||
lab1->setText(s);
|
lab1->setText(s);
|
||||||
} else if(m_monitoring) {
|
} else if(m_monitoring) {
|
||||||
lab1->setStyleSheet("QLabel{background-color: #00ff00}");
|
lab1->setStyleSheet("QLabel{background-color: #00ff00}");
|
||||||
m_nrx=soundInThread.nrx();
|
|
||||||
khsym=soundInThread.mhsym();
|
khsym=soundInThread.mhsym();
|
||||||
QString t;
|
QString t;
|
||||||
if(m_network) {
|
if(m_network) {
|
||||||
|
187
soundin.cpp
187
soundin.cpp
@ -71,6 +71,8 @@ extern "C" int a2dCallback( const void *inputBuffer, void *outputBuffer,
|
|||||||
float tmp;
|
float tmp;
|
||||||
float fac;
|
float fac;
|
||||||
|
|
||||||
|
if(framesToProcess != -99) return paContinue; //###
|
||||||
|
|
||||||
if( (statusFlags&paInputOverflow) != 0) {
|
if( (statusFlags&paInputOverflow) != 0) {
|
||||||
qDebug() << "Input Overflow";
|
qDebug() << "Input Overflow";
|
||||||
}
|
}
|
||||||
@ -135,15 +137,8 @@ void SoundInThread::run() //SoundInThread::run()
|
|||||||
{
|
{
|
||||||
quitExecution = false;
|
quitExecution = false;
|
||||||
|
|
||||||
if (m_net) {
|
|
||||||
// qDebug() << "Start inputUDP()";
|
|
||||||
inputUDP();
|
|
||||||
// qDebug() << "Finished inputUDP()";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------- Soundcard Setup
|
//---------------------------------------------------- Soundcard Setup
|
||||||
// qDebug() << "Start souncard input";
|
qDebug() << "Start souncard input";
|
||||||
|
|
||||||
PaError paerr;
|
PaError paerr;
|
||||||
PaStreamParameters inParam;
|
PaStreamParameters inParam;
|
||||||
@ -152,17 +147,14 @@ void SoundInThread::run() //SoundInThread::run()
|
|||||||
|
|
||||||
udata.kin=0; //Buffer pointer
|
udata.kin=0; //Buffer pointer
|
||||||
udata.bzero=false; //Flag to request reset of kin
|
udata.bzero=false; //Flag to request reset of kin
|
||||||
udata.nrx=m_nrx; //Number of polarizations
|
|
||||||
udata.iqswap=m_IQswap;
|
|
||||||
udata.b10db=m_10db;
|
|
||||||
|
|
||||||
inParam.device=m_nDevIn; //### Input Device Number ###
|
inParam.device=m_nDevIn; //### Input Device Number ###
|
||||||
inParam.channelCount=2*m_nrx; //Number of analog channels
|
inParam.channelCount=2; //Number of analog channels
|
||||||
inParam.sampleFormat=paFloat32; //Get floats from Portaudio
|
inParam.sampleFormat=paFloat32; //Get floats from Portaudio
|
||||||
inParam.suggestedLatency=0.05;
|
inParam.suggestedLatency=0.05;
|
||||||
inParam.hostApiSpecificStreamInfo=NULL;
|
inParam.hostApiSpecificStreamInfo=NULL;
|
||||||
|
|
||||||
paerr=Pa_IsFormatSupported(&inParam,NULL,96000.0);
|
paerr=Pa_IsFormatSupported(&inParam,NULL,48000.0);
|
||||||
if(paerr<0) {
|
if(paerr<0) {
|
||||||
emit error("PortAudio says requested soundcard format not supported.");
|
emit error("PortAudio says requested soundcard format not supported.");
|
||||||
// return;
|
// return;
|
||||||
@ -170,7 +162,7 @@ void SoundInThread::run() //SoundInThread::run()
|
|||||||
paerr=Pa_OpenStream(&inStream, //Input stream
|
paerr=Pa_OpenStream(&inStream, //Input stream
|
||||||
&inParam, //Input parameters
|
&inParam, //Input parameters
|
||||||
NULL, //No output parameters
|
NULL, //No output parameters
|
||||||
96000.0, //Sample rate
|
48000.0, //Sample rate
|
||||||
FRAMES_PER_BUFFER, //Frames per buffer
|
FRAMES_PER_BUFFER, //Frames per buffer
|
||||||
// paClipOff+paDitherOff, //No clipping or dithering
|
// paClipOff+paDitherOff, //No clipping or dithering
|
||||||
paClipOff, //No clipping
|
paClipOff, //No clipping
|
||||||
@ -185,10 +177,10 @@ void SoundInThread::run() //SoundInThread::run()
|
|||||||
// const PaStreamInfo* p=Pa_GetStreamInfo(inStream);
|
// const PaStreamInfo* p=Pa_GetStreamInfo(inStream);
|
||||||
|
|
||||||
bool qe = quitExecution;
|
bool qe = quitExecution;
|
||||||
int n60z=99;
|
int n30z=99;
|
||||||
int k=0;
|
int k=0;
|
||||||
int nsec;
|
int nsec;
|
||||||
int n60;
|
int n30;
|
||||||
int nBusy=0;
|
int nBusy=0;
|
||||||
int nhsym0=0;
|
int nhsym0=0;
|
||||||
|
|
||||||
@ -198,206 +190,51 @@ void SoundInThread::run() //SoundInThread::run()
|
|||||||
if (qe) break;
|
if (qe) break;
|
||||||
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
||||||
nsec = ms/1000; // Time according to this computer
|
nsec = ms/1000; // Time according to this computer
|
||||||
n60 = nsec % 60;
|
n30 = nsec % 30;
|
||||||
|
|
||||||
// Reset buffer pointer and symbol number at start of minute
|
// Reset buffer pointer and symbol number at start of minute
|
||||||
if(n60 < n60z or !m_monitoring) {
|
if(n30 < n30z or !m_monitoring) {
|
||||||
nhsym0=0;
|
nhsym0=0;
|
||||||
udata.bzero=true;
|
udata.bzero=true;
|
||||||
}
|
}
|
||||||
k=udata.kin;
|
k=udata.kin;
|
||||||
udata.iqswap=m_IQswap;
|
|
||||||
udata.b10db=m_10db;
|
|
||||||
if(m_monitoring) {
|
if(m_monitoring) {
|
||||||
if(m_bForceCenterFreq) {
|
|
||||||
datcom_.fcenter=m_dForceCenterFreq;\
|
|
||||||
} else {
|
|
||||||
datcom_.fcenter=144.125;
|
|
||||||
}
|
|
||||||
m_hsym=(k-2048)*11025.0/(2048.0*m_rate);
|
m_hsym=(k-2048)*11025.0/(2048.0*m_rate);
|
||||||
if(m_hsym != nhsym0) {
|
if(m_hsym != nhsym0) {
|
||||||
if(m_dataSinkBusy) {
|
if(m_dataSinkBusy) {
|
||||||
nBusy++;
|
nBusy++;
|
||||||
} else {
|
} else {
|
||||||
m_dataSinkBusy=true;
|
m_dataSinkBusy=true;
|
||||||
emit readyForFFT(k); //Signal to compute new FFTs
|
// emit readyForFFT(k); //Signal to compute new FFTs
|
||||||
}
|
}
|
||||||
nhsym0=m_hsym;
|
nhsym0=m_hsym;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
msleep(100);
|
msleep(100);
|
||||||
n60z=n60;
|
n30z=n30;
|
||||||
}
|
}
|
||||||
Pa_StopStream(inStream);
|
Pa_StopStream(inStream);
|
||||||
Pa_CloseStream(inStream);
|
Pa_CloseStream(inStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundInThread::setSwapIQ(bool b)
|
|
||||||
{
|
|
||||||
m_IQswap=b;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SoundInThread::set10db(bool b)
|
|
||||||
{
|
|
||||||
m_10db=b;
|
|
||||||
}
|
|
||||||
void SoundInThread::setPort(int n) //setPort()
|
|
||||||
{
|
|
||||||
if (isRunning()) return;
|
|
||||||
this->m_udpPort=n;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SoundInThread::setInputDevice(int n) //setInputDevice()
|
void SoundInThread::setInputDevice(int n) //setInputDevice()
|
||||||
{
|
{
|
||||||
if (isRunning()) return;
|
if (isRunning()) return;
|
||||||
this->m_nDevIn=n;
|
this->m_nDevIn=n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundInThread::setRate(double rate) //setRate()
|
|
||||||
{
|
|
||||||
if (isRunning()) return;
|
|
||||||
this->m_rate = rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SoundInThread::setBufSize(unsigned n) //setBufSize()
|
|
||||||
{
|
|
||||||
if (isRunning()) return;
|
|
||||||
this->bufSize = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SoundInThread::setFadd(double x)
|
|
||||||
{
|
|
||||||
m_fAdd=x;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SoundInThread::quit() //quit()
|
void SoundInThread::quit() //quit()
|
||||||
{
|
{
|
||||||
quitExecution = true;
|
quitExecution = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundInThread::setNetwork(bool b) //setNetwork()
|
|
||||||
{
|
|
||||||
m_net = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SoundInThread::setMonitoring(bool b) //setMonitoring()
|
void SoundInThread::setMonitoring(bool b) //setMonitoring()
|
||||||
{
|
{
|
||||||
m_monitoring = b;
|
m_monitoring = b;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundInThread::setForceCenterFreqBool(bool b)
|
|
||||||
{
|
|
||||||
m_bForceCenterFreq=b;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void SoundInThread::setForceCenterFreqMHz(double d)
|
|
||||||
{
|
|
||||||
m_dForceCenterFreq=d;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SoundInThread::setNrx(int n) //setNrx()
|
|
||||||
{
|
|
||||||
m_nrx = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SoundInThread::nrx()
|
|
||||||
{
|
|
||||||
return m_nrx;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SoundInThread::mhsym()
|
int SoundInThread::mhsym()
|
||||||
{
|
{
|
||||||
return m_hsym;
|
return m_hsym;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------- inputUDP()
|
|
||||||
void SoundInThread::inputUDP()
|
|
||||||
{
|
|
||||||
udpSocket = new QUdpSocket();
|
|
||||||
if(!udpSocket->bind(m_udpPort,QUdpSocket::ShareAddress) )
|
|
||||||
{
|
|
||||||
emit error(tr("UDP Socket bind failed."));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set this socket's total buffer space for received UDP packets
|
|
||||||
int v=141600;
|
|
||||||
::setsockopt(udpSocket->socketDescriptor(), SOL_SOCKET, SO_RCVBUF,
|
|
||||||
(char *)&v, sizeof(v));
|
|
||||||
|
|
||||||
bool qe = quitExecution;
|
|
||||||
struct linradBuffer {
|
|
||||||
double cfreq;
|
|
||||||
int msec;
|
|
||||||
float userfreq;
|
|
||||||
int iptr;
|
|
||||||
quint16 iblk;
|
|
||||||
qint8 nrx;
|
|
||||||
char iusb;
|
|
||||||
double d8[174];
|
|
||||||
} b;
|
|
||||||
|
|
||||||
int n60z=99;
|
|
||||||
int k=0;
|
|
||||||
int nsec;
|
|
||||||
int n60;
|
|
||||||
int nhsym0=0;
|
|
||||||
int iz=174;
|
|
||||||
int nBusy=0;
|
|
||||||
|
|
||||||
// Main loop for input of UDP packets over the network:
|
|
||||||
while (!qe) {
|
|
||||||
qe = quitExecution;
|
|
||||||
if (qe) break;
|
|
||||||
if (!udpSocket->hasPendingDatagrams()) {
|
|
||||||
msleep(2); // Sleep if no packet available
|
|
||||||
} else {
|
|
||||||
int nBytesRead = udpSocket->readDatagram((char *)&b,1416);
|
|
||||||
if (nBytesRead != 1416) qDebug() << "UDP Read Error:" << nBytesRead;
|
|
||||||
|
|
||||||
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
|
||||||
nsec = ms/1000; // Time according to this computer
|
|
||||||
n60 = nsec % 60;
|
|
||||||
|
|
||||||
// Reset buffer pointer and symbol number at start of minute
|
|
||||||
if(n60 < n60z) {
|
|
||||||
k=0;
|
|
||||||
nhsym0=0;
|
|
||||||
}
|
|
||||||
n60z=n60;
|
|
||||||
|
|
||||||
if(m_monitoring) {
|
|
||||||
m_nrx=b.nrx;
|
|
||||||
if(m_nrx == +1) iz=348; //One RF channel, i*2 data
|
|
||||||
if(m_nrx == -1 or m_nrx == +2) iz=174; //One Rf channel, r*4 data
|
|
||||||
// or 2 RF channels, i*2 data
|
|
||||||
if(m_nrx == -2) iz=87; // Two RF channels, r*4 data
|
|
||||||
|
|
||||||
// If buffer will not overflow, move data into datcom_
|
|
||||||
if ((k+iz) <= 60*96000) {
|
|
||||||
int nsam=-1;
|
|
||||||
recvpkt_(&nsam, &b.iblk, &b.nrx, &k, b.d8, b.d8, b.d8);
|
|
||||||
if(m_bForceCenterFreq) {
|
|
||||||
datcom_.fcenter=m_dForceCenterFreq;
|
|
||||||
} else {
|
|
||||||
datcom_.fcenter=b.cfreq + m_fAdd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_hsym=(k-2048)*11025.0/(2048.0*m_rate);
|
|
||||||
if(m_hsym != nhsym0) {
|
|
||||||
if(m_dataSinkBusy) {
|
|
||||||
nBusy++;
|
|
||||||
} else {
|
|
||||||
m_dataSinkBusy=true;
|
|
||||||
emit readyForFFT(k); //Signal to compute new FFTs
|
|
||||||
}
|
|
||||||
nhsym0=m_hsym;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete udpSocket;
|
|
||||||
}
|
|
||||||
|
15
soundin.h
15
soundin.h
@ -2,7 +2,6 @@
|
|||||||
#define SOUNDIN_H
|
#define SOUNDIN_H
|
||||||
|
|
||||||
#include <QtCore>
|
#include <QtCore>
|
||||||
#include <QtNetwork/QUdpSocket>
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <valarray>
|
#include <valarray>
|
||||||
|
|
||||||
@ -35,19 +34,8 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void setSwapIQ(bool b);
|
|
||||||
void set10db(bool b);
|
|
||||||
void setPort(qint32 n);
|
|
||||||
void setInputDevice(qint32 n);
|
void setInputDevice(qint32 n);
|
||||||
void setRate(double rate);
|
|
||||||
void setBufSize(unsigned bufSize);
|
|
||||||
void setNetwork(bool b);
|
|
||||||
void setMonitoring(bool b);
|
void setMonitoring(bool b);
|
||||||
void setFadd(double x);
|
|
||||||
void setNrx(int n);
|
|
||||||
void setForceCenterFreqBool(bool b);
|
|
||||||
void setForceCenterFreqMHz(double d);
|
|
||||||
int nrx();
|
|
||||||
int mhsym();
|
int mhsym();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@ -60,7 +48,6 @@ public slots:
|
|||||||
void quit();
|
void quit();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void inputUDP();
|
|
||||||
|
|
||||||
double m_fAdd;
|
double m_fAdd;
|
||||||
bool m_net;
|
bool m_net;
|
||||||
@ -72,9 +59,7 @@ private:
|
|||||||
qint32 m_nrx;
|
qint32 m_nrx;
|
||||||
qint32 m_hsym;
|
qint32 m_hsym;
|
||||||
qint32 m_nDevIn;
|
qint32 m_nDevIn;
|
||||||
qint32 m_udpPort;
|
|
||||||
|
|
||||||
QUdpSocket *udpSocket;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
Loading…
Reference in New Issue
Block a user