aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/radioInterfaceResamp.cpp
diff options
context:
space:
mode:
authorThomas Tsou <tom@tsou.cc>2013-10-29 18:34:16 -0400
committerThomas Tsou <tom@tsou.cc>2013-11-15 14:45:20 -0500
commit204a9f135ac2408dd62b55462ebe4b2d10be4f56 (patch)
tree80de459f10c23a103bf80172ba762f2577da0859 /Transceiver52M/radioInterfaceResamp.cpp
parent0169b310de2789cbe2ec9a447caae494fbea13d0 (diff)
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>
Diffstat (limited to 'Transceiver52M/radioInterfaceResamp.cpp')
-rw-r--r--Transceiver52M/radioInterfaceResamp.cpp37
1 files changed, 24 insertions, 13 deletions
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_inchunk = 0;
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 @@ void RadioInterfaceResamp::close()
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 @@ bool RadioInterfaceResamp::init(int type)
{
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 @@ bool RadioInterfaceResamp::init(int type)
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 @@ void RadioInterfaceResamp::pullBuffer()
}
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 @@ void RadioInterfaceResamp::pushBuffer()
LOG(ALERT) << "Sample rate downsampling error";
}
- convert_float_short(convertSendBuffer,
+ convert_float_short(convertSendBuffer[0],
(float *) outerSendBuffer->begin(),
powerScaling, 2 * outer_len);