Attempting to trace the occasional crashes seen by a few users.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@3620 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Joe Taylor 2014-01-07 17:14:59 +00:00
parent a3fa7fd539
commit e39c3f468b
7 changed files with 80 additions and 77 deletions

View File

@ -1,16 +1,16 @@
#include "Detector.hpp" #include "Detector.hpp"
#include <QDateTime> #include <QDateTime>
#include <QtAlgorithms> #include <QtAlgorithms>
#include <QDebug> #include <QDebug>
#include "commons.h" #include "commons.h"
extern "C" { extern "C" {
void fil4_(qint16*, qint32*, qint16*, qint32*); void fil4_(qint16*, qint32*, qint16*, qint32*);
} }
Detector::Detector (unsigned frameRate, unsigned periodLengthInSeconds, unsigned framesPerSignal, unsigned downSampleFactor, QObject * parent) Detector::Detector (unsigned frameRate, unsigned periodLengthInSeconds,
unsigned framesPerSignal, unsigned downSampleFactor,
QObject * parent)
: AudioDevice (parent) : AudioDevice (parent)
, m_frameRate (frameRate) , m_frameRate (frameRate)
, m_period (periodLengthInSeconds) , m_period (periodLengthInSeconds)
@ -18,7 +18,8 @@ Detector::Detector (unsigned frameRate, unsigned periodLengthInSeconds, unsigned
, m_framesPerSignal (framesPerSignal) , m_framesPerSignal (framesPerSignal)
, m_monitoring (false) , m_monitoring (false)
, m_starting (false) , m_starting (false)
, m_buffer ((downSampleFactor > 1) ? new short [framesPerSignal * downSampleFactor] : 0) , m_buffer ((downSampleFactor > 1) ?
new short [framesPerSignal * downSampleFactor] : 0)
, m_bufferPos (0) , m_bufferPos (0)
{ {
clear (); clear ();
@ -44,79 +45,78 @@ void Detector::clear ()
qint64 Detector::writeData (char const * data, qint64 maxSize) qint64 Detector::writeData (char const * data, qint64 maxSize)
{ {
if (m_monitoring) if (m_monitoring) {
{ // no torn frames
Q_ASSERT (!(maxSize % static_cast<qint64> (bytesPerFrame ()))); // no torn frames Q_ASSERT (!(maxSize % static_cast<qint64> (bytesPerFrame ())));
// these are in terms of input frames (not down sampled)
size_t framesAcceptable ((sizeof (jt9com_.d2) /
sizeof (jt9com_.d2[0]) - jt9com_.kin) * m_downSampleFactor);
size_t framesAccepted (qMin (static_cast<size_t> (maxSize /
bytesPerFrame ()), framesAcceptable));
// these are in terms of input frames (not down sampled) if (framesAccepted < static_cast<size_t> (maxSize / bytesPerFrame ())) {
size_t framesAcceptable ((sizeof (jt9com_.d2) / sizeof (jt9com_.d2[0]) - jt9com_.kin) * m_downSampleFactor); qDebug () << "dropped " << maxSize / bytesPerFrame () - framesAccepted
size_t framesAccepted (qMin (static_cast<size_t> (maxSize / bytesPerFrame ()), framesAcceptable)); << " frames of data on the floor!";
}
if (framesAccepted < static_cast<size_t> (maxSize / bytesPerFrame ())) for (unsigned remaining = framesAccepted; remaining; ) {
{ size_t numFramesProcessed (qMin (m_framesPerSignal *
qDebug () << "dropped " << maxSize / bytesPerFrame () - framesAccepted << " frames of data on the floor!"; m_downSampleFactor - m_bufferPos, remaining));
}
for (unsigned remaining = framesAccepted; remaining; ) if(m_downSampleFactor > 1) {
{ store (&data[(framesAccepted - remaining) * bytesPerFrame ()],
size_t numFramesProcessed (qMin (m_framesPerSignal * m_downSampleFactor - m_bufferPos, remaining)); numFramesProcessed, &m_buffer[m_bufferPos]);
m_bufferPos += numFramesProcessed;
if(m_bufferPos==m_framesPerSignal*m_downSampleFactor && m_monitoring) {
qint32 framesToProcess (m_framesPerSignal * m_downSampleFactor);
qint32 framesAfterDownSample;
if(framesToProcess!=13824) qDebug() << "framesToProcess ="
<< framesToProcess;
if(jt9com_.kin<0 or jt9com_.kin>=1440000) qDebug() << "jt9com_.kin ="
<< jt9com_.kin;
fil4_(&m_buffer[0], &framesToProcess, &jt9com_.d2[jt9com_.kin],
&framesAfterDownSample);
Q_ASSERT(framesAfterDownSample==3456);
jt9com_.kin += framesAfterDownSample;
Q_EMIT framesWritten (jt9com_.kin);
m_bufferPos = 0;
}
if (m_downSampleFactor > 1) } else {
{ store (&data[(framesAccepted - remaining) * bytesPerFrame ()],
store (&data[(framesAccepted - remaining) * bytesPerFrame ()], numFramesProcessed, &m_buffer[m_bufferPos]); numFramesProcessed, &jt9com_.d2[jt9com_.kin]);
m_bufferPos += numFramesProcessed; m_bufferPos += numFramesProcessed;
if (m_bufferPos == m_framesPerSignal * m_downSampleFactor && m_monitoring) jt9com_.kin += numFramesProcessed;
{ if (m_bufferPos == static_cast<unsigned> (m_framesPerSignal) &&
qint32 framesToProcess (m_framesPerSignal * m_downSampleFactor); m_monitoring) {
qint32 framesAfterDownSample; Q_EMIT framesWritten (jt9com_.kin);
fil4_(&m_buffer[0], &framesToProcess, &jt9com_.d2[jt9com_.kin], &framesAfterDownSample); m_bufferPos = 0;
jt9com_.kin += framesAfterDownSample; }
Q_EMIT framesWritten (jt9com_.kin);
m_bufferPos = 0;
}
}
else
{
store (&data[(framesAccepted - remaining) * bytesPerFrame ()], numFramesProcessed, &jt9com_.d2[jt9com_.kin]);
m_bufferPos += numFramesProcessed;
jt9com_.kin += numFramesProcessed;
if (m_bufferPos == static_cast<unsigned> (m_framesPerSignal) && m_monitoring)
{
Q_EMIT framesWritten (jt9com_.kin);
m_bufferPos = 0;
}
}
if (!secondInPeriod ())
{
if (!m_starting)
{
// next samples will be in new period so wrap around to
// start of buffer
//
// we don't bother calling reset () since we expect to fill
// the whole buffer and don't need to waste cycles zeroing
jt9com_.kin = 0;
m_bufferPos = 0;
m_starting = true;
}
}
else if (m_starting)
{
m_starting = false;
}
remaining -= numFramesProcessed;
}
}
else
{
jt9com_.kin = 0;
m_bufferPos = 0;
} }
return maxSize; // we drop any data past the end of the buffer on if (!secondInPeriod ()) {
// the floor until the next period starts if (!m_starting) {
// next samples will be in new period so wrap around to
// start of buffer
//
// we don't bother calling reset () since we expect to fill
// the whole buffer and don't need to waste cycles zeroing
jt9com_.kin = 0;
m_bufferPos = 0;
m_starting = true;
}
} else if(m_starting) {
m_starting = false;
}
remaining -= numFramesProcessed;
}
} else {
jt9com_.kin = 0;
m_bufferPos = 0;
}
return maxSize; // we drop any data past the end of the buffer on
// the floor until the next period starts
} }
unsigned Detector::secondInPeriod () const unsigned Detector::secondInPeriod () const

