| 
									
										
										
										
											2012-05-22 17:09:48 +00:00
										 |  |  | #include "soundout.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define FRAMES_PER_BUFFER 256
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #include <portaudio.h>
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern float gran();                  //Noise generator (for tests only)
 | 
					
						
							| 
									
										
										
										
											2012-09-24 23:36:38 +00:00
										 |  |  | extern short int iwave[120*12000];     //Wave file for Tx audio
 | 
					
						
							| 
									
										
										
										
											2012-05-22 17:09:48 +00:00
										 |  |  | extern int nwave; | 
					
						
							|  |  |  | extern bool btxok; | 
					
						
							|  |  |  | extern double outputLatency; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct   //Parameters sent to or received from callback function | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   int dummy; | 
					
						
							|  |  |  | } paUserData; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------- d2aCallback
 | 
					
						
							|  |  |  | extern "C" int d2aCallback(const void *inputBuffer, void *outputBuffer, | 
					
						
							|  |  |  |                            unsigned long framesToProcess, | 
					
						
							|  |  |  |                            const PaStreamCallbackTimeInfo* timeInfo, | 
					
						
							|  |  |  |                            PaStreamCallbackFlags statusFlags, | 
					
						
							|  |  |  |                            void *userData ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   paUserData *udata=(paUserData*)userData; | 
					
						
							|  |  |  |   short *wptr = (short*)outputBuffer; | 
					
						
							| 
									
										
										
										
											2012-07-04 17:48:57 +00:00
										 |  |  |   unsigned int i; | 
					
						
							| 
									
										
										
										
											2012-05-22 17:09:48 +00:00
										 |  |  |   static int ic=0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-04 16:27:57 +00:00
										 |  |  |   for(i=0 ; i<framesToProcess; i++ )  { | 
					
						
							|  |  |  |     short int i2=iwave[ic]; | 
					
						
							|  |  |  |     if(ic > nwave) i2=0; | 
					
						
							| 
									
										
										
										
											2012-05-22 17:09:48 +00:00
										 |  |  | //      i2 = 500.0*(i2/32767.0 + 5.0*gran());      //Add noise (tests only!)
 | 
					
						
							| 
									
										
										
										
											2012-07-04 16:27:57 +00:00
										 |  |  |     if(!btxok) i2=0; | 
					
						
							|  |  |  |     *wptr++ = i2;                   //left
 | 
					
						
							|  |  |  |     ic++; | 
					
						
							| 
									
										
										
										
											2012-05-22 17:09:48 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-07-04 17:48:57 +00:00
										 |  |  |   if(ic >= nwave) { | 
					
						
							| 
									
										
										
										
											2012-05-22 17:09:48 +00:00
										 |  |  |     ic=0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SoundOutThread::run() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   PaError paerr; | 
					
						
							|  |  |  |   PaStreamParameters outParam; | 
					
						
							|  |  |  |   PaStream *outStream; | 
					
						
							|  |  |  |   paUserData udata; | 
					
						
							|  |  |  |   quitExecution = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   outParam.device=m_nDevOut;                 //Output device number
 | 
					
						
							| 
									
										
										
										
											2012-07-04 16:27:57 +00:00
										 |  |  |   outParam.channelCount=1;                   //Number of analog channels
 | 
					
						
							| 
									
										
										
										
											2012-05-22 17:09:48 +00:00
										 |  |  |   outParam.sampleFormat=paInt16;             //Send short ints to PortAudio
 | 
					
						
							|  |  |  |   outParam.suggestedLatency=0.05; | 
					
						
							|  |  |  |   outParam.hostApiSpecificStreamInfo=NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-24 23:36:38 +00:00
										 |  |  |   paerr=Pa_IsFormatSupported(NULL,&outParam,12000.0); | 
					
						
							| 
									
										
										
										
											2012-05-22 17:09:48 +00:00
										 |  |  |   if(paerr<0) { | 
					
						
							|  |  |  |     qDebug() << "PortAudio says requested output format not supported."; | 
					
						
							| 
									
										
										
										
											2012-07-02 20:52:56 +00:00
										 |  |  |     qDebug() << paerr << m_nDevOut; | 
					
						
							| 
									
										
										
										
											2012-05-22 17:09:48 +00:00
										 |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //  udata.nwave=m_nwave;
 | 
					
						
							|  |  |  | //  udata.btxok=false;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   paerr=Pa_OpenStream(&outStream,           //Output stream
 | 
					
						
							|  |  |  |         NULL,                               //No input parameters
 | 
					
						
							|  |  |  |         &outParam,                          //Output parameters
 | 
					
						
							| 
									
										
										
										
											2012-09-24 23:36:38 +00:00
										 |  |  |         12000.0,                            //Sample rate
 | 
					
						
							| 
									
										
										
										
											2012-05-22 17:09:48 +00:00
										 |  |  |         FRAMES_PER_BUFFER,                  //Frames per buffer
 | 
					
						
							|  |  |  |         paClipOff,                          //No clipping
 | 
					
						
							|  |  |  |         d2aCallback,                        //output callbeck routine
 | 
					
						
							|  |  |  |         &udata);                            //userdata
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   paerr=Pa_StartStream(outStream); | 
					
						
							|  |  |  |   if(paerr<0) { | 
					
						
							|  |  |  |     qDebug() << "Failed to start audio output stream."; | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   const PaStreamInfo* p=Pa_GetStreamInfo(outStream); | 
					
						
							|  |  |  |   outputLatency = p->outputLatency; | 
					
						
							|  |  |  |   bool qe = quitExecution; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //---------------------------------------------- Soundcard output loop
 | 
					
						
							|  |  |  |   while (!qe) { | 
					
						
							|  |  |  |     qe = quitExecution; | 
					
						
							|  |  |  |     if (qe) break; | 
					
						
							|  |  |  | //    udata.nwave=m_nwave;
 | 
					
						
							|  |  |  | //    if(m_txOK) udata.btxok=1;
 | 
					
						
							|  |  |  | //    if(!m_txOK) udata.btxok=0;
 | 
					
						
							|  |  |  |     msleep(100); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   Pa_StopStream(outStream); | 
					
						
							|  |  |  |   Pa_CloseStream(outStream); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SoundOutThread::setOutputDevice(int n)      //setOutputDevice()
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (isRunning()) return; | 
					
						
							|  |  |  |   this->m_nDevOut=n; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-09-24 19:11:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-26 00:48:49 +00:00
										 |  |  | void SoundOutThread::setPeriod(int ntrperiod, int nsps) | 
					
						
							| 
									
										
										
										
											2012-09-24 19:11:31 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-09-26 00:48:49 +00:00
										 |  |  |   m_TRperiod=ntrperiod; | 
					
						
							|  |  |  |   m_nsps=nsps; | 
					
						
							| 
									
										
										
										
											2012-09-24 19:11:31 +00:00
										 |  |  | } |