1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-06-25 13:35:23 -04:00

LimeSDR: suspend/resume all buddies threads before/after open/close

This commit is contained in:
f4exb 2017-04-23 04:01:00 +02:00
parent 2369cb62af
commit 465b073d77
4 changed files with 88 additions and 70 deletions

View File

@ -44,13 +44,17 @@ LimeSDROutput::LimeSDROutput(DeviceSinkAPI *deviceAPI) :
m_firstConfig(true) m_firstConfig(true)
{ {
m_streamId.handle = 0; m_streamId.handle = 0;
suspendBuddies();
openDevice(); openDevice();
resumeBuddies();
} }
LimeSDROutput::~LimeSDROutput() LimeSDROutput::~LimeSDROutput()
{ {
if (m_running) stop(); if (m_running) stop();
suspendBuddies();
closeDevice(); closeDevice();
resumeBuddies();
} }
bool LimeSDROutput::openDevice() bool LimeSDROutput::openDevice()
@ -94,10 +98,6 @@ bool LimeSDROutput::openDevice()
DeviceSinkAPI *buddy = m_deviceAPI->getSinkBuddies()[i]; DeviceSinkAPI *buddy = m_deviceAPI->getSinkBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr(); DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
busyChannels[buddyShared->m_channel] = 1; busyChannels[buddyShared->m_channel] = 1;
if (buddyShared->m_thread) { // suspend Tx buddy's thread for proper stream allocation later
buddyShared->m_thread->stopWork();
}
} }
std::size_t ch = 0; std::size_t ch = 0;
@ -131,16 +131,6 @@ bool LimeSDROutput::openDevice()
qDebug("LimeSDROutput::openDevice: getting device parameters from Rx buddy"); qDebug("LimeSDROutput::openDevice: getting device parameters from Rx buddy");
} }
for (int i = 0; i < m_deviceAPI->getSourceBuddies().size(); i++)
{
DeviceSourceAPI *buddy = m_deviceAPI->getSourceBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
if (buddyShared->m_thread) { // suspend Rx buddy's thread for proper stream allocation later
buddyShared->m_thread->stopWork();
}
}
m_deviceShared.m_channel = 0; // take first channel m_deviceShared.m_channel = 0; // take first channel
} }
// There are no buddies then create the first LimeSDR common parameters // There are no buddies then create the first LimeSDR common parameters
@ -189,6 +179,38 @@ bool LimeSDROutput::openDevice()
qDebug("LimeSDROutput::start: stream set up on Tx channel %lu", m_deviceShared.m_channel); qDebug("LimeSDROutput::start: stream set up on Tx channel %lu", m_deviceShared.m_channel);
} }
return true;
}
void LimeSDROutput::suspendBuddies()
{
// suspend Tx buddy's threads
for (int i = 0; i < m_deviceAPI->getSinkBuddies().size(); i++)
{
DeviceSinkAPI *buddy = m_deviceAPI->getSinkBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
if (buddyShared->m_thread) {
buddyShared->m_thread->stopWork();
}
}
// suspend Rx buddy's threads
for (int i = 0; i < m_deviceAPI->getSourceBuddies().size(); i++)
{
DeviceSourceAPI *buddy = m_deviceAPI->getSourceBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
if (buddyShared->m_thread) {
buddyShared->m_thread->stopWork();
}
}
}
void LimeSDROutput::resumeBuddies()
{
// resume Tx buddy's threads // resume Tx buddy's threads
for (int i = 0; i < m_deviceAPI->getSinkBuddies().size(); i++) for (int i = 0; i < m_deviceAPI->getSinkBuddies().size(); i++)
@ -208,12 +230,10 @@ bool LimeSDROutput::openDevice()
DeviceSourceAPI *buddy = m_deviceAPI->getSourceBuddies()[i]; DeviceSourceAPI *buddy = m_deviceAPI->getSourceBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr(); DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
if (buddyShared->m_thread) { // suspend Rx buddy's thread for proper stream allocation later if (buddyShared->m_thread) {
buddyShared->m_thread->startWork(); buddyShared->m_thread->startWork();
} }
} }
return true;
} }
void LimeSDROutput::closeDevice() void LimeSDROutput::closeDevice()
@ -222,18 +242,6 @@ void LimeSDROutput::closeDevice()
return; return;
} }
// suspend Tx buddy's threads
for (int i = 0; i < m_deviceAPI->getSinkBuddies().size(); i++)
{
DeviceSinkAPI *buddy = m_deviceAPI->getSinkBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
if (buddyShared->m_thread) {
buddyShared->m_thread->stopWork();
}
}
// destroy the stream // destroy the stream
LMS_DestroyStream(m_deviceShared.m_deviceParams->getDevice(), &m_streamId); LMS_DestroyStream(m_deviceShared.m_deviceParams->getDevice(), &m_streamId);
m_streamId.handle = 0; m_streamId.handle = 0;
@ -247,18 +255,6 @@ void LimeSDROutput::closeDevice()
m_deviceShared.m_channel = -1; m_deviceShared.m_channel = -1;
// resume Tx buddy's threads
for (int i = 0; i < m_deviceAPI->getSinkBuddies().size(); i++)
{
const DeviceSinkAPI *buddy = m_deviceAPI->getSinkBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
if (buddyShared->m_thread) {
buddyShared->m_thread->startWork();
}
}
// No buddies so effectively close the device // No buddies so effectively close the device
if ((m_deviceAPI->getSourceBuddies().size() == 0) && (m_deviceAPI->getSinkBuddies().size() == 0)) if ((m_deviceAPI->getSourceBuddies().size() == 0) && (m_deviceAPI->getSinkBuddies().size() == 0))