View File

@ -85,6 +85,7 @@ void Modulator::open (unsigned symbolsLength, double framesPerSymbol, unsigned f
qint64 Modulator::readData (char * data, qint64 maxSize) qint64 Modulator::readData (char * data, qint64 maxSize)
{ {
if(maxSize==0) return 0;
Q_ASSERT (!(maxSize % static_cast<qint64> (bytesPerFrame ()))); // no torn frames Q_ASSERT (!(maxSize % static_cast<qint64> (bytesPerFrame ()))); // no torn frames
Q_ASSERT (isOpen ()); Q_ASSERT (isOpen ());

View File

@ -36,7 +36,7 @@ QTextEdit* pShortcuts;
QTcpSocket* commanderSocket = new QTcpSocket(0); QTcpSocket* commanderSocket = new QTcpSocket(0);
QString rev="$Rev$"; QString rev="$Rev$";
QString Program_Title_Version=" WSJT-X v1.2.1, r" + rev.mid(6,4) + QString Program_Title_Version=" WSJT-X v1.2.2, r" + rev.mid(6,4) +
" by K1JT"; " by K1JT";
//-------------------------------------------------- MainWindow constructor //-------------------------------------------------- MainWindow constructor
@ -49,7 +49,7 @@ MainWindow::MainWindow(QSettings * settings, QSharedMemory *shdmem, QString *the
ui(new Ui::MainWindow), ui(new Ui::MainWindow),
m_wideGraph (new WideGraph (settings)), m_wideGraph (new WideGraph (settings)),
m_logDlg (new LogQSO (settings, this)), m_logDlg (new LogQSO (settings, this)),
m_detector (RX_SAMPLE_RATE, NTMAX / 2, 6912 / 2, downSampleFactor), m_detector (RX_SAMPLE_RATE, NTMAX/2, 6912/2, downSampleFactor),
m_audioInputDevice (QAudioDeviceInfo::defaultInputDevice ()), // start with default m_audioInputDevice (QAudioDeviceInfo::defaultInputDevice ()), // start with default
m_modulator (TX_SAMPLE_RATE, NTMAX / 2), m_modulator (TX_SAMPLE_RATE, NTMAX / 2),
m_audioOutputDevice (QAudioDeviceInfo::defaultOutputDevice ()), // start with default m_audioOutputDevice (QAudioDeviceInfo::defaultOutputDevice ()), // start with default
@ -711,6 +711,7 @@ void MainWindow::dataSink(qint64 frames)
jt9com_.ndiskdat=0; jt9com_.ndiskdat=0;
} }
// Get power, spectrum, and ihsym // Get power, spectrum, and ihsym
trmin=m_TRperiod/60; trmin=m_TRperiod/60;
slope=0.0; slope=0.0;

View File

@ -113,7 +113,7 @@ void PSK_Reporter::dnsLookupResult(QHostInfo info)
{ {
if (!info.addresses().isEmpty()) { if (!info.addresses().isEmpty()) {
m_pskReporterAddress = info.addresses().at(0); m_pskReporterAddress = info.addresses().at(0);
qDebug() << "PSK Reporter IP: " << m_pskReporterAddress; // qDebug() << "PSK Reporter IP: " << m_pskReporterAddress;
} }
} }

View File

@ -78,6 +78,7 @@ void SoundOutput::startStream (QAudioDeviceInfo const& device, unsigned channels
m_stream.reset (new QAudioOutput (device, format, this)); m_stream.reset (new QAudioOutput (device, format, this));
audioError (); audioError ();
m_stream->setVolume (m_volume); m_stream->setVolume (m_volume);
m_stream->setNotifyInterval(100);
connect (m_stream.data(), &QAudioOutput::stateChanged, this, &SoundOutput::handleStateChanged); connect (m_stream.data(), &QAudioOutput::stateChanged, this, &SoundOutput::handleStateChanged);
@ -129,7 +130,7 @@ void SoundOutput::setAttenuation (qreal a)
{ {
Q_ASSERT (0. <= a && a <= 99.); Q_ASSERT (0. <= a && a <= 99.);
m_volume = qPow (10., -a / 10.); m_volume = qPow (10., -a / 10.);
qDebug () << "SoundOut: attn = " << a << ", vol = " << m_volume; // qDebug () << "SoundOut: attn = " << a << ", vol = " << m_volume;
if (m_stream) if (m_stream)
{ {
m_stream->setVolume (m_volume); m_stream->setVolume (m_volume);

View File

@ -1,6 +1,6 @@
[Setup] [Setup]
AppName=wsjtx AppName=wsjtx
AppVerName=wsjtx Version 1.2.1 r3587 AppVerName=wsjtx Version 1.2.1a r3590
AppCopyright=Copyright (C) 2001-2013 by Joe Taylor, K1JT AppCopyright=Copyright (C) 2001-2013 by Joe Taylor, K1JT
DefaultDirName=c:\wsjtx1.2 DefaultDirName=c:\wsjtx1.2
DefaultGroupName=wsjtx1.2 DefaultGroupName=wsjtx1.2

View File

@ -7,7 +7,7 @@
QT += network multimedia QT += network multimedia
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += thread CONFIG += thread
#CONFIG += console CONFIG += console
TARGET = wsjtx TARGET = wsjtx
#DESTDIR = ../qt4_install #DESTDIR = ../qt4_install