mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 13:00:26 -04:00 
			
		
		
		
	LimeSDR: suspend/resume all buddies threads before/after open/close
This commit is contained in:
		
							parent
							
								
									2369cb62af
								
							
						
					
					
						commit
						465b073d77
					
				| @ -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)) | ||||||
|  | |||||||
| @ -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); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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)) | ||||||
|  | |||||||
| @ -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); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user