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:
Joe Taylor 2012-07-03 20:07:37 +00:00
parent f8c1b6ed23
commit 6703d4850d
3 changed files with 12 additions and 218 deletions

View File

@ -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) {

View File

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

View File

@ -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" {