Transceiver52M: Add multi channel transceiver support

This patch primarily addresses devices with multiple RF front end
support. Currently device support is limited to UmTRX.

Vectorize transceiver variables to allow multiple asynchronous
threads on the upper layer with single downlink and uplink threads
driving the UHD I/O interface synchronously.

Signed-off-by: Thomas Tsou <tom@tsou.cc>
diff --git a/Transceiver52M/radioInterfaceResamp.cpp b/Transceiver52M/radioInterfaceResamp.cpp
index 6c3839a..95ed16d 100644
--- a/Transceiver52M/radioInterfaceResamp.cpp
+++ b/Transceiver52M/radioInterfaceResamp.cpp
@@ -55,14 +55,11 @@
 static int resamp_outrate = 0;
 static int resamp_outchunk = 0;
 
-short *convertRecvBuffer = NULL;
-short *convertSendBuffer = NULL;
-
 RadioInterfaceResamp::RadioInterfaceResamp(RadioDevice *wRadio,
 					   int wReceiveOffset,
-					   int wSPS,
+					   size_t sps, size_t chan,
 					   GSM::Time wStartTime)
-	: RadioInterface(wRadio, wReceiveOffset, wSPS, wStartTime),
+	: RadioInterface(wRadio, wReceiveOffset, sps, chan, wStartTime),
 	  innerSendBuffer(NULL), outerSendBuffer(NULL),
 	  innerRecvBuffer(NULL), outerRecvBuffer(NULL)
 {
@@ -87,12 +84,15 @@
 	outerSendBuffer = NULL;
 	innerRecvBuffer = NULL;
 	outerRecvBuffer = NULL;
-	sendBuffer = NULL;
-	recvBuffer = NULL;
 
 	upsampler = NULL;
 	dnsampler = NULL;
 
+	if (sendBuffer.size())
+		sendBuffer[0] = NULL;
+	if (recvBuffer.size())
+		recvBuffer[0] = NULL;
+
 	RadioInterface::close();
 }
 
@@ -101,8 +101,19 @@
 {
 	float cutoff = 1.0f;
 
+	if (mChans != 1) {
+		LOG(ALERT) << "Unsupported channel configuration " << mChans;
+		return false;
+	}
+
 	close();
 
+	sendBuffer.resize(1);
+	recvBuffer.resize(1);
+	convertSendBuffer.resize(1);
+	convertRecvBuffer.resize(1);
+	mReceiveFIFO.resize(1);
+
 	switch (type) {
 	case RadioDevice::RESAMP_64M:
 		resamp_inrate = RESAMP_64M_INRATE;
@@ -156,11 +167,11 @@
 	innerRecvBuffer =
 		new signalVector(NUMCHUNKS * resamp_inchunk / mSPSTx);
 
-	convertSendBuffer = new short[outerSendBuffer->size() * 2];
-	convertRecvBuffer = new short[outerRecvBuffer->size() * 2];
+	convertSendBuffer[0] = new short[outerSendBuffer->size() * 2];
+	convertRecvBuffer[0] = new short[outerRecvBuffer->size() * 2];
 
-	sendBuffer = innerSendBuffer;
-	recvBuffer = innerRecvBuffer;
+	sendBuffer[0] = innerSendBuffer;
+	recvBuffer[0] = innerRecvBuffer;
 
 	return true;
 }
@@ -186,7 +197,7 @@
 	}
 
 	convert_short_float((float *) outerRecvBuffer->begin(),
-			    convertRecvBuffer, 2 * resamp_outchunk);
+			    convertRecvBuffer[0], 2 * resamp_outchunk);
 
 	underrun |= local_underrun;
 	readTimestamp += (TIMESTAMP) resamp_outchunk;
@@ -227,7 +238,7 @@
 		LOG(ALERT) << "Sample rate downsampling error";
 	}
 
-	convert_float_short(convertSendBuffer,
+	convert_float_short(convertSendBuffer[0],
 			    (float *) outerSendBuffer->begin(),
 			    powerScaling, 2 * outer_len);