1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-14 04:11:48 -05:00

File source: effective file selection. Better definition of open, start and stop actions

This commit is contained in:
f4exb 2015-08-05 03:25:06 +02:00
parent 5b0cc63c72
commit 196cf51089
5 changed files with 149 additions and 57 deletions

View File

@ -34,6 +34,7 @@ FileSourceGui::FileSourceGui(PluginAPI* pluginAPI, QWidget* parent) :
m_settings(), m_settings(),
m_sampleSource(NULL), m_sampleSource(NULL),
m_acquisition(false), m_acquisition(false),
m_fileName("..."),
m_sampleRate(0), m_sampleRate(0),
m_centerFrequency(0), m_centerFrequency(0),
m_startingTimeStamp(0), m_startingTimeStamp(0),
@ -42,6 +43,7 @@ FileSourceGui::FileSourceGui(PluginAPI* pluginAPI, QWidget* parent) :
ui->setupUi(this); ui->setupUi(this);
ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::ReverseGold)); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::ReverseGold));
ui->centerFrequency->setValueRange(7, 0, pow(10,7)); ui->centerFrequency->setValueRange(7, 0, pow(10,7));
ui->fileNameText->setText(m_fileName);
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware()));
displaySettings(); displaySettings();
@ -118,13 +120,20 @@ bool FileSourceGui::deserialize(const QByteArray& data)
bool FileSourceGui::handleMessage(Message* message) bool FileSourceGui::handleMessage(Message* message)
{ {
if(FileSourceInput::MsgReportFileSource::match(message)) if(FileSourceInput::MsgReportFileSourceAcquisition::match(message))
{ {
m_acquisition = ((FileSourceInput::MsgReportFileSource*)message)->getAcquisition(); m_acquisition = ((FileSourceInput::MsgReportFileSourceAcquisition*)message)->getAcquisition();
m_sampleRate = ((FileSourceInput::MsgReportFileSource*)message)->getSampleRate(); updateWithAcquisition();
m_centerFrequency = ((FileSourceInput::MsgReportFileSource*)message)->getCenterFrequency(); message->completed();
m_startingTimeStamp = ((FileSourceInput::MsgReportFileSource*)message)->getStartingTimeStamp(); return true;
displaySettings(); }
else if(FileSourceInput::MsgReportFileSourceStreamData::match(message))
{
std::cerr << "FileSourceGui::handleMessage: MsgReportFileSourceStreamData" << std::endl;
m_sampleRate = ((FileSourceInput::MsgReportFileSourceStreamData*)message)->getSampleRate();
m_centerFrequency = ((FileSourceInput::MsgReportFileSourceStreamData*)message)->getCenterFrequency();
m_startingTimeStamp = ((FileSourceInput::MsgReportFileSourceStreamData*)message)->getStartingTimeStamp();
updateWithStreamData();
message->completed(); message->completed();
return true; return true;
} }
@ -135,15 +144,64 @@ bool FileSourceGui::handleMessage(Message* message)
} }
void FileSourceGui::displaySettings() void FileSourceGui::displaySettings()
{
}
void FileSourceGui::sendSettings()
{
/*
if(!m_updateTimer.isActive())
m_updateTimer.start(100);
*/
}
void FileSourceGui::updateHardware()
{
/*
FileSourceInput::MsgConfigureFileSource* message = FileSourceInput::MsgConfigureFileSource::create(m_generalSettings, m_settings);
message->submit(m_pluginAPI->getDSPEngineMessageQueue());
m_updateTimer.stop();*/
}
void FileSourceGui::on_play_toggled(bool checked)
{
}
void FileSourceGui::on_showFileDialog_clicked(bool checked)
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open I/Q record file"), ".", tr("SDR I/Q Files (*.sdriq)"));
if (fileName != "") {
m_fileName = fileName;
ui->fileNameText->setText(m_fileName);
configureFileName();
}
}
void FileSourceGui::configureFileName()
{
std::cerr << "FileSourceGui::configureFileName: " << m_fileName.toStdString() << std::endl;
FileSourceInput::MsgConfigureFileName* message = FileSourceInput::MsgConfigureFileName::create(m_fileName);
message->submit(m_pluginAPI->getDSPEngineMessageQueue());
}
void FileSourceGui::updateWithAcquisition()
{
ui->play->setEnabled(m_acquisition);
ui->play->setChecked(m_acquisition);
ui->showFileDialog->setEnabled(!m_acquisition);
}
void FileSourceGui::updateWithStreamData()
{ {
ui->centerFrequency->setValue(m_centerFrequency/1000); ui->centerFrequency->setValue(m_centerFrequency/1000);
QString s = QString::number(m_sampleRate/1000.0, 'f', 0); QString s = QString::number(m_sampleRate/1000.0, 'f', 0);
ui->sampleRateText->setText(tr("%1k").arg(s)); ui->sampleRateText->setText(tr("%1k").arg(s));
ui->play->setEnabled(m_acquisition); ui->play->setEnabled(m_acquisition);
displayTime(); updateWithStreamTime(); // TODO: remove when time data is implemented
} }
void FileSourceGui::displayTime() void FileSourceGui::updateWithStreamTime()
{ {
int t_sec = 0; int t_sec = 0;
int t_msec = 0; int t_msec = 0;
@ -166,31 +224,3 @@ void FileSourceGui::displayTime()
QString s_date = dt.toString("yyyyMMdd hh.mm.ss.zzz"); QString s_date = dt.toString("yyyyMMdd hh.mm.ss.zzz");
ui->absTimeText->setText(s_date); ui->absTimeText->setText(s_date);
} }
void FileSourceGui::sendSettings()
{
if(!m_updateTimer.isActive())
m_updateTimer.start(100);
}
void FileSourceGui::updateHardware()
{
FileSourceInput::MsgConfigureFileSource* message = FileSourceInput::MsgConfigureFileSource::create(m_generalSettings, m_settings);
message->submit(m_pluginAPI->getDSPEngineMessageQueue());
m_updateTimer.stop();
}
void FileSourceGui::on_play_toggled(bool checked)
{
}
void FileSourceGui::on_showFileDialog_clicked(bool checked)
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open I/Q record file"), ".", tr("SDR I/Q Files (*.sdriq)"));
if (fileName != "") {
m_settings.m_fileName = fileName;
ui->fileNameText->setText(m_settings.m_fileName);
sendSettings();
}
}

