1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-09-05 14:47:50 -04:00

Airspy: refactoring: device open close moved in the constructor and destructor respectively of the input object

This commit is contained in:
f4exb 2017-04-13 08:29:51 +02:00
parent 0c972455da
commit bb812b4b47
4 changed files with 144 additions and 118 deletions

View File

@ -38,6 +38,9 @@ AirspyGui::AirspyGui(DeviceSourceAPI *deviceAPI, QWidget* parent) :
m_sampleSource(0), m_sampleSource(0),
m_lastEngineState((DSPDeviceSourceEngine::State)-1) m_lastEngineState((DSPDeviceSourceEngine::State)-1)
{ {
m_sampleSource = new AirspyInput(m_deviceAPI);
m_deviceAPI->setSource(m_sampleSource);
ui->setupUi(this); ui->setupUi(this);
ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::ReverseGold)); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::ReverseGold));
ui->centerFrequency->setValueRange(7, 24000U, 1900000U); ui->centerFrequency->setValueRange(7, 24000U, 1900000U);
@ -48,11 +51,9 @@ AirspyGui::AirspyGui(DeviceSourceAPI *deviceAPI, QWidget* parent) :
displaySettings(); displaySettings();
m_sampleSource = new AirspyInput(m_deviceAPI);
m_rates = ((AirspyInput*) m_sampleSource)->getSampleRates(); m_rates = ((AirspyInput*) m_sampleSource)->getSampleRates();
displaySampleRates(); displaySampleRates();
connect(m_sampleSource->getOutputMessageQueueToGUI(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages())); connect(m_sampleSource->getOutputMessageQueueToGUI(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
m_deviceAPI->setSource(m_sampleSource);
char recFileNameCStr[30]; char recFileNameCStr[30];
sprintf(recFileNameCStr, "test_%d.sdriq", m_deviceAPI->getDeviceUID()); sprintf(recFileNameCStr, "test_%d.sdriq", m_deviceAPI->getDeviceUID());
@ -122,18 +123,19 @@ bool AirspyGui::deserialize(const QByteArray& data)
} }
bool AirspyGui::handleMessage(const Message& message) bool AirspyGui::handleMessage(const Message& message)
{
if (AirspyInput::MsgReportAirspy::match(message))
{
qDebug() << "AirspyGui::handleMessage: MsgReportAirspy";
m_rates = ((AirspyInput::MsgReportAirspy&) message).getSampleRates();
displaySampleRates();
return true;
}
else
{ {
return false; return false;
} // if (AirspyInput::MsgReportAirspy::match(message))
// {
// qDebug() << "AirspyGui::handleMessage: MsgReportAirspy";
// m_rates = ((AirspyInput::MsgReportAirspy&) message).getSampleRates();
// displaySampleRates();
// return true;
// }
// else
// {
// return false;
// }
} }
void AirspyGui::handleDSPMessages() void AirspyGui::handleDSPMessages()

View File

@ -28,27 +28,32 @@
#include "airspythread.h" #include "airspythread.h"
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgConfigureAirspy, Message) MESSAGE_CLASS_DEFINITION(AirspyInput::MsgConfigureAirspy, Message)
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgReportAirspy, Message) //MESSAGE_CLASS_DEFINITION(AirspyInput::MsgReportAirspy, Message)
AirspyInput::AirspyInput(DeviceSourceAPI *deviceAPI) : AirspyInput::AirspyInput(DeviceSourceAPI *deviceAPI) :
m_deviceAPI(deviceAPI), m_deviceAPI(deviceAPI),
m_settings(), m_settings(),
m_dev(0), m_dev(0),
m_airspyThread(0), m_airspyThread(0),
m_deviceDescription("Airspy") m_deviceDescription("Airspy"),
m_running(false)
{ {
m_sampleRates.push_back(10000000); openDevice();
m_sampleRates.push_back(2500000);
} }
AirspyInput::~AirspyInput() AirspyInput::~AirspyInput()
{ {
stop(); if (m_running) stop();
closeDevice();
} }
bool AirspyInput::start(int device) bool AirspyInput::openDevice()
{ {
QMutexLocker mutexLocker(&m_mutex); if (m_dev != 0)
{
closeDevice();
}
airspy_error rc; airspy_error rc;
rc = (airspy_error) airspy_init(); rc = (airspy_error) airspy_init();
@ -58,17 +63,14 @@ bool AirspyInput::start(int device)
qCritical("AirspyInput::start: failed to initiate Airspy library %s", airspy_error_name(rc)); qCritical("AirspyInput::start: failed to initiate Airspy library %s", airspy_error_name(rc));
} }
if (m_dev != 0)
{
stop();
}
if (!m_sampleFifo.setSize(1<<19)) if (!m_sampleFifo.setSize(1<<19))
{ {
qCritical("AirspyInput::start: could not allocate SampleFifo"); qCritical("AirspyInput::start: could not allocate SampleFifo");
return false; return false;
} }
int device = m_deviceAPI->getSampleSourceSequence();
if ((m_dev = open_airspy_from_sequence(device)) == 0) if ((m_dev = open_airspy_from_sequence(device)) == 0)
{ {
qCritical("AirspyInput::start: could not open Airspy #%d", device); qCritical("AirspyInput::start: could not open Airspy #%d", device);
@ -111,8 +113,8 @@ bool AirspyInput::start(int device)
m_sampleRates.push_back(2500000); m_sampleRates.push_back(2500000);
#endif #endif
MsgReportAirspy *message = MsgReportAirspy::create(m_sampleRates); // MsgReportAirspy *message = MsgReportAirspy::create(m_sampleRates);
getOutputMessageQueueToGUI()->push(message); // getOutputMessageQueueToGUI()->push(message);
rc = (airspy_error) airspy_set_sample_type(m_dev, AIRSPY_SAMPLE_INT16_IQ); rc = (airspy_error) airspy_set_sample_type(m_dev, AIRSPY_SAMPLE_INT16_IQ);
@ -122,6 +124,19 @@ bool AirspyInput::start(int device)
return false; return false;
} }
return true;
}
bool AirspyInput::start(int device)
{
QMutexLocker mutexLocker(&m_mutex);
if (!m_dev) {
return false;
}
if (m_running) stop();
if((m_airspyThread = new AirspyThread(m_dev, &m_sampleFifo)) == 0) if((m_airspyThread = new AirspyThread(m_dev, &m_sampleFifo)) == 0)
{ {
qFatal("AirspyInput::start: out of memory"); qFatal("AirspyInput::start: out of memory");
@ -136,10 +151,24 @@ bool AirspyInput::start(int device)
applySettings(m_settings, true); applySettings(m_settings, true);
qDebug("AirspyInput::startInput: started"); qDebug("AirspyInput::startInput: started");
m_running = true;
return true; return true;
} }
void AirspyInput::closeDevice()
{
if (m_dev != 0)
{
airspy_stop_rx(m_dev);
airspy_close(m_dev);
m_dev = 0;
}
m_deviceDescription.clear();
airspy_exit();
}
void AirspyInput::stop() void AirspyInput::stop()
{ {
qDebug("AirspyInput::stop"); qDebug("AirspyInput::stop");
@ -152,14 +181,7 @@ void AirspyInput::stop()
m_airspyThread = 0; m_airspyThread = 0;
} }
if(m_dev != 0) m_running = false;
{
airspy_stop_rx(m_dev);
airspy_close(m_dev);
m_dev = 0;
}
airspy_exit();
} }
const QString& AirspyInput::getDeviceDescription() const const QString& AirspyInput::getDeviceDescription() const

View File

@ -48,25 +48,25 @@ public:
{ } { }
}; };
class MsgReportAirspy : public Message { // class MsgReportAirspy : public Message {
MESSAGE_CLASS_DECLARATION // MESSAGE_CLASS_DECLARATION
//
public: // public:
const std::vector<uint32_t>& getSampleRates() const { return m_sampleRates; } // const std::vector<uint32_t>& getSampleRates() const { return m_sampleRates; }
//
static MsgReportAirspy* create(const std::vector<uint32_t>& sampleRates) // static MsgReportAirspy* create(const std::vector<uint32_t>& sampleRates)
{ // {
return new MsgReportAirspy(sampleRates); // return new MsgReportAirspy(sampleRates);
} // }
//
protected: // protected:
std::vector<uint32_t> m_sampleRates; // std::vector<uint32_t> m_sampleRates;
//
MsgReportAirspy(const std::vector<uint32_t>& sampleRates) : // MsgReportAirspy(const std::vector<uint32_t>& sampleRates) :
Message(), // Message(),
m_sampleRates(sampleRates) // m_sampleRates(sampleRates)
{ } // { }
}; // };
AirspyInput(DeviceSourceAPI *deviceAPI); AirspyInput(DeviceSourceAPI *deviceAPI);
virtual ~AirspyInput(); virtual ~AirspyInput();
@ -82,6 +82,8 @@ public:
virtual bool handleMessage(const Message& message); virtual bool handleMessage(const Message& message);
private: private:
bool openDevice();
void closeDevice();
bool applySettings(const AirspySettings& settings, bool force); bool applySettings(const AirspySettings& settings, bool force);
struct airspy_device *open_airspy_from_sequence(int sequence); struct airspy_device *open_airspy_from_sequence(int sequence);
void setCenterFrequency(quint64 freq); void setCenterFrequency(quint64 freq);
@ -93,6 +95,7 @@ private:
AirspyThread* m_airspyThread; AirspyThread* m_airspyThread;
QString m_deviceDescription; QString m_deviceDescription;
std::vector<uint32_t> m_sampleRates; std::vector<uint32_t> m_sampleRates;
bool m_running;
}; };
#endif // INCLUDE_AIRSPYINPUT_H #endif // INCLUDE_AIRSPYINPUT_H

View File

@ -44,7 +44,6 @@ RTLSDRInput::RTLSDRInput(DeviceSourceAPI *deviceAPI) :
RTLSDRInput::~RTLSDRInput() RTLSDRInput::~RTLSDRInput()
{ {
//stop();
if (m_running) stop(); if (m_running) stop();
closeDevice(); closeDevice();
} }