View File

@ -225,6 +225,8 @@ private:
bool openDevice(); bool openDevice();
void closeDevice(); void closeDevice();
void suspendBuddies();
void resumeBuddies();
bool applySettings(const LimeSDROutputSettings& settings, bool force); bool applySettings(const LimeSDROutputSettings& settings, bool force);
}; };

View File

@ -45,13 +45,17 @@ LimeSDRInput::LimeSDRInput(DeviceSourceAPI *deviceAPI) :
m_firstConfig(true) m_firstConfig(true)
{ {
m_streamId.handle = 0; m_streamId.handle = 0;
suspendBuddies();
openDevice(); openDevice();
resumeBuddies();
} }
LimeSDRInput::~LimeSDRInput() LimeSDRInput::~LimeSDRInput()
{ {
if (m_running) stop(); if (m_running) stop();
suspendBuddies();
closeDevice(); closeDevice();
resumeBuddies();
} }
bool LimeSDRInput::openDevice() bool LimeSDRInput::openDevice()
@ -105,10 +109,6 @@ bool LimeSDRInput::openDevice()
DeviceSourceAPI *buddy = m_deviceAPI->getSourceBuddies()[i]; DeviceSourceAPI *buddy = m_deviceAPI->getSourceBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr(); DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
busyChannels[buddyShared->m_channel] = 1; busyChannels[buddyShared->m_channel] = 1;
if (buddyShared->m_thread) { // suspend Rx buddy's thread for proper stream allocation later
buddyShared->m_thread->stopWork();
}
} }
std::size_t ch = 0; std::size_t ch = 0;
@ -190,6 +190,38 @@ bool LimeSDRInput::openDevice()
qDebug("LimeSDRInput::start: stream set up on Rx channel %lu", m_deviceShared.m_channel); qDebug("LimeSDRInput::start: stream set up on Rx channel %lu", m_deviceShared.m_channel);
} }
return true;
}
void LimeSDRInput::suspendBuddies()
{
// suspend Rx buddy's threads
for (int i = 0; i < m_deviceAPI->getSourceBuddies().size(); i++)
{
DeviceSourceAPI *buddy = m_deviceAPI->getSourceBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
if (buddyShared->m_thread) {
buddyShared->m_thread->stopWork();
}
}
// suspend Tx buddy's threads
for (int i = 0; i < m_deviceAPI->getSinkBuddies().size(); i++)
{
DeviceSinkAPI *buddy = m_deviceAPI->getSinkBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
if (buddyShared->m_thread) {
buddyShared->m_thread->stopWork();
}
}
}
void LimeSDRInput::resumeBuddies()
{
// resume Rx buddy's threads // resume Rx buddy's threads
for (int i = 0; i < m_deviceAPI->getSourceBuddies().size(); i++) for (int i = 0; i < m_deviceAPI->getSourceBuddies().size(); i++)
@ -202,7 +234,17 @@ bool LimeSDRInput::openDevice()
} }
} }
return true; // resume Tx buddy's threads
for (int i = 0; i < m_deviceAPI->getSinkBuddies().size(); i++)
{
DeviceSinkAPI *buddy = m_deviceAPI->getSinkBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
if (buddyShared->m_thread) {
buddyShared->m_thread->startWork();
}
}
} }
void LimeSDRInput::closeDevice() void LimeSDRInput::closeDevice()
@ -211,18 +253,6 @@ void LimeSDRInput::closeDevice()
return; return;
} }
// suspend Rx buddy's threads
for (int i = 0; i < m_deviceAPI->getSourceBuddies().size(); i++)
{
DeviceSourceAPI *buddy = m_deviceAPI->getSourceBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
if (buddyShared->m_thread) {
buddyShared->m_thread->stopWork();
}
}
// destroy the stream // destroy the stream
LMS_DestroyStream(m_deviceShared.m_deviceParams->getDevice(), &m_streamId); LMS_DestroyStream(m_deviceShared.m_deviceParams->getDevice(), &m_streamId);
m_streamId.handle = 0; m_streamId.handle = 0;
@ -236,18 +266,6 @@ void LimeSDRInput::closeDevice()
m_deviceShared.m_channel = -1; m_deviceShared.m_channel = -1;
// resume Rx buddy's threads
for (int i = 0; i < m_deviceAPI->getSourceBuddies().size(); i++)
{
DeviceSourceAPI *buddy = m_deviceAPI->getSourceBuddies()[i];
DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr();
if (buddyShared->m_thread) {
buddyShared->m_thread->startWork();
}
}
// No buddies so effectively close the device // No buddies so effectively close the device
if ((m_deviceAPI->getSinkBuddies().size() == 0) && (m_deviceAPI->getSourceBuddies().size() == 0)) if ((m_deviceAPI->getSinkBuddies().size() == 0) && (m_deviceAPI->getSourceBuddies().size() == 0))

View File

@ -225,6 +225,8 @@ private:
bool openDevice(); bool openDevice();
void closeDevice(); void closeDevice();
void suspendBuddies();
void resumeBuddies();
bool applySettings(const LimeSDRInputSettings& settings, bool force); bool applySettings(const LimeSDRInputSettings& settings, bool force);
}; };