View File

@ -57,6 +57,7 @@ private:
std::vector<int> m_gains; std::vector<int> m_gains;
SampleSource* m_sampleSource; SampleSource* m_sampleSource;
bool m_acquisition; bool m_acquisition;
QString m_fileName;
int m_sampleRate; int m_sampleRate;
quint64 m_centerFrequency; quint64 m_centerFrequency;
std::time_t m_startingTimeStamp; std::time_t m_startingTimeStamp;
@ -66,6 +67,10 @@ private:
void displayTime(); void displayTime();
void sendSettings(); void sendSettings();
void updateHardware(); void updateHardware();
void configureFileName();
void updateWithAcquisition();
void updateWithStreamData();
void updateWithStreamTime();
private slots: private slots:
void on_playLoop_toggled(bool checked); void on_playLoop_toggled(bool checked);

View File

@ -27,7 +27,9 @@
#include "filesourcethread.h" #include "filesourcethread.h"
MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSource, Message) MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSource, Message)
MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSource, Message) MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileName, Message)
MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceAcquisition, Message)
MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceStreamData, Message)
FileSourceInput::Settings::Settings() : FileSourceInput::Settings::Settings() :
m_fileName("./test.sdriq") m_fileName("./test.sdriq")
@ -70,6 +72,7 @@ FileSourceInput::FileSourceInput(MessageQueue* msgQueueToGUI, const QTimer& mast
m_settings(), m_settings(),
m_fileSourceThread(NULL), m_fileSourceThread(NULL),
m_deviceDescription(), m_deviceDescription(),
m_fileName("..."),
m_sampleRate(0), m_sampleRate(0),
m_centerFrequency(0), m_centerFrequency(0),
m_startingTimeStamp(0), m_startingTimeStamp(0),
@ -84,30 +87,46 @@ FileSourceInput::~FileSourceInput()
void FileSourceInput::openFileStream() void FileSourceInput::openFileStream()
{ {
std::cerr << "FileSourceInput::openFileStream: " << m_fileName.toStdString() << std::endl;
//stopInput();
if (m_ifstream.is_open()) { if (m_ifstream.is_open()) {
m_ifstream.close(); m_ifstream.close();
} }
m_ifstream.open(m_settings.m_fileName.toStdString().c_str(), std::ios::binary); m_ifstream.open(m_fileName.toStdString().c_str(), std::ios::binary);
FileSink::Header header; FileSink::Header header;
FileSink::readHeader(m_ifstream, header); FileSink::readHeader(m_ifstream, header);
m_sampleRate = header.sampleRate; m_sampleRate = header.sampleRate;
m_centerFrequency = header.centerFrequency; m_centerFrequency = header.centerFrequency;
m_startingTimeStamp = header.startTimeStamp; m_startingTimeStamp = header.startTimeStamp;
MsgReportFileSourceStreamData::create(m_sampleRate, m_centerFrequency, m_startingTimeStamp)->submit(m_guiMessageQueue); // file stream data
} }
bool FileSourceInput::startInput(int device) bool FileSourceInput::startInput(int device)
{ {
std::cerr << "FileSourceInput::startInput" << std::endl;
QMutexLocker mutexLocker(&m_mutex); QMutexLocker mutexLocker(&m_mutex);
std::cerr << "FileSourceInput::startInput" << std::endl;
/*
if (!m_ifstream.is_open()) {
openFileStream();
}*/
if (m_ifstream.tellg() != 0) {
m_ifstream.clear();
m_ifstream.seekg(0, std::ios::beg);
}
if(!m_sampleFifo.setSize(96000 * 4)) { if(!m_sampleFifo.setSize(96000 * 4)) {
qCritical("Could not allocate SampleFifo"); qCritical("Could not allocate SampleFifo");
return false; return false;
} }
openFileStream(); //openFileStream();
if((m_fileSourceThread = new FileSourceThread(&m_ifstream, &m_sampleFifo)) == NULL) { if((m_fileSourceThread = new FileSourceThread(&m_ifstream, &m_sampleFifo)) == NULL) {
qFatal("out of memory"); qFatal("out of memory");
@ -119,9 +138,9 @@ bool FileSourceInput::startInput(int device)
m_fileSourceThread->startWork(); m_fileSourceThread->startWork();
mutexLocker.unlock(); mutexLocker.unlock();
applySettings(m_generalSettings, m_settings, true); //applySettings(m_generalSettings, m_settings, true);
MsgReportFileSource::create(true, m_sampleRate, m_centerFrequency, m_startingTimeStamp)->submit(m_guiMessageQueue); // acquisition on MsgReportFileSourceAcquisition::create(true)->submit(m_guiMessageQueue); // acquisition on
return true; return true;
@ -143,7 +162,7 @@ void FileSourceInput::stopInput()
m_deviceDescription.clear(); m_deviceDescription.clear();
MsgReportFileSource::create(false, m_sampleRate, m_centerFrequency, m_startingTimeStamp)->submit(m_guiMessageQueue); // acquisition off MsgReportFileSourceAcquisition::create(false)->submit(m_guiMessageQueue); // acquisition off
} }
const QString& FileSourceInput::getDeviceDescription() const const QString& FileSourceInput::getDeviceDescription() const
@ -168,10 +187,11 @@ std::time_t FileSourceInput::getStartingTimeStamp() const
bool FileSourceInput::handleMessage(Message* message) bool FileSourceInput::handleMessage(Message* message)
{ {
if(MsgConfigureFileSource::match(message)) { if(MsgConfigureFileName::match(message)) {
MsgConfigureFileSource* conf = (MsgConfigureFileSource*)message; std::cerr << "FileSourceInput::handleMessage: MsgConfigureFileName" << std::endl;
if(!applySettings(conf->getGeneralSettings(), conf->getSettings(), false)) MsgConfigureFileName* conf = (MsgConfigureFileName*) message;
qDebug("File Source config error"); m_fileName = conf->getFileName();
openFileStream();
message->completed(); message->completed();
return true; return true;
} else { } else {

View File

@ -60,30 +60,66 @@ public:
{ } { }
}; };
class MsgReportFileSource : public Message { class MsgConfigureFileName : public Message {
MESSAGE_CLASS_DECLARATION
public:
const QString& getFileName() const { return m_fileName; }
static MsgConfigureFileName* create(const QString& fileName)
{
return new MsgConfigureFileName(fileName);
}
private:
QString m_fileName;
MsgConfigureFileName(const QString& fileName) :
Message(),
m_fileName(fileName)
{ }
};
class MsgReportFileSourceAcquisition : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
bool getAcquisition() const { return m_acquisition; } bool getAcquisition() const { return m_acquisition; }
int getSampleRate() const { return m_sampleRate; }
quint64 getCenterFrequency() const { return m_centerFrequency; }
std::time_t getStartingTimeStamp() const { return m_startingTimeStamp; }
static MsgReportFileSource* create(bool acquisition, int sampleRate, quint64 centerFrequency, std::time_t startingTimeStamp) static MsgReportFileSourceAcquisition* create(bool acquisition)
{ {
return new MsgReportFileSource(acquisition, sampleRate, centerFrequency, startingTimeStamp); return new MsgReportFileSourceAcquisition(acquisition);
} }
protected: protected:
bool m_acquisition; bool m_acquisition;
MsgReportFileSourceAcquisition(bool acquisition) :
Message(),
m_acquisition(acquisition)
{ }
};
class MsgReportFileSourceStreamData : public Message {
MESSAGE_CLASS_DECLARATION
public:
int getSampleRate() const { return m_sampleRate; }
quint64 getCenterFrequency() const { return m_centerFrequency; }
std::time_t getStartingTimeStamp() const { return m_startingTimeStamp; }
static MsgReportFileSourceStreamData* create(int sampleRate, quint64 centerFrequency, std::time_t startingTimeStamp)
{
return new MsgReportFileSourceStreamData(sampleRate, centerFrequency, startingTimeStamp);
}
protected:
int m_sampleRate; int m_sampleRate;
quint64 m_centerFrequency; quint64 m_centerFrequency;
std::time_t m_startingTimeStamp; std::time_t m_startingTimeStamp;
MsgReportFileSourceStreamData(int sampleRate, quint64 centerFrequency, std::time_t startingTimeStamp) :
MsgReportFileSource(bool acquisition, int sampleRate, quint64 centerFrequency, std::time_t startingTimeStamp) :
Message(), Message(),
m_acquisition(acquisition),
m_sampleRate(sampleRate), m_sampleRate(sampleRate),
m_centerFrequency(centerFrequency), m_centerFrequency(centerFrequency),
m_startingTimeStamp(startingTimeStamp) m_startingTimeStamp(startingTimeStamp)
@ -109,6 +145,7 @@ private:
std::ifstream m_ifstream; std::ifstream m_ifstream;
FileSourceThread* m_fileSourceThread; FileSourceThread* m_fileSourceThread;
QString m_deviceDescription; QString m_deviceDescription;
QString m_fileName;
int m_sampleRate; int m_sampleRate;
quint64 m_centerFrequency; quint64 m_centerFrequency;
std::time_t m_startingTimeStamp; std::time_t m_startingTimeStamp;

View File

@ -141,7 +141,7 @@ void FileSourceThread::tick()
m_sampleFifo->write(m_buf, m_ifstream->gcount()); m_sampleFifo->write(m_buf, m_ifstream->gcount());
// TODO: handle loop playback situation // TODO: handle loop playback situation
stopWork(); stopWork();
m_ifstream->close(); //m_ifstream->close();
} }
else else
{ {