Use a rb for audio history

pull/2/head
Stelios Bounanos 2008-02-14 21:17:47 +00:00
rodzic 3248b76856
commit d8304ae601
1 zmienionych plików z 28 dodań i 29 usunięć

Wyświetl plik

@ -39,7 +39,7 @@
#include <FL/Fl.H>
#include "mbuffer.h"
#include "ringbuffer.h"
#include "qrunner.h"
using namespace std;
@ -67,15 +67,12 @@ modem *active_modem = 0;
cSound *scard;
int _trx_tune;
unsigned char ucdata[SCBLOCKSIZE * 4];
short int *sidata;
// Double size of normal read to accept overruns; double buffered because it
// is used asynchronously by the GUI thread.
mbuffer<double, SCBLOCKSIZE * 2, 2> _trx_scdbl;
#define HISTSIZE 1024 * SCBLOCKSIZE
double histbuff[HISTSIZE];
size_t numinbuff = 0;
// Ringbuffer for the audio "history". A pointer into this buffer
// is also passed to the waterfall signal drawing routines.
ringbuffer<double> trxrb(ceil2(1024 * SCBLOCKSIZE));
// Vector used for direct access to the ringbuffer
ringbuffer<double>::vector_type rbvec[2];
bool bHistory = false;
static int dummy = 0;
@ -87,7 +84,8 @@ static bool trxrunning = false;
void trx_trx_receive_loop()
{
int numread;
sidata = (short int *)ucdata;
assert(powerof2(SCBLOCKSIZE));
if (!scard) {
MilliSleep(10);
return;
@ -111,7 +109,10 @@ void trx_trx_receive_loop()
while (1) {
try {
numread = scard->Read(_trx_scdbl, SCBLOCKSIZE);
if (trxrb.write_space() == 0) // discard some old data
trxrb.read_advance(SCBLOCKSIZE);
trxrb.get_wv(rbvec);
numread = scard->Read(rbvec[0].buf, SCBLOCKSIZE);
}
catch (const SndException& e) {
scard->Close();
@ -121,26 +122,24 @@ void trx_trx_receive_loop()
}
if (numread == -1 || (trx_state != STATE_RX))
break;
if (numread > 0) {
if (bHistory) {
active_modem->set_afcOnOff(0);
active_modem->rx_process( histbuff, numinbuff );
active_modem->set_afcOnOff(1);
bHistory = false;
}
else if (numread == 0) // overflow
continue;
active_modem->rx_process(_trx_scdbl, numread);
trxrb.write_advance(SCBLOCKSIZE);
REQ(&waterfall::sig_data, wf, rbvec[0].buf, numread);
if (numinbuff + numread > HISTSIZE) {
memcpy( &histbuff[0], &histbuff[numread], (numinbuff - numread)*sizeof(double));
numinbuff -= numread;
}
for (int n = 0; n < numread; n++)
histbuff[numinbuff++] = _trx_scdbl[n];
REQ(&waterfall::sig_data, wf, _trx_scdbl.c_array(), numread);
_trx_scdbl.next(); // change buffers
if (!bHistory)
active_modem->rx_process(rbvec[0].buf, numread);
else {
bool afc = active_modem->get_afcOnOff();
active_modem->set_afcOnOff(0);
trxrb.get_rv(rbvec);
if (rbvec[0].len)
active_modem->rx_process(rbvec[0].buf, rbvec[0].len);
if (rbvec[1].len)
active_modem->rx_process(rbvec[1].buf, rbvec[1].len);
active_modem->set_afcOnOff(afc);
bHistory = false;
}
}
if (!scard->full_duplex())