mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-14 12:22:00 -05:00
File source: effective file selection. Better definition of open, start and stop actions
This commit is contained in:
parent
5b0cc63c72
commit
196cf51089
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -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);
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user