2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								///////////////////////////////////////////////////////////////////////////////////
  
						 
					
						
							
								
									
										
										
										
											2023-11-18 09:58:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// written by Christian Daniel                                                   //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Copyright (C) 2015-2019, 2021-2022 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Copyright (C) 2023 Daniele Forsi <iu5hkx@gmail.com>                           //
  
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								//                                                                               //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// This program is free software; you can redistribute it and/or modify          //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// it under the terms of the GNU General Public License as published by          //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// the Free Software Foundation as version 3 of the License, or                  //
  
						 
					
						
							
								
									
										
										
										
											2019-04-11 06:39:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// (at your option) any later version.                                           //
  
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								//                                                                               //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// This program is distributed in the hope that it will be useful,               //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// but WITHOUT ANY WARRANTY; without even the implied warranty of                //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// GNU General Public License V3 for more details.                               //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//                                                                               //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// You should have received a copy of the GNU General Public License             //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// along with this program. If not, see <http://www.gnu.org/licenses/>.          //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								///////////////////////////////////////////////////////////////////////////////////
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <QDebug> 
  
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <QNetworkReply> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <QBuffer> 
  
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "SWGDeviceSettings.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "SWGSoapySDROutputSettings.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "SWGDeviceState.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "SWGDeviceReport.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "SWGSoapySDRReport.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  "util/simpleserializer.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "dsp/dspcommands.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "device/deviceapi.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "soapysdr/devicesoapysdr.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "soapysdroutputthread.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  "soapysdroutput.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MESSAGE_CLASS_DEFINITION ( SoapySDROutput : : MsgConfigureSoapySDROutput ,  Message )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE_CLASS_DEFINITION ( SoapySDROutput : : MsgStartStop ,  Message )  
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MESSAGE_CLASS_DEFINITION ( SoapySDROutput : : MsgReportGainChange ,  Message )  
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SoapySDROutput : : SoapySDROutput ( DeviceAPI  * deviceAPI )  :  
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_deviceAPI ( deviceAPI ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_deviceDescription ( " SoapySDROutput " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_running ( false ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_thread ( nullptr ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2019-05-21 00:27:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_deviceAPI - > setNbSinkStreams ( 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_openSuccess  =  openDevice ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    initGainSettings ( m_settings ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 22:25:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    initTunableElementsSettings ( m_settings ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-11 19:44:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    initStreamArgSettings ( m_settings ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    initDeviceArgSettings ( m_settings ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_networkManager  =  new  QNetworkAccessManager ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-23 22:32:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QObject : : connect ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_networkManager , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        & QNetworkAccessManager : : finished , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        this , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        & SoapySDROutput : : networkManagerFinished 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								SoapySDROutput : : ~ SoapySDROutput ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-03-23 22:32:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QObject : : disconnect ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_networkManager , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        & QNetworkAccessManager : : finished , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        this , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        & SoapySDROutput : : networkManagerFinished 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    delete  m_networkManager ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( m_running )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        stop ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    closeDevice ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : destroy ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    delete  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  SoapySDROutput : : openDevice ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_sampleSourceFifo . resize ( SampleSourceFifo : : getSizePolicy ( m_settings . m_devSampleRate ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // look for Tx buddies and get reference to the device object
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( m_deviceAPI - > getSinkBuddies ( ) . size ( )  >  0 )  // look sink sibling first
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::openDevice: look in Tx buddies " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        DeviceAPI  * sinkBuddy  =  m_deviceAPI - > getSinkBuddies ( ) [ 0 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        DeviceSoapySDRShared  * deviceSoapySDRShared  =  ( DeviceSoapySDRShared * )  sinkBuddy - > getBuddySharedPtr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! deviceSoapySDRShared ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qCritical ( " SoapySDROutput::openDevice: the sink buddy shared pointer is null " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SoapySDR : : Device  * device  =  deviceSoapySDRShared - > m_device ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! device ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qCritical ( " SoapySDROutput::openDevice: cannot get device pointer from Tx buddy " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_deviceShared . m_device  =  device ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        m_deviceShared . m_deviceParams  =  deviceSoapySDRShared - > m_deviceParams ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // look for Rx buddies and get reference to the device object
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else  if  ( m_deviceAPI - > getSourceBuddies ( ) . size ( )  >  0 )  // then source
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::openDevice: look in Rx buddies " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        DeviceAPI  * sourceBuddy  =  m_deviceAPI - > getSourceBuddies ( ) [ 0 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        DeviceSoapySDRShared  * deviceSoapySDRShared  =  ( DeviceSoapySDRShared * )  sourceBuddy - > getBuddySharedPtr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! deviceSoapySDRShared ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qCritical ( " SoapySDROutput::openDevice: the source buddy shared pointer is null " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SoapySDR : : Device  * device  =  deviceSoapySDRShared - > m_device ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! device ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qCritical ( " SoapySDROutput::openDevice: cannot get device pointer from Rx buddy " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_deviceShared . m_device  =  device ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        m_deviceShared . m_deviceParams  =  deviceSoapySDRShared - > m_deviceParams ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // There are no buddies then create the first BladeRF2 device
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::openDevice: open device here " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        DeviceSoapySDR &  deviceSoapySDR  =  DeviceSoapySDR : : instance ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-14 01:14:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        m_deviceShared . m_device  =  deviceSoapySDR . openSoapySDR ( m_deviceAPI - > getSamplingDeviceSequence ( ) ,  m_deviceAPI - > getHardwareUserArguments ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! m_deviceShared . m_device ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qCritical ( " SoapySDROutput::openDevice: cannot open SoapySDR device " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_deviceShared . m_deviceParams  =  new  DeviceSoapySDRParams ( m_deviceShared . m_device ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-21 00:27:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_deviceShared . m_channel  =  m_deviceAPI - > getDeviceItemIndex ( ) ;  // publicly allocate channel
 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_deviceShared . m_sink  =  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_deviceAPI - > setBuddySharedPtr ( & m_deviceShared ) ;  // propagate common parameters to API
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : closeDevice ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! m_deviceShared . m_device )  {  // was never open
 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( m_running )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        stop ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( m_thread )  {  // stills own the thread => transfer to a buddy
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        moveThreadToBuddy ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_deviceShared . m_channel  =  - 1 ;  // publicly release channel
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_deviceShared . m_sink  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // No buddies so effectively close the device
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( m_deviceAPI - > getSinkBuddies ( ) . size ( )  = =  0 )  & &  ( m_deviceAPI - > getSourceBuddies ( ) . size ( )  = =  0 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        DeviceSoapySDR &  deviceSoapySDR  =  DeviceSoapySDR : : instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        deviceSoapySDR . closeSoapySdr ( m_deviceShared . m_device ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        m_deviceShared . m_device  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-30 10:02:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoapySDROutput : : getFrequencyRange ( uint64_t &  min ,  uint64_t &  max )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( channelSettings  & &  ( channelSettings - > m_frequencySettings . size ( )  >  0 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        DeviceSoapySDRParams : : FrequencySetting  freqSettings  =  channelSettings - > m_frequencySettings [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SoapySDR : : RangeList  rangeList  =  freqSettings . m_ranges ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:08:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( rangeList . size ( )  >  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            SoapySDR : : Range  range  =  rangeList [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            min  =  range . minimum ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            max  =  range . maximum ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            min  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            max  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        min  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        max  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:08:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoapySDROutput : : getGlobalGainRange ( int &  min ,  int &  max )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( channelSettings ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        min  =  channelSettings - > m_gainRange . minimum ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        max  =  channelSettings - > m_gainRange . maximum ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        min  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        max  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-08 01:52:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  SoapySDROutput : : isAGCSupported ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  channelSettings - > m_hasAGC ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:08:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  SoapySDR : : RangeList &  SoapySDROutput : : getRateRanges ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  channelSettings - > m_ratesRanges ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 23:54:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  std : : vector < std : : string > &  SoapySDROutput : : getAntennas ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  channelSettings - > m_antennas ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-05 02:40:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  SoapySDR : : RangeList &  SoapySDROutput : : getBandwidthRanges ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  channelSettings - > m_bandwidthsRanges ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-05 17:27:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  std : : vector < DeviceSoapySDRParams : : FrequencySetting > &  SoapySDROutput : : getTunableElements ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  channelSettings - > m_frequencySettings ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:08:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  std : : vector < DeviceSoapySDRParams : : GainSetting > &  SoapySDROutput : : getIndividualGainsRanges ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  channelSettings - > m_gainSettings ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  SoapySDR : : ArgInfoList &  SoapySDROutput : : getDeviceArgInfoList ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return   m_deviceShared . m_deviceParams - > getDeviceArgs ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoapySDROutput : : initGainSettings ( SoapySDROutputSettings &  settings )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    settings . m_individualGains . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    settings . m_globalGain  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( const  auto  & it  :  channelSettings - > m_gainSettings )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_individualGains [ QString ( it . m_name . c_str ( ) ) ]  =  0.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    updateGains ( m_deviceShared . m_device ,  m_deviceShared . m_channel ,  settings ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 22:25:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoapySDROutput : : initTunableElementsSettings ( SoapySDROutputSettings &  settings )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    settings . m_tunableElements . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  first  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( const  auto  & it  :  channelSettings - > m_frequencySettings ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( first ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            first  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_tunableElements [ QString ( it . m_name . c_str ( ) ) ]  =  0.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    updateTunableElements ( m_deviceShared . m_device ,  m_deviceShared . m_channel ,  settings ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-11 09:31:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  SoapySDR : : ArgInfoList &  SoapySDROutput : : getStreamArgInfoList ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  channelSettings - > m_streamSettingsArgs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : initStreamArgSettings ( SoapySDROutputSettings &  settings )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    settings . m_streamArgSettings . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( const  auto  & it  :  channelSettings - > m_streamSettingsArgs ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( it . type  = =  SoapySDR : : ArgInfo : : BOOL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            settings . m_streamArgSettings [ QString ( it . key . c_str ( ) ) ]  =  QVariant ( it . value  = =  " true " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  if  ( it . type  = =  SoapySDR : : ArgInfo : : INT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            settings . m_streamArgSettings [ QString ( it . key . c_str ( ) ) ]  =  QVariant ( atoi ( it . value . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  if  ( it . type  = =  SoapySDR : : ArgInfo : : FLOAT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            settings . m_streamArgSettings [ QString ( it . key . c_str ( ) ) ]  =  QVariant ( atof ( it . value . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  if  ( it . type  = =  SoapySDR : : ArgInfo : : STRING )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            settings . m_streamArgSettings [ QString ( it . key . c_str ( ) ) ]  =  QVariant ( it . value . c_str ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoapySDROutput : : initDeviceArgSettings ( SoapySDROutputSettings &  settings )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    settings . m_deviceArgSettings . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( const  auto  & it  :  m_deviceShared . m_deviceParams - > getDeviceArgs ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( it . type  = =  SoapySDR : : ArgInfo : : BOOL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            settings . m_deviceArgSettings [ QString ( it . key . c_str ( ) ) ]  =  QVariant ( it . value  = =  " true " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  if  ( it . type  = =  SoapySDR : : ArgInfo : : INT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            settings . m_deviceArgSettings [ QString ( it . key . c_str ( ) ) ]  =  QVariant ( atoi ( it . value . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  if  ( it . type  = =  SoapySDR : : ArgInfo : : FLOAT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            settings . m_deviceArgSettings [ QString ( it . key . c_str ( ) ) ]  =  QVariant ( atof ( it . value . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  if  ( it . type  = =  SoapySDR : : ArgInfo : : STRING )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            settings . m_deviceArgSettings [ QString ( it . key . c_str ( ) ) ]  =  QVariant ( it . value . c_str ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-08 21:42:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  SoapySDROutput : : hasDCAutoCorrection ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  channelSettings - > m_hasDCAutoCorrection ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  SoapySDROutput : : hasDCCorrectionValue ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  channelSettings - > m_hasDCOffsetValue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  SoapySDROutput : : hasIQCorrectionValue ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  channelSettings - > m_hasIQBalanceValue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : init ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    applySettings ( m_settings ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								SoapySDROutputThread  * SoapySDROutput : : findThread ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! m_thread )  // this does not own the thread
 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        SoapySDROutputThread  * soapySDROutputThread  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // find a buddy that has allocated the thread
 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        const  std : : vector < DeviceAPI * > &  sinkBuddies  =  m_deviceAPI - > getSinkBuddies ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        std : : vector < DeviceAPI * > : : const_iterator  it  =  sinkBuddies . begin ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( ;  it  ! =  sinkBuddies . end ( ) ;  + + it ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            SoapySDROutput  * buddySink  =  ( ( DeviceSoapySDRShared * )  ( * it ) - > getBuddySharedPtr ( ) ) - > m_sink ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( buddySink ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                soapySDROutputThread  =  buddySink - > getThread ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( soapySDROutputThread )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  soapySDROutputThread ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  m_thread ;  // own thread
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : moveThreadToBuddy ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    const  std : : vector < DeviceAPI * > &  sinkBuddies  =  m_deviceAPI - > getSinkBuddies ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    std : : vector < DeviceAPI * > : : const_iterator  it  =  sinkBuddies . begin ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( ;  it  ! =  sinkBuddies . end ( ) ;  + + it ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SoapySDROutput  * buddySink  =  ( ( DeviceSoapySDRShared * )  ( * it ) - > getBuddySharedPtr ( ) ) - > m_sink ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( buddySink ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            buddySink - > setThread ( m_thread ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            m_thread  =  nullptr ;   // zero for others
 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  SoapySDROutput : : start ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // There is a single thread per physical device (Tx side). This thread is unique and referenced by a unique
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // buddy in the group of sink buddies associated with this physical device.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // This start method is responsible for managing the thread and channel enabling when the streaming of a Tx channel is started
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // It checks the following conditions
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //   - the thread is allocated or not (by itself or one of its buddies). If it is it grabs the thread pointer.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //   - the requested channel is the first (0) or the following
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // There are two possible working modes:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //   - Single Output (SO) with only one channel streaming. This HAS to be channel 0.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //   - Multiple Output (MO) with two or more channels. It MUST be in this configuration if any channel other than 0
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //     is used. For example when we will run with only channel 2 streaming from the client perspective the channels 0 and 1
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //     will actually be enabled and streaming but zero samples will be sent to it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // It manages the transition form SO where only one channel (the first or channel 0) should be running to the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // Multiple Output (MO) if the requested channel is 1 or more. More generally it checks if the requested channel is within the current
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // channel range allocated in the thread or past it. To perform the transition it stops the thread, deletes it and creates a new one.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // It marks the thread as needing start.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // If the requested channel is within the thread channel range (this thread being already allocated) it simply removes its FIFO reference
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // so that the samples are not taken from the FIFO anymore and leaves the thread unchanged (no stop, no delete/new)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // If there is no thread allocated it creates a new one with a number of channels that fits the requested channel. That is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // 1 if channel 0 is requested (SO mode) and 3 if channel 2 is requested (MO mode). It marks the thread as needing start.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // Eventually it registers the FIFO in the thread. If the thread has to be started it enables the channels up to the number of channels
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // allocated in the thread and starts the thread.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // Note: this is quite similar to the BladeRF2 start handling. The main difference is that the channel allocation (enabling) process is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // done in the thread object.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-21 05:27:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QMutexLocker  mutexLocker ( & m_mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( m_running )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! m_openSuccess ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qWarning ( " SoapySDROutput::start: cannot start device " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! m_deviceShared . m_device ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::start: no device object " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-21 00:27:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  requestedChannel  =  m_deviceAPI - > getDeviceItemIndex ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SoapySDROutputThread  * soapySDROutputThread  =  findThread ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  needsStart  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( soapySDROutputThread )  // if thread is already allocated
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::start: thread is already allocated " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  nbOriginalChannels  =  soapySDROutputThread - > getNbChannels ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( requestedChannel + 1  >  nbOriginalChannels )  // expansion by deleting and re-creating the thread
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qDebug ( " SoapySDROutput::start: expand channels. Re-allocate thread and take ownership " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            SampleSourceFifo  * * fifos  =  new  SampleSourceFifo * [ nbOriginalChannels ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            unsigned  int  * log2Interps  =  new  unsigned  int [ nbOriginalChannels ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( int  i  =  0 ;  i  <  nbOriginalChannels ;  i + + )  // save original FIFO references and data
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                fifos [ i ]  =  soapySDROutputThread - > getFifo ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                log2Interps [ i ]  =  soapySDROutputThread - > getLog2Interpolation ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            soapySDROutputThread - > stopWork ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            delete  soapySDROutputThread ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            soapySDROutputThread  =  new  SoapySDROutputThread ( m_deviceShared . m_device ,  requestedChannel + 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m_thread  =  soapySDROutputThread ;  // take ownership
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( int  i  =  0 ;  i  <  nbOriginalChannels ;  i + + )  // restore original FIFO references
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                soapySDROutputThread - > setFifo ( i ,  fifos [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                soapySDROutputThread - > setLog2Interpolation ( i ,  log2Interps [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // remove old thread address from buddies (reset in all buddies).  The address being held only in the owning sink.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            const  std : : vector < DeviceAPI * > &  sinkBuddies  =  m_deviceAPI - > getSinkBuddies ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            std : : vector < DeviceAPI * > : : const_iterator  it  =  sinkBuddies . begin ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( ;  it  ! =  sinkBuddies . end ( ) ;  + + it )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ( ( DeviceSoapySDRShared * )  ( * it ) - > getBuddySharedPtr ( ) ) - > m_sink - > setThread ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-12-04 01:03:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            delete [ ]  log2Interps ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            delete [ ]  fifos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            needsStart  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qDebug ( " SoapySDROutput::start: keep buddy thread " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else  // first allocation
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::start: allocate thread and take ownership " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        soapySDROutputThread  =  new  SoapySDROutputThread ( m_deviceShared . m_device ,  requestedChannel + 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_thread  =  soapySDROutputThread ;  // take ownership
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        needsStart  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    soapySDROutputThread - > setFifo ( requestedChannel ,  & m_sampleSourceFifo ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    soapySDROutputThread - > setLog2Interpolation ( requestedChannel ,  m_settings . m_log2Interp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( needsStart ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-23 16:44:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::start: (re)start buddy thread " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        soapySDROutputThread - > setSampleRate ( m_settings . m_devSampleRate ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        soapySDROutputThread - > startWork ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    qDebug ( " SoapySDROutput::start: started " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_running  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : stop ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // This stop method is responsible for managing the thread and channel disabling when the streaming of
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // a Tx channel is stopped
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // If the thread is currently managing only one channel (SO mode). The thread can be just stopped and deleted.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // Then the channel is closed (disabled).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // If the thread is currently managing many channels (MO mode) and we are removing the last channel. The transition
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // from MO to SO or reduction of MO size is handled by stopping the thread, deleting it and creating a new one
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // with the maximum number of channels needed if (and only if) there is still a channel active.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // If the thread is currently managing many channels (MO mode) but the channel being stopped is not the last
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // channel then the FIFO reference is simply removed from the thread so that this FIFO will not be used anymore.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // In this case the channel is not closed (this is managed in the thread object) so that other channels can continue with the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // same configuration. The device continues streaming on this channel but the samples are set to all zeros.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-21 05:27:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QMutexLocker  mutexLocker ( & m_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! m_running )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-21 05:27:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_running  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-21 00:27:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  requestedChannel  =  m_deviceAPI - > getDeviceItemIndex ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SoapySDROutputThread  * soapySDROutputThread  =  findThread ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! soapySDROutputThread )  {  // no thread allocated
 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  nbOriginalChannels  =  soapySDROutputThread - > getNbChannels ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( nbOriginalChannels  = =  1 )  // SO mode => just stop and delete the thread
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::stop: SO mode. Just stop and delete the thread " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        soapySDROutputThread - > stopWork ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        delete  soapySDROutputThread ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        m_thread  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // remove old thread address from buddies (reset in all buddies)
 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        const  std : : vector < DeviceAPI * > &  sinkBuddies  =  m_deviceAPI - > getSinkBuddies ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        std : : vector < DeviceAPI * > : : const_iterator  it  =  sinkBuddies . begin ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( ;  it  ! =  sinkBuddies . end ( ) ;  + + it )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( ( DeviceSoapySDRShared * )  ( * it ) - > getBuddySharedPtr ( ) ) - > m_sink - > setThread ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else  if  ( requestedChannel  = =  nbOriginalChannels  -  1 )  // remove last MO channel => reduce by deleting and re-creating the thread
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::stop: MO mode. Reduce by deleting and re-creating the thread " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        soapySDROutputThread - > stopWork ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        SampleSourceFifo  * * fifos  =  new  SampleSourceFifo * [ nbOriginalChannels - 1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        unsigned  int  * log2Interps  =  new  unsigned  int [ nbOriginalChannels - 1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  highestActiveChannelIndex  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( int  i  =  0 ;  i  <  nbOriginalChannels - 1 ;  i + + )  // save original FIFO references
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            fifos [ i ]  =  soapySDROutputThread - > getFifo ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( ( soapySDROutputThread - > getFifo ( i ) )  & &  ( i  >  highestActiveChannelIndex ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                highestActiveChannelIndex  =  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            log2Interps [ i ]  =  soapySDROutputThread - > getLog2Interpolation ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        delete  soapySDROutputThread ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        m_thread  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( highestActiveChannelIndex  > =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            soapySDROutputThread  =  new  SoapySDROutputThread ( m_deviceShared . m_device ,  highestActiveChannelIndex + 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m_thread  =  soapySDROutputThread ;  // take ownership
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( int  i  =  0 ;  i  <  nbOriginalChannels - 1 ;  i + + )   // restore original FIFO references
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                soapySDROutputThread - > setFifo ( i ,  fifos [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                soapySDROutputThread - > setLog2Interpolation ( i ,  log2Interps [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qDebug ( " SoapySDROutput::stop: do not re-create thread as there are no more FIFOs active " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // remove old thread address from buddies (reset in all buddies). The address being held only in the owning sink.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        const  std : : vector < DeviceAPI * > &  sinkBuddies  =  m_deviceAPI - > getSinkBuddies ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        std : : vector < DeviceAPI * > : : const_iterator  it  =  sinkBuddies . begin ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( ;  it  ! =  sinkBuddies . end ( ) ;  + + it )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( ( DeviceSoapySDRShared * )  ( * it ) - > getBuddySharedPtr ( ) ) - > m_sink - > setThread ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( highestActiveChannelIndex  > =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qDebug ( " SoapySDROutput::stop: restarting the thread " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            soapySDROutputThread - > startWork ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-04 01:03:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        delete [ ]  log2Interps ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        delete [ ]  fifos ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else  // remove channel from existing thread
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::stop: MO mode. Not changing MO configuration. Just remove FIFO reference " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        soapySDROutputThread - > setFifo ( requestedChannel ,  nullptr ) ;  // remove FIFO
 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-21 05:27:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    mutexLocker . unlock ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    applySettings ( m_settings ,  true ) ;  // re-apply forcibly to set sample rate with the new number of channels
 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								QByteArray  SoapySDROutput : : serialize ( )  const  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  m_settings . serialize ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-13 08:51:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  SoapySDROutput : : deserialize ( const  QByteArray &  data )  
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    bool  success  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! m_settings . deserialize ( data ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_settings . resetToDefaults ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        success  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    MsgConfigureSoapySDROutput *  message  =  MsgConfigureSoapySDROutput : : create ( m_settings ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_inputMessageQueue . push ( message ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( m_guiMessageQueue ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        MsgConfigureSoapySDROutput *  messageToGUI  =  MsgConfigureSoapySDROutput : : create ( m_settings ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_guiMessageQueue - > push ( messageToGUI ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  success ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  QString &  SoapySDROutput : : getDeviceDescription ( )  const  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  m_deviceDescription ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  SoapySDROutput : : getSampleRate ( )  const  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  rate  =  m_settings . m_devSampleRate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  ( rate  /  ( 1 < < m_settings . m_log2Interp ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								quint64  SoapySDROutput : : getCenterFrequency ( )  const  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  m_settings . m_centerFrequency ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoapySDROutput : : setCenterFrequency ( qint64  centerFrequency )  
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2018-11-04 11:45:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SoapySDROutputSettings  settings  =  m_settings ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    settings . m_centerFrequency  =  centerFrequency ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    MsgConfigureSoapySDROutput *  message  =  MsgConfigureSoapySDROutput : : create ( settings ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_inputMessageQueue . push ( message ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( m_guiMessageQueue ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        MsgConfigureSoapySDROutput *  messageToGUI  =  MsgConfigureSoapySDROutput : : create ( settings ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_guiMessageQueue - > push ( messageToGUI ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  SoapySDROutput : : setDeviceCenterFrequency ( SoapySDR : : Device  * dev ,  int  requestedChannel ,  quint64  freq_hz ,  int  loPpmTenths )  
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    qint64  df  =  ( ( qint64 ) freq_hz  *  loPpmTenths )  /  10000000LL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    freq_hz  + =  df ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        dev - > setFrequency ( SOAPY_SDR_TX , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                requestedChannel , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                m_deviceShared . m_deviceParams - > getTxChannelMainTunableElementName ( requestedChannel ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                freq_hz ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::setDeviceCenterFrequency: setFrequency(%llu) " ,  freq_hz ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qCritical ( " SoapySDROutput::applySettings: could not set frequency: %llu: %s " ,  freq_hz ,  ex . what ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoapySDROutput : : updateGains ( SoapySDR : : Device  * dev ,  int  requestedChannel ,  SoapySDROutputSettings &  settings )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! dev )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-01-13 23:33:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_globalGain  =  round ( dev - > getGain ( SOAPY_SDR_TX ,  requestedChannel ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-01-13 23:33:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( const  auto  & name  :  settings . m_individualGains . keys ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            settings . m_individualGains [ name ]  =  dev - > getGain ( SOAPY_SDR_TX ,  requestedChannel ,  name . toStdString ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qCritical ( " SoapySDROutput::updateGains: caught exception: %s " ,  ex . what ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 22:25:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoapySDROutput : : updateTunableElements ( SoapySDR : : Device  * dev ,  int  requestedChannel ,  SoapySDROutputSettings &  settings )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! dev )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 22:25:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-01-13 23:33:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  auto  & name  :  settings . m_tunableElements . keys ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            settings . m_tunableElements [ name ]  =  dev - > getFrequency ( SOAPY_SDR_TX ,  requestedChannel ,  name . toStdString ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qCritical ( " SoapySDROutput::updateTunableElements: caught exception: %s " ,  ex . what ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 22:25:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  SoapySDROutput : : handleMessage ( const  Message &  message )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( MsgConfigureSoapySDROutput : : match ( message ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        MsgConfigureSoapySDROutput &  conf  =  ( MsgConfigureSoapySDROutput & )  message ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( )  < <  " SoapySDROutput::handleMessage: MsgConfigureSoapySDROutput " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! applySettings ( conf . getSettings ( ) ,  conf . getForce ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qDebug ( " SoapySDROutput::handleMessage: MsgConfigureSoapySDROutput config error " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else  if  ( MsgStartStop : : match ( message ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        MsgStartStop &  cmd  =  ( MsgStartStop & )  message ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( )  < <  " SoapySDROutput::handleMessage: MsgStartStop:  "  < <  ( cmd . getStartStop ( )  ?  " start "  :  " stop " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( cmd . getStartStop ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( m_deviceAPI - > initDeviceEngine ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                m_deviceAPI - > startDeviceEngine ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            m_deviceAPI - > stopDeviceEngine ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( m_settings . m_useReverseAPI )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            webapiReverseSendStartStop ( cmd . getStartStop ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else  if  ( DeviceSoapySDRShared : : MsgReportBuddyChange : : match ( message ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-21 00:27:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        int  requestedChannel  =  m_deviceAPI - > getDeviceItemIndex ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        //DeviceSoapySDRShared::MsgReportBuddyChange& report = (DeviceSoapySDRShared::MsgReportBuddyChange&) message;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SoapySDROutputSettings  settings  =  m_settings ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        //bool fromRxBuddy = report.getRxElseTx();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 19:17:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        double  centerFrequency  =  m_deviceShared . m_device - > getFrequency ( 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                SOAPY_SDR_TX , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                requestedChannel , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                m_deviceShared . m_deviceParams - > getTxChannelMainTunableElementName ( requestedChannel ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 19:17:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        settings . m_centerFrequency  =  round ( centerFrequency / 1000.0 )  *  1000 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_devSampleRate  =  round ( m_deviceShared . m_device - > getSampleRate ( SOAPY_SDR_TX ,  requestedChannel ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-05 02:40:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        settings . m_bandwidth  =  round ( m_deviceShared . m_device - > getBandwidth ( SOAPY_SDR_TX ,  requestedChannel ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        //SoapySDROutputThread *outputThread = findThread();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_settings  =  settings ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // propagate settings to GUI if any
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( getMessageQueueToGUI ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            MsgConfigureSoapySDROutput  * reportToGUI  =  MsgConfigureSoapySDROutput : : create ( m_settings ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            getMessageQueueToGUI ( ) - > push ( reportToGUI ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    else  if  ( DeviceSoapySDRShared : : MsgReportDeviceArgsChange : : match ( message ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        DeviceSoapySDRShared : : MsgReportDeviceArgsChange &  report  =  ( DeviceSoapySDRShared : : MsgReportDeviceArgsChange & )  message ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        QMap < QString ,  QVariant >  deviceArgSettings  =  report . getDeviceArgSettings ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  auto  & oname  :  m_settings . m_deviceArgSettings . keys ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            auto  nvalue  =  deviceArgSettings . find ( oname ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( nvalue  ! =  deviceArgSettings . end ( )  & &  ( m_settings . m_deviceArgSettings [ oname ]  ! =  * nvalue ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                m_settings . m_deviceArgSettings [ oname ]  =  * nvalue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qDebug ( " SoapySDROutput::handleMessage: MsgReportDeviceArgsChange: device argument %s set to %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        oname . toStdString ( ) . c_str ( ) ,  nvalue - > toString ( ) . toStdString ( ) . c_str ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // propagate settings to GUI if any
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( getMessageQueueToGUI ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            DeviceSoapySDRShared : : MsgReportDeviceArgsChange  * reportToGUI  =  DeviceSoapySDRShared : : MsgReportDeviceArgsChange : : create ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    m_settings . m_deviceArgSettings ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            getMessageQueueToGUI ( ) - > push ( reportToGUI ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  SoapySDROutput : : applySettings ( const  SoapySDROutputSettings &  settings ,  bool  force )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  forwardChangeOwnDSP  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  forwardChangeToBuddies   =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    bool  globalGainChanged  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  individualGainsChanged  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    bool  deviceArgsChanged  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QList < QString >  reverseAPIKeys ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SoapySDR : : Device  * dev  =  m_deviceShared . m_device ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SoapySDROutputThread  * outputThread  =  findThread ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-21 00:27:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  requestedChannel  =  m_deviceAPI - > getDeviceItemIndex ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    qint64  xlatedDeviceCenterFrequency  =  settings . m_centerFrequency ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    xlatedDeviceCenterFrequency  - =  settings . m_transverterMode  ?  settings . m_transverterDeltaFrequency  :  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    xlatedDeviceCenterFrequency  =  xlatedDeviceCenterFrequency  <  0  ?  0  :  xlatedDeviceCenterFrequency ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:56:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // resize FIFO
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_devSampleRate  ! =  settings . m_devSampleRate )  | |  ( m_settings . m_log2Interp  ! =  settings . m_log2Interp )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SoapySDROutputThread  * soapySDROutputThread  =  findThread ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        SampleSourceFifo  * fifo  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:56:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( soapySDROutputThread ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            fifo  =  soapySDROutputThread - > getFifo ( requestedChannel ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            soapySDROutputThread - > setFifo ( requestedChannel ,  nullptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:56:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        unsigned  int  fifoRate  =  std : : max ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( unsigned  int )  settings . m_devSampleRate  /  ( 1 < < settings . m_log2Interp ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            DeviceSoapySDRShared : : m_sampleFifoMinRate ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_sampleSourceFifo . resize ( SampleSourceFifo : : getSizePolicy ( fifoRate ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:56:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( fifo )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            soapySDROutputThread - > setFifo ( requestedChannel ,  & m_sampleSourceFifo ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_devSampleRate  ! =  settings . m_devSampleRate )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " devSampleRate " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        forwardChangeOwnDSP  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        forwardChangeToBuddies  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dev - > setSampleRate ( SOAPY_SDR_TX ,  requestedChannel ,  settings . m_devSampleRate ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qDebug ( )  < <  " SoapySDROutput::applySettings: setSampleRate OK:  "  < <  settings . m_devSampleRate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( outputThread ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    bool  wasRunning  =  outputThread - > isRunning ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    outputThread - > stopWork ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    outputThread - > setSampleRate ( settings . m_devSampleRate ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ( wasRunning )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        outputThread - > startWork ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qCritical ( " SoapySDROutput::applySettings: could not set sample rate: %d: %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        settings . m_devSampleRate ,  ex . what ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_log2Interp  ! =  settings . m_log2Interp )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " log2Interp " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        forwardChangeOwnDSP  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( outputThread ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            outputThread - > setLog2Interpolation ( requestedChannel ,  settings . m_log2Interp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qDebug ( )  < <  " SoapySDROutput::applySettings: set decimation to  "  < <  ( 1 < < settings . m_log2Interp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_centerFrequency  ! =  settings . m_centerFrequency )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " centerFrequency " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_transverterMode  ! =  settings . m_transverterMode )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " transverterMode " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_transverterDeltaFrequency  ! =  settings . m_transverterDeltaFrequency )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " transverterDeltaFrequency " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_LOppmTenths  ! =  settings . m_LOppmTenths )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " LOppmTenths " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_centerFrequency  ! =  settings . m_centerFrequency ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        | |  ( m_settings . m_transverterMode  ! =  settings . m_transverterMode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        | |  ( m_settings . m_transverterDeltaFrequency  ! =  settings . m_transverterDeltaFrequency ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        | |  ( m_settings . m_LOppmTenths  ! =  settings . m_LOppmTenths ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        | |  ( m_settings . m_devSampleRate  ! =  settings . m_devSampleRate ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        | |  ( m_settings . m_log2Interp  ! =  settings . m_log2Interp )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        forwardChangeOwnDSP  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        forwardChangeToBuddies  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( dev )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            setDeviceCenterFrequency ( dev ,  requestedChannel ,  settings . m_centerFrequency ,  settings . m_LOppmTenths ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-29 18:27:58 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-05 02:19:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_antenna  ! =  settings . m_antenna )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " antenna " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-05 02:19:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dev - > setAntenna ( SOAPY_SDR_TX ,  requestedChannel ,  settings . m_antenna . toStdString ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qDebug ( " SoapySDROutput::applySettings: set antenna to %s " ,  settings . m_antenna . toStdString ( ) . c_str ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qCritical ( " SoapySDROutput::applySettings: cannot set antenna to %s: %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        settings . m_antenna . toStdString ( ) . c_str ( ) ,  ex . what ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-05 02:40:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_bandwidth  ! =  settings . m_bandwidth )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " bandwidth " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-05 02:40:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        forwardChangeToBuddies  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-05 02:40:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dev - > setBandwidth ( SOAPY_SDR_TX ,  requestedChannel ,  settings . m_bandwidth ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qDebug ( " SoapySDROutput::applySettings: bandwidth set to %u " ,  settings . m_bandwidth ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qCritical ( " SoapySDROutput::applySettings: cannot set bandwidth to %u: %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        settings . m_bandwidth ,  ex . what ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-06 20:19:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( const  auto  & oname  :  m_settings . m_tunableElements . keys ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  nvalue  =  settings . m_tunableElements . find ( oname ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-10 07:17:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( nvalue  ! =  settings . m_tunableElements . end ( )  & &  ( ( m_settings . m_tunableElements [ oname ]  ! =  * nvalue )  | |  force ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-06 20:19:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-06 20:19:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    dev - > setFrequency ( SOAPY_SDR_TX ,  requestedChannel ,  oname . toStdString ( ) ,  * nvalue ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    qDebug ( " SoapySDROutput::applySettings: tunable element %s frequency set to %lf " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            oname . toStdString ( ) . c_str ( ) ,  * nvalue ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    qCritical ( " SoapySDROutput::applySettings: cannot set tunable element %s to %lf: %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            oname . toStdString ( ) . c_str ( ) ,  * nvalue ,  ex . what ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m_settings . m_tunableElements [ oname ]  =  * nvalue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-05 02:40:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:08:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_globalGain  ! =  settings . m_globalGain )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " globalGain " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:08:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dev - > setGain ( SOAPY_SDR_TX ,  requestedChannel ,  settings . m_globalGain ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qDebug ( " SoapySDROutput::applySettings: set global gain to %d " ,  settings . m_globalGain ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                globalGainChanged  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:08:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qCritical ( " SoapySDROutput::applySettings: cannot set global gain to %d: %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        settings . m_globalGain ,  ex . what ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:47:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto  & oname  :  m_settings . m_individualGains . keys ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  nvalue  =  settings . m_individualGains . find ( oname ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( nvalue  ! =  settings . m_individualGains . end ( )  & &  ( ( m_settings . m_individualGains [ oname ]  ! =  * nvalue )  | |  force ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:47:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:47:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    dev - > setGain ( SOAPY_SDR_TX ,  requestedChannel ,  oname . toStdString ( ) ,  * nvalue ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    qDebug ( " SoapySDROutput::applySettings: individual gain %s set to %lf " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            oname . toStdString ( ) . c_str ( ) ,  * nvalue ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    individualGainsChanged  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:47:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    qCritical ( " SoapySDROutput::applySettings: cannot set individual gain %s to %lf: %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            oname . toStdString ( ) . c_str ( ) ,  * nvalue ,  ex . what ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m_settings . m_individualGains [ oname ]  =  * nvalue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-08 01:52:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_autoGain  ! =  settings . m_autoGain )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " autoGain " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-08 01:52:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dev - > setGainMode ( SOAPY_SDR_TX ,  requestedChannel ,  settings . m_autoGain ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qDebug ( " SoapySDROutput::applySettings: %s AGC " ,  settings . m_autoGain  ?  " set "  :  " unset " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qCritical ( " SoapySDROutput::applySettings: cannot %s AGC " ,  settings . m_autoGain  ?  " set "  :  " unset " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-08 21:42:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_autoDCCorrection  ! =  settings . m_autoDCCorrection )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " autoDCCorrection " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ( dev )  & &  hasDCAutoCorrection ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-08 21:42:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dev - > setDCOffsetMode ( SOAPY_SDR_TX ,  requestedChannel ,  settings . m_autoDCCorrection ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qDebug ( " SoapySDROutput::applySettings: %s DC auto correction " ,  settings . m_autoDCCorrection  ?  " set "  :  " unset " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qCritical ( " SoapySDROutput::applySettings: cannot %s DC auto correction " ,  settings . m_autoDCCorrection  ?  " set "  :  " unset " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_dcCorrection  ! =  settings . m_dcCorrection )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " dcCorrection " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ( dev )  & &  hasDCCorrectionValue ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-08 21:42:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dev - > setDCOffset ( SOAPY_SDR_TX ,  requestedChannel ,  settings . m_dcCorrection ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qDebug ( " SoapySDROutput::applySettings: DC offset correction set to (%lf, %lf) " ,  settings . m_dcCorrection . real ( ) ,  settings . m_dcCorrection . imag ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qCritical ( " SoapySDROutput::applySettings: cannot set DC offset correction to (%lf, %lf) " ,  settings . m_dcCorrection . real ( ) ,  settings . m_dcCorrection . imag ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( m_settings . m_iqCorrection  ! =  settings . m_iqCorrection )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        reverseAPIKeys . append ( " iqCorrection " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ( dev )  & &  hasIQCorrectionValue ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-08 21:42:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dev - > setIQBalance ( SOAPY_SDR_TX ,  requestedChannel ,  settings . m_iqCorrection ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qDebug ( " SoapySDROutput::applySettings: IQ balance correction set to (%lf, %lf) " ,  settings . m_iqCorrection . real ( ) ,  settings . m_iqCorrection . imag ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                qCritical ( " SoapySDROutput::applySettings: cannot set IQ balance correction to (%lf, %lf) " ,  settings . m_iqCorrection . real ( ) ,  settings . m_iqCorrection . imag ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-11 19:44:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto  & oname  :  m_settings . m_streamArgSettings . keys ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  nvalue  =  settings . m_streamArgSettings . find ( oname ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( nvalue  ! =  settings . m_streamArgSettings . end ( )  & &  ( ( m_settings . m_streamArgSettings [ oname ]  ! =  * nvalue )  | |  force ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-11 19:44:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    dev - > writeSetting ( SOAPY_SDR_TX ,  requestedChannel ,  oname . toStdString ( ) ,  nvalue - > toString ( ) . toStdString ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    qDebug ( " SoapySDROutput::applySettings: stream argument %s set to %s " , 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-11 19:44:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            oname . toStdString ( ) . c_str ( ) ,  nvalue - > toString ( ) . toStdString ( ) . c_str ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    qCritical ( " SoapySDROutput::applySettings: cannot set stream argument %s to %s: %s " , 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-11 19:44:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            oname . toStdString ( ) . c_str ( ) ,  nvalue - > toString ( ) . toStdString ( ) . c_str ( ) ,  ex . what ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m_settings . m_streamArgSettings [ oname ]  =  * nvalue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto  & oname  :  m_settings . m_deviceArgSettings . keys ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  nvalue  =  settings . m_deviceArgSettings . find ( oname ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( nvalue  ! =  settings . m_deviceArgSettings . end ( )  & &  ( ( m_settings . m_deviceArgSettings [ oname ]  ! =  * nvalue )  | |  force ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-26 00:56:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    dev - > writeSetting ( oname . toStdString ( ) ,  nvalue - > toString ( ) . toStdString ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    qDebug ( " SoapySDROutput::applySettings: device argument %s set to %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            oname . toStdString ( ) . c_str ( ) ,  nvalue - > toString ( ) . toStdString ( ) . c_str ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                catch  ( const  std : : exception  & ex ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    qCritical ( " SoapySDRInput::applySettings: cannot set device argument %s to %s: %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            oname . toStdString ( ) . c_str ( ) ,  nvalue - > toString ( ) . toStdString ( ) . c_str ( ) ,  ex . what ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m_settings . m_deviceArgSettings [ oname ]  =  * nvalue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            deviceArgsChanged  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( forwardChangeOwnDSP ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  sampleRate  =  settings . m_devSampleRate / ( 1 < < settings . m_log2Interp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        DSPSignalNotification  * notif  =  new  DSPSignalNotification ( sampleRate ,  settings . m_centerFrequency ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_deviceAPI - > getDeviceEngineInputMessageQueue ( ) - > push ( notif ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( forwardChangeToBuddies ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // send to buddies
 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        const  std : : vector < DeviceAPI * > &  sourceBuddies  =  m_deviceAPI - > getSourceBuddies ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  std : : vector < DeviceAPI * > &  sinkBuddies  =  m_deviceAPI - > getSinkBuddies ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  auto  & itSource  :  sourceBuddies ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            DeviceSoapySDRShared : : MsgReportBuddyChange  * report  =  DeviceSoapySDRShared : : MsgReportBuddyChange : : create ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    settings . m_centerFrequency , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    settings . m_LOppmTenths , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    settings . m_devSampleRate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            itSource - > getSamplingDeviceInputMessageQueue ( ) - > push ( report ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  auto  & itSink  :  sinkBuddies ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            DeviceSoapySDRShared : : MsgReportBuddyChange  * report  =  DeviceSoapySDRShared : : MsgReportBuddyChange : : create ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    settings . m_centerFrequency , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    settings . m_LOppmTenths , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    settings . m_devSampleRate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            itSink - > getSamplingDeviceInputMessageQueue ( ) - > push ( report ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( deviceArgsChanged ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // send to buddies
 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        const  std : : vector < DeviceAPI * > &  sourceBuddies  =  m_deviceAPI - > getSourceBuddies ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  std : : vector < DeviceAPI * > &  sinkBuddies  =  m_deviceAPI - > getSinkBuddies ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  auto  & itSource  :  sourceBuddies ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            DeviceSoapySDRShared : : MsgReportDeviceArgsChange  * report  =  DeviceSoapySDRShared : : MsgReportDeviceArgsChange : : create ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    settings . m_deviceArgSettings ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            itSource - > getSamplingDeviceInputMessageQueue ( ) - > push ( report ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  auto  & itSink  :  sinkBuddies ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            DeviceSoapySDRShared : : MsgReportDeviceArgsChange  * report  =  DeviceSoapySDRShared : : MsgReportDeviceArgsChange : : create ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    settings . m_deviceArgSettings ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 22:11:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            itSink - > getSamplingDeviceInputMessageQueue ( ) - > push ( report ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-12 01:10:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( settings . m_useReverseAPI ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        bool  fullUpdate  =  ( ( m_settings . m_useReverseAPI  ! =  settings . m_useReverseAPI )  & &  settings . m_useReverseAPI )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ( m_settings . m_reverseAPIAddress  ! =  settings . m_reverseAPIAddress )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ( m_settings . m_reverseAPIPort  ! =  settings . m_reverseAPIPort )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ( m_settings . m_reverseAPIDeviceIndex  ! =  settings . m_reverseAPIDeviceIndex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( fullUpdate  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            webapiReverseSendSettings ( reverseAPIKeys ,  settings ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  if  ( reverseAPIKeys . size ( )  ! =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            webapiReverseSendSettings ( reverseAPIKeys ,  settings ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_settings  =  settings ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( globalGainChanged  | |  individualGainsChanged ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( dev )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            updateGains ( dev ,  requestedChannel ,  m_settings ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( getMessageQueueToGUI ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-15 07:00:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            MsgReportGainChange  * report  =  MsgReportGainChange : : create ( m_settings ,  globalGainChanged ,  individualGainsChanged ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 23:54:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            getMessageQueueToGUI ( ) - > push ( report ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    qDebug ( )  < <  " SoapySDROutput::applySettings:  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            < <  "  m_transverterMode:  "  < <  m_settings . m_transverterMode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            < <  "  m_transverterDeltaFrequency:  "  < <  m_settings . m_transverterDeltaFrequency 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            < <  "  m_centerFrequency:  "  < <  m_settings . m_centerFrequency  < <  "  Hz " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            < <  "  m_LOppmTenths:  "  < <  m_settings . m_LOppmTenths 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            < <  "  m_log2Interp:  "  < <  m_settings . m_log2Interp 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-05 02:40:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            < <  "  m_devSampleRate:  "  < <  m_settings . m_devSampleRate 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-07 13:08:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            < <  "  m_bandwidth:  "  < <  m_settings . m_bandwidth 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-10 07:17:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            < <  "  m_globalGain:  "  < <  m_settings . m_globalGain 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            < <  "  force:  "  < <  force ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 14:14:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QMap < QString ,  double > : : const_iterator  doubleIt  =  m_settings . m_individualGains . begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( ;  doubleIt  ! =  m_settings . m_individualGains . end ( ) ;  + + doubleIt )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::applySettings: m_individualGains[%s]: %lf " ,  doubleIt . key ( ) . toStdString ( ) . c_str ( ) ,  doubleIt . value ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    doubleIt  =  m_settings . m_tunableElements . begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( ;  doubleIt  ! =  m_settings . m_tunableElements . end ( ) ;  + + doubleIt )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::applySettings: m_tunableElements[%s]: %lf " ,  doubleIt . key ( ) . toStdString ( ) . c_str ( ) ,  doubleIt . value ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    QMap < QString ,  QVariant > : : const_iterator  varIt  =  m_settings . m_deviceArgSettings . begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( ;  varIt  ! =  m_settings . m_deviceArgSettings . end ( ) ;  + + varIt ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::applySettings: m_deviceArgSettings[%s] (type %d): %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            varIt . key ( ) . toStdString ( ) . c_str ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( int )  varIt . value ( ) . type ( ) ,  // bool: 1, int: 2, double: 6, string: 10 (http://doc.qt.io/archives/qt-4.8/qvariant.html)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            varIt . value ( ) . toString ( ) . toStdString ( ) . c_str ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    varIt  =  m_settings . m_streamArgSettings . begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( ;  varIt  ! =  m_settings . m_streamArgSettings . end ( ) ;  + + varIt ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::applySettings: m_streamArgSettings[%s] (type %d): %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            varIt . key ( ) . toStdString ( ) . c_str ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( int )  varIt . value ( ) . type ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            varIt . value ( ) . toString ( ) . toStdString ( ) . c_str ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-04 18:42:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  SoapySDROutput : : webapiSettingsGet (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                SWGSDRangel : : SWGDeviceSettings &  response , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                QString &  errorMessage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ( void )  errorMessage ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . setSoapySdrOutputSettings ( new  SWGSDRangel : : SWGSoapySDROutputSettings ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > init ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    webapiFormatDeviceSettings ( response ,  m_settings ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  200 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  SoapySDROutput : : webapiSettingsPutPatch (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                bool  force , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                const  QStringList &  deviceSettingsKeys , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                SWGSDRangel : : SWGDeviceSettings &  response ,  // query + response
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                QString &  errorMessage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ( void )  errorMessage ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SoapySDROutputSettings  settings  =  m_settings ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-04 20:24:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    webapiUpdateDeviceSettings ( settings ,  deviceSettingsKeys ,  response ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-08-04 20:24:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    MsgConfigureSoapySDROutput  * msg  =  MsgConfigureSoapySDROutput : : create ( settings ,  force ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_inputMessageQueue . push ( msg ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( m_guiMessageQueue )  // forward to GUI if any
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        MsgConfigureSoapySDROutput  * msgToGUI  =  MsgConfigureSoapySDROutput : : create ( settings ,  force ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_guiMessageQueue - > push ( msgToGUI ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    webapiFormatDeviceSettings ( response ,  settings ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  200 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : webapiUpdateDeviceSettings (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SoapySDROutputSettings &  settings , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  QStringList &  deviceSettingsKeys , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SWGSDRangel : : SWGDeviceSettings &  response ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " centerFrequency " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_centerFrequency  =  response . getSoapySdrOutputSettings ( ) - > getCenterFrequency ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " LOppmTenths " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_LOppmTenths  =  response . getSoapySdrOutputSettings ( ) - > getLOppmTenths ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " devSampleRate " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_devSampleRate  =  response . getSoapySdrOutputSettings ( ) - > getDevSampleRate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " bandwidth " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_bandwidth  =  response . getSoapySdrOutputSettings ( ) - > getBandwidth ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " log2Interp " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_log2Interp  =  response . getSoapySdrOutputSettings ( ) - > getLog2Interp ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " transverterDeltaFrequency " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_transverterDeltaFrequency  =  response . getSoapySdrOutputSettings ( ) - > getTransverterDeltaFrequency ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " transverterMode " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_transverterMode  =  response . getSoapySdrOutputSettings ( ) - > getTransverterMode ( )  ! =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " antenna " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_antenna  =  * response . getSoapySdrOutputSettings ( ) - > getAntenna ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " tunableElements " ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        QList < SWGSDRangel : : SWGArgValue * >  * tunableElements  =  response . getSoapySdrOutputSettings ( ) - > getTunableElements ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 23:00:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( const  auto  & itArg  :  * tunableElements ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 23:00:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            QMap < QString ,  double > : : iterator  itSettings  =  settings . m_tunableElements . find ( * ( itArg - > getKey ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 23:00:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( itSettings  ! =  settings . m_tunableElements . end ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                QVariant  v  =  webapiVariantFromArgValue ( itArg ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                itSettings . value ( )  =  v . toDouble ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " globalGain " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_globalGain  =  response . getSoapySdrOutputSettings ( ) - > getGlobalGain ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " individualGains " ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        QList < SWGSDRangel : : SWGArgValue * >  * individualGains  =  response . getSoapySdrOutputSettings ( ) - > getIndividualGains ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 23:00:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( const  auto  & itArg  :  * individualGains ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 23:00:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            QMap < QString ,  double > : : iterator  itSettings  =  settings . m_individualGains . find ( * ( itArg - > getKey ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 23:00:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( itSettings  ! =  settings . m_individualGains . end ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                QVariant  v  =  webapiVariantFromArgValue ( itArg ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                itSettings . value ( )  =  v . toDouble ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " autoGain " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_autoGain  =  response . getSoapySdrOutputSettings ( ) - > getAutoGain ( )  ! =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " autoDCCorrection " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_autoDCCorrection  =  response . getSoapySdrOutputSettings ( ) - > getAutoDcCorrection ( )  ! =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " autoIQCorrection " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_autoIQCorrection  =  response . getSoapySdrOutputSettings ( ) - > getAutoIqCorrection ( )  ! =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " dcCorrection " ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_dcCorrection . real ( response . getSoapySdrOutputSettings ( ) - > getDcCorrection ( ) - > getReal ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_dcCorrection . imag ( response . getSoapySdrOutputSettings ( ) - > getDcCorrection ( ) - > getImag ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " iqCorrection " ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_iqCorrection . real ( response . getSoapySdrOutputSettings ( ) - > getIqCorrection ( ) - > getReal ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_iqCorrection . imag ( response . getSoapySdrOutputSettings ( ) - > getIqCorrection ( ) - > getImag ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " streamArgSettings " ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        QList < SWGSDRangel : : SWGArgValue * >  * streamArgSettings  =  response . getSoapySdrOutputSettings ( ) - > getStreamArgSettings ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  auto  itArg  :  * streamArgSettings ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 16:54:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            QMap < QString ,  QVariant > : : iterator  itSettings  =  settings . m_streamArgSettings . find ( * itArg - > getKey ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 16:54:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( itSettings  ! =  settings . m_streamArgSettings . end ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                itSettings . value ( )  =  webapiVariantFromArgValue ( itArg ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " deviceArgSettings " ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        QList < SWGSDRangel : : SWGArgValue * >  * deviceArgSettings  =  response . getSoapySdrOutputSettings ( ) - > getDeviceArgSettings ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  auto  itArg  :  * deviceArgSettings ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 16:54:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            QMap < QString ,  QVariant > : : iterator  itSettings  =  settings . m_deviceArgSettings . find ( * itArg - > getKey ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 16:54:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( itSettings  ! =  settings . m_deviceArgSettings . end ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                itSettings . value ( )  =  webapiVariantFromArgValue ( itArg ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-01-11 14:45:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " useReverseAPI " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_useReverseAPI  =  response . getSoapySdrOutputSettings ( ) - > getUseReverseApi ( )  ! =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " reverseAPIAddress " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_reverseAPIAddress  =  * response . getSoapySdrOutputSettings ( ) - > getReverseApiAddress ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " reverseAPIPort " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_reverseAPIPort  =  response . getSoapySdrOutputSettings ( ) - > getReverseApiPort ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " reverseAPIDeviceIndex " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        settings . m_reverseAPIDeviceIndex  =  response . getSoapySdrOutputSettings ( ) - > getReverseApiDeviceIndex ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 23:34:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  SoapySDROutput : : webapiReportGet ( SWGSDRangel : : SWGDeviceReport &  response ,  QString &  errorMessage )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ( void )  errorMessage ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . setSoapySdrOutputReport ( new  SWGSDRangel : : SWGSoapySDRReport ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputReport ( ) - > init ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    webapiFormatDeviceReport ( response ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  200 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  SoapySDROutput : : webapiRunGet (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SWGSDRangel : : SWGDeviceState &  response , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        QString &  errorMessage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ( void )  errorMessage ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_deviceAPI - > getDeviceEngineStateStr ( * response . getState ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  200 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  SoapySDROutput : : webapiRun (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        bool  run , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SWGSDRangel : : SWGDeviceState &  response , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        QString &  errorMessage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ( void )  errorMessage ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_deviceAPI - > getDeviceEngineStateStr ( * response . getState ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    MsgStartStop  * message  =  MsgStartStop : : create ( run ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_inputMessageQueue . push ( message ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( m_guiMessageQueue )  // forward to GUI if any
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        MsgStartStop  * msgToGUI  =  MsgStartStop : : create ( run ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_guiMessageQueue - > push ( msgToGUI ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  200 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoapySDROutput : : webapiFormatDeviceSettings ( SWGSDRangel : : SWGDeviceSettings &  response ,  const  SoapySDROutputSettings &  settings )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setCenterFrequency ( settings . m_centerFrequency ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setLOppmTenths ( settings . m_LOppmTenths ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setDevSampleRate ( settings . m_devSampleRate ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setLog2Interp ( settings . m_log2Interp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setTransverterDeltaFrequency ( settings . m_transverterDeltaFrequency ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setTransverterMode ( settings . m_transverterMode  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( response . getSoapySdrOutputSettings ( ) - > getAntenna ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        * response . getSoapySdrOutputSettings ( ) - > getAntenna ( )  =  settings . m_antenna ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > setAntenna ( new  QString ( settings . m_antenna ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( response . getSoapySdrOutputSettings ( ) - > getTunableElements ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getTunableElements ( ) - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > setTunableElements ( new  QList < SWGSDRangel : : SWGArgValue * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto &  itName  :  settings . m_tunableElements . keys ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getTunableElements ( ) - > append ( new  SWGSDRangel : : SWGArgValue ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getTunableElements ( ) - > back ( ) - > setKey ( new  QString (   itName ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        double  value  =  settings . m_tunableElements . value ( itName ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getTunableElements ( ) - > back ( ) - > setValueString ( new  QString ( tr ( " %1 " ) . arg ( value ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getTunableElements ( ) - > back ( ) - > setValueType ( new  QString ( " float " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setBandwidth ( settings . m_bandwidth ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setGlobalGain ( settings . m_globalGain ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( response . getSoapySdrOutputSettings ( ) - > getIndividualGains ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getIndividualGains ( ) - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > setIndividualGains ( new  QList < SWGSDRangel : : SWGArgValue * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto &  itName  :  settings . m_individualGains . keys ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getIndividualGains ( ) - > append ( new  SWGSDRangel : : SWGArgValue ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getIndividualGains ( ) - > back ( ) - > setKey ( new  QString ( itName ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        double  value  =  settings . m_individualGains . value ( itName ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getIndividualGains ( ) - > back ( ) - > setValueString ( new  QString ( tr ( " %1 " ) . arg ( value ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getIndividualGains ( ) - > back ( ) - > setValueType ( new  QString ( " float " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setAutoGain ( settings . m_autoGain  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setAutoDcCorrection ( settings . m_autoDCCorrection  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setAutoIqCorrection ( settings . m_autoIQCorrection  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! response . getSoapySdrOutputSettings ( ) - > getDcCorrection ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > setDcCorrection ( new  SWGSDRangel : : SWGComplex ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > getDcCorrection ( ) - > setReal ( settings . m_dcCorrection . real ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > getDcCorrection ( ) - > setImag ( settings . m_dcCorrection . imag ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! response . getSoapySdrOutputSettings ( ) - > getIqCorrection ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > setIqCorrection ( new  SWGSDRangel : : SWGComplex ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > getIqCorrection ( ) - > setReal ( settings . m_iqCorrection . real ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > getIqCorrection ( ) - > setImag ( settings . m_iqCorrection . imag ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( response . getSoapySdrOutputSettings ( ) - > getStreamArgSettings ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getStreamArgSettings ( ) - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > setStreamArgSettings ( new  QList < SWGSDRangel : : SWGArgValue * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto &  itName  :  settings . m_streamArgSettings . keys ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getStreamArgSettings ( ) - > append ( new  SWGSDRangel : : SWGArgValue ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getStreamArgSettings ( ) - > back ( ) - > setKey ( new  QString ( itName ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  QVariant &  v  =  settings . m_streamArgSettings . value ( itName ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webapiFormatArgValue ( v ,  response . getSoapySdrOutputSettings ( ) - > getStreamArgSettings ( ) - > back ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( response . getSoapySdrOutputSettings ( ) - > getDeviceArgSettings ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getDeviceArgSettings ( ) - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > setDeviceArgSettings ( new  QList < SWGSDRangel : : SWGArgValue * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto &  itName  :  settings . m_deviceArgSettings . keys ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getDeviceArgSettings ( ) - > append ( new  SWGSDRangel : : SWGArgValue ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > getDeviceArgSettings ( ) - > back ( ) - > setKey ( new  QString ( itName ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  QVariant &  v  =  settings . m_deviceArgSettings . value ( itName ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webapiFormatArgValue ( v ,  response . getSoapySdrOutputSettings ( ) - > getDeviceArgSettings ( ) - > back ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-11 14:45:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setUseReverseApi ( settings . m_useReverseAPI  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( response . getSoapySdrOutputSettings ( ) - > getReverseApiAddress ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        * response . getSoapySdrOutputSettings ( ) - > getReverseApiAddress ( )  =  settings . m_reverseAPIAddress ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputSettings ( ) - > setReverseApiAddress ( new  QString ( settings . m_reverseAPIAddress ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setReverseApiPort ( settings . m_reverseAPIPort ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputSettings ( ) - > setReverseApiDeviceIndex ( settings . m_reverseAPIDeviceIndex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : webapiFormatDeviceReport ( SWGSDRangel : : SWGDeviceReport &  response )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  DeviceSoapySDRParams : : ChannelSettings *  channelSettings  =  m_deviceShared . m_deviceParams - > getTxChannelSettings ( m_deviceShared . m_channel ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputReport ( ) - > setDeviceSettingsArgs ( new  QList < SWGSDRangel : : SWGArgInfo * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto &  itArg  :  m_deviceShared . m_deviceParams - > getDeviceArgs ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputReport ( ) - > getDeviceSettingsArgs ( ) - > append ( new  SWGSDRangel : : SWGArgInfo ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webapiFormatArgInfo ( itArg ,  response . getSoapySdrOutputReport ( ) - > getDeviceSettingsArgs ( ) - > back ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputReport ( ) - > setStreamSettingsArgs ( new  QList < SWGSDRangel : : SWGArgInfo * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto &  itArg  :  channelSettings - > m_streamSettingsArgs ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputReport ( ) - > getStreamSettingsArgs ( ) - > append ( new  SWGSDRangel : : SWGArgInfo ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webapiFormatArgInfo ( itArg ,  response . getSoapySdrOutputReport ( ) - > getStreamSettingsArgs ( ) - > back ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputReport ( ) - > setFrequencySettingsArgs ( new  QList < SWGSDRangel : : SWGArgInfo * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto &  itArg  :  channelSettings - > m_frequencySettingsArgs ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputReport ( ) - > getFrequencySettingsArgs ( ) - > append ( new  SWGSDRangel : : SWGArgInfo ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webapiFormatArgInfo ( itArg ,  response . getSoapySdrOutputReport ( ) - > getFrequencySettingsArgs ( ) - > back ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputReport ( ) - > setHasAgc ( channelSettings - > m_hasAGC  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputReport ( ) - > setHasDcAutoCorrection ( channelSettings - > m_hasDCAutoCorrection  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputReport ( ) - > setHasDcOffsetValue ( channelSettings - > m_hasDCOffsetValue  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputReport ( ) - > setHasFrequencyCorrectionValue ( channelSettings - > m_hasFrequencyCorrectionValue  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . getSoapySdrOutputReport ( ) - > setHasIqBalanceValue ( channelSettings - > m_hasIQBalanceValue  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( channelSettings - > m_antennas . size ( )  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputReport ( ) - > setAntennas ( new  QList < QString  * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( const  auto &  itAntenna  :  channelSettings - > m_antennas )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getAntennas ( ) - > append ( new  QString ( itAntenna . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( channelSettings - > m_gainRange . maximum ( )  ! =  0.0 )  | |  ( channelSettings - > m_gainRange . minimum ( )  ! =  0.0 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputReport ( ) - > setGainRange ( new  SWGSDRangel : : SWGRangeFloat ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputReport ( ) - > getGainRange ( ) - > setMin ( channelSettings - > m_gainRange . minimum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputReport ( ) - > getGainRange ( ) - > setMax ( channelSettings - > m_gainRange . maximum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( channelSettings - > m_gainSettings . size ( )  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputReport ( ) - > setGainSettings ( new  QList < SWGSDRangel : : SWGSoapySDRGainSetting * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( const  auto &  itGain  :  channelSettings - > m_gainSettings ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getGainSettings ( ) - > append ( new  SWGSDRangel : : SWGSoapySDRGainSetting ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getGainSettings ( ) - > back ( ) - > setRange ( new  SWGSDRangel : : SWGRangeFloat ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getGainSettings ( ) - > back ( ) - > getRange ( ) - > setMin ( itGain . m_range . minimum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getGainSettings ( ) - > back ( ) - > getRange ( ) - > setMax ( itGain . m_range . maximum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getGainSettings ( ) - > back ( ) - > setName ( new  QString ( itGain . m_name . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( channelSettings - > m_frequencySettings . size ( )  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputReport ( ) - > setFrequencySettings ( new  QList < SWGSDRangel : : SWGSoapySDRFrequencySetting * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( const  auto &  itFreq  :  channelSettings - > m_frequencySettings ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getFrequencySettings ( ) - > append ( new  SWGSDRangel : : SWGSoapySDRFrequencySetting ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getFrequencySettings ( ) - > back ( ) - > setRanges ( new  QList < SWGSDRangel : : SWGRangeFloat * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( const  auto  itRange  :  itFreq . m_ranges ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                response . getSoapySdrOutputReport ( ) - > getFrequencySettings ( ) - > back ( ) - > getRanges ( ) - > append ( new  SWGSDRangel : : SWGRangeFloat ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                response . getSoapySdrOutputReport ( ) - > getFrequencySettings ( ) - > back ( ) - > getRanges ( ) - > back ( ) - > setMin ( itRange . minimum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                response . getSoapySdrOutputReport ( ) - > getFrequencySettings ( ) - > back ( ) - > getRanges ( ) - > back ( ) - > setMax ( itRange . maximum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getFrequencySettings ( ) - > back ( ) - > setName ( new  QString ( itFreq . m_name . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( channelSettings - > m_ratesRanges . size ( )  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputReport ( ) - > setRatesRanges ( new  QList < SWGSDRangel : : SWGRangeFloat * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  auto  itRange  :  channelSettings - > m_ratesRanges ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getRatesRanges ( ) - > append ( new  SWGSDRangel : : SWGRangeFloat ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getRatesRanges ( ) - > back ( ) - > setMin ( itRange . minimum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getRatesRanges ( ) - > back ( ) - > setMax ( itRange . maximum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( channelSettings - > m_bandwidthsRanges . size ( )  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response . getSoapySdrOutputReport ( ) - > setBandwidthsRanges ( new  QList < SWGSDRangel : : SWGRangeFloat * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  auto  itBandwidth  :  channelSettings - > m_bandwidthsRanges ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getBandwidthsRanges ( ) - > append ( new  SWGSDRangel : : SWGRangeFloat ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getBandwidthsRanges ( ) - > back ( ) - > setMin ( itBandwidth . minimum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . getSoapySdrOutputReport ( ) - > getBandwidthsRanges ( ) - > back ( ) - > setMax ( itBandwidth . maximum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-16 08:15:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								QVariant  SoapySDROutput : : webapiVariantFromArgValue ( SWGSDRangel : : SWGArgValue  * argValue )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( * argValue - > getValueType ( )  = =  " bool " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  QVariant ( ( bool )  ( * argValue - > getValueString ( )  = =  " 1 " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  if  ( * argValue - > getValueType ( )  = =  " int " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  QVariant ( ( int )  ( atoi ( argValue - > getValueString ( ) - > toStdString ( ) . c_str ( ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  if  ( * argValue - > getValueType ( )  = =  " float " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  QVariant ( ( double )  ( atof ( argValue - > getValueString ( ) - > toStdString ( ) . c_str ( ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  QVariant ( QString ( * argValue - > getValueString ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SoapySDROutput : : webapiFormatArgValue ( const  QVariant &  v ,  SWGSDRangel : : SWGArgValue  * argValue )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( v . type ( )  = =  QVariant : : Bool ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argValue - > setValueType ( new  QString ( " bool " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argValue - > setValueString ( new  QString ( v . toBool ( )  ?  " 1 "  :  " 0 " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else  if  ( v . type ( )  = =  QVariant : : Int ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argValue - > setValueType ( new  QString ( " int " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argValue - > setValueString ( new  QString ( tr ( " %1 " ) . arg ( v . toInt ( ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else  if  ( v . type ( )  = =  QVariant : : Double ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argValue - > setValueType ( new  QString ( " float " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argValue - > setValueString ( new  QString ( tr ( " %1 " ) . arg ( v . toDouble ( ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argValue - > setValueType ( new  QString ( " string " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argValue - > setValueString ( new  QString ( v . toString ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : webapiFormatArgInfo ( const  SoapySDR : : ArgInfo &  arg ,  SWGSDRangel : : SWGArgInfo  * argInfo )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    argInfo - > setKey ( new  QString ( arg . key . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( arg . type  = =  SoapySDR : : ArgInfo : : BOOL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argInfo - > setValueType ( new  QString ( " bool " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  if  ( arg . type  = =  SoapySDR : : ArgInfo : : INT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argInfo - > setValueType ( new  QString ( " int " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  if  ( arg . type  = =  SoapySDR : : ArgInfo : : FLOAT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argInfo - > setValueType ( new  QString ( " float " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argInfo - > setValueType ( new  QString ( " string " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    argInfo - > setValueString ( new  QString ( arg . value . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 00:47:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    argInfo - > setName ( new  QString ( arg . name . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    argInfo - > setDescription ( new  QString ( arg . description . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    argInfo - > setUnits ( new  QString ( arg . units . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( arg . range . minimum ( )  ! =  0.0 )  | |  ( arg . range . maximum ( )  ! =  0.0 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argInfo - > setRange ( new  SWGSDRangel : : SWGRangeFloat ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argInfo - > getRange ( ) - > setMin ( arg . range . minimum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        argInfo - > getRange ( ) - > setMax ( arg . range . maximum ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    argInfo - > setValueOptions ( new  QList < QString * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto &  itOpt  :  arg . options )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 00:47:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        argInfo - > getValueOptions ( ) - > append ( new  QString ( itOpt . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    argInfo - > setOptionNames ( new  QList < QString * > ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-27 19:04:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( const  auto &  itOpt  :  arg . optionNames )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-15 00:47:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        argInfo - > getOptionNames ( ) - > append ( new  QString ( itOpt . c_str ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-14 09:19:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : webapiReverseSendSettings ( QList < QString > &  deviceSettingsKeys ,  const  SoapySDROutputSettings &  settings ,  bool  force )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SWGSDRangel : : SWGDeviceSettings  * swgDeviceSettings  =  new  SWGSDRangel : : SWGDeviceSettings ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-07 14:43:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    swgDeviceSettings - > setDirection ( 1 ) ;  // Single Tx
 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 13:46:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    swgDeviceSettings - > setOriginatorIndex ( m_deviceAPI - > getDeviceSetIndex ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    swgDeviceSettings - > setDeviceHwType ( new  QString ( " SoapySDR " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    swgDeviceSettings - > setSoapySdrOutputSettings ( new  SWGSDRangel : : SWGSoapySDROutputSettings ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    swgDeviceSettings - > getSoapySdrOutputSettings ( ) - > init ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SWGSDRangel : : SWGSoapySDROutputSettings  * swgSoapySDROutputSettings  =  swgDeviceSettings - > getSoapySdrOutputSettings ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // transfer data that has been modified. When force is on transfer all data except reverse API data
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " centerFrequency " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setCenterFrequency ( settings . m_centerFrequency ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " LOppmTenths " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setLOppmTenths ( settings . m_LOppmTenths ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " devSampleRate " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setDevSampleRate ( settings . m_devSampleRate ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " bandwidth " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setBandwidth ( settings . m_bandwidth ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " log2Interp " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setLog2Interp ( settings . m_log2Interp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " transverterDeltaFrequency " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setTransverterDeltaFrequency ( settings . m_transverterDeltaFrequency ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " transverterMode " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setTransverterMode ( settings . m_transverterMode  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " antenna " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setAntenna ( new  QString ( settings . m_antenna ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " globalGain " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setGlobalGain ( settings . m_globalGain ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " autoGain " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setAutoGain ( settings . m_autoGain  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " autoDCCorrection " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setAutoDcCorrection ( settings . m_autoDCCorrection  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " autoIQCorrection " )  | |  force )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setAutoIqCorrection ( settings . m_autoIQCorrection  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " dcCorrection " )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setDcCorrection ( new  SWGSDRangel : : SWGComplex ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > getDcCorrection ( ) - > setReal ( settings . m_dcCorrection . real ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > getDcCorrection ( ) - > setImag ( settings . m_dcCorrection . imag ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( deviceSettingsKeys . contains ( " iqCorrection " )  | |  force ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > setIqCorrection ( new  SWGSDRangel : : SWGComplex ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > getIqCorrection ( ) - > setReal ( settings . m_iqCorrection . real ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        swgSoapySDROutputSettings - > getIqCorrection ( ) - > setImag ( settings . m_iqCorrection . imag ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    QString  deviceSettingsURL  =  QString ( " http://%1:%2/sdrangel/deviceset/%3/device/settings " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . arg ( settings . m_reverseAPIAddress ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . arg ( settings . m_reverseAPIPort ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . arg ( settings . m_reverseAPIDeviceIndex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_networkRequest . setUrl ( QUrl ( deviceSettingsURL ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_networkRequest . setHeader ( QNetworkRequest : : ContentTypeHeader ,  " application/json " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QBuffer  * buffer  =  new  QBuffer ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    buffer - > open ( ( QBuffer : : ReadWrite ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    buffer - > write ( swgDeviceSettings - > asJson ( ) . toUtf8 ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    buffer - > seek ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // Always use PATCH to avoid passing reverse API settings
 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QNetworkReply  * reply  =  m_networkManager - > sendCustomRequest ( m_networkRequest ,  " PATCH " ,  buffer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    buffer - > setParent ( reply ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    delete  swgDeviceSettings ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : webapiReverseSendStartStop ( bool  start )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2019-03-25 15:26:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SWGSDRangel : : SWGDeviceSettings  * swgDeviceSettings  =  new  SWGSDRangel : : SWGDeviceSettings ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-07 14:43:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    swgDeviceSettings - > setDirection ( 1 ) ;  // Single Tx
 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 15:26:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    swgDeviceSettings - > setOriginatorIndex ( m_deviceAPI - > getDeviceSetIndex ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    swgDeviceSettings - > setDeviceHwType ( new  QString ( " SoapySDR " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QString  deviceSettingsURL  =  QString ( " http://%1:%2/sdrangel/deviceset/%3/device/run " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . arg ( m_settings . m_reverseAPIAddress ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . arg ( m_settings . m_reverseAPIPort ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . arg ( m_settings . m_reverseAPIDeviceIndex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_networkRequest . setUrl ( QUrl ( deviceSettingsURL ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 15:26:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m_networkRequest . setHeader ( QNetworkRequest : : ContentTypeHeader ,  " application/json " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QBuffer  * buffer  =  new  QBuffer ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 15:26:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    buffer - > open ( ( QBuffer : : ReadWrite ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    buffer - > write ( swgDeviceSettings - > asJson ( ) . toUtf8 ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    buffer - > seek ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    QNetworkReply  * reply ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( start )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        reply  =  m_networkManager - > sendCustomRequest ( m_networkRequest ,  " POST " ,  buffer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        reply  =  m_networkManager - > sendCustomRequest ( m_networkRequest ,  " DELETE " ,  buffer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-14 16:58:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    buffer - > setParent ( reply ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-14 16:58:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    delete  swgDeviceSettings ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SoapySDROutput : : networkManagerFinished ( QNetworkReply  * reply )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    QNetworkReply : : NetworkError  replyError  =  reply - > error ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( replyError ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qWarning ( )  < <  " SoapySDROutput::networkManagerFinished: " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                < <  "  error( "  < <  ( int )  replyError 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                < <  " ):  "  < <  replyError 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                < <  " :  "  < <  reply - > errorString ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        QString  answer  =  reply - > readAll ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        answer . chop ( 1 ) ;  // remove last \n
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        qDebug ( " SoapySDROutput::networkManagerFinished: reply: \n %s " ,  answer . toStdString ( ) . c_str ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-15 01:04:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    reply - > deleteLater ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-26 23:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}