wfview/rxaudiohandler.cpp
roeland jansen 0e0480b0ed Added support for various spectrum sizes and rig capability support.
wfview has been tested with the following Icom radios over USB port:
IC-7300, IC-7610, IC-7851 (and IC-7850), and IC-9700. It likely works
fine with the IC-705 as well. At this time, the rig's CIV address must
be changed in the preference file to indicate the rig you are using, and
this must be in integer, not hex.
2021-02-10 17:32:56 +00:00

104 lines
3.6 KiB
C++

#include "rxaudiohandler.h"
rxAudioHandler::rxAudioHandler()
{
}
rxAudioHandler::~rxAudioHandler()
{
audio->stop();
delete audio;
}
void rxAudioHandler::process()
{
qDebug() << "rxAudio Handler created.";
}
void rxAudioHandler::setup(const QAudioFormat format, const quint16 bufferSize, const bool isUlaw)
{
this->format = format;
this->bufferSize = bufferSize;
this->isUlaw = isUlaw;
audio = new QAudioOutput(format);
audio->setBufferSize(bufferSize);
device = audio->start();
}
void rxAudioHandler::incomingAudio(const QByteArray data)
{
QMutexLocker locker(&mutex);
if (isUlaw) {
device->write(uLawDecode(data));
}
else {
device->write(data, data.length());
}
}
void rxAudioHandler::changeBufferSize(const quint16 newSize)
{
QMutexLocker locker(&mutex);
qDebug() << "Changing buffer size to: " << newSize << " from " << audio->bufferSize();
audio->stop();
audio->setBufferSize(newSize);
device = audio->start();
}
void rxAudioHandler::getBufferSize()
{
emit sendBufferSize(audio->bufferSize());
}
QByteArray rxAudioHandler::uLawDecode(const QByteArray in)
{
static const qint16 ulaw_decode[256] = {
-32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,
-23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,
-15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,
-11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,
-7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,
-5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,
-3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,
-2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,
-1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,
-1372, -1308, -1244, -1180, -1116, -1052, -988, -924,
-876, -844, -812, -780, -748, -716, -684, -652,
-620, -588, -556, -524, -492, -460, -428, -396,
-372, -356, -340, -324, -308, -292, -276, -260,
-244, -228, -212, -196, -180, -164, -148, -132,
-120, -112, -104, -96, -88, -80, -72, -64,
-56, -48, -40, -32, -24, -16, -8, 0,
32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,
23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,
15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,
11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,
7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,
5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,
3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,
2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,
1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,
1372, 1308, 1244, 1180, 1116, 1052, 988, 924,
876, 844, 812, 780, 748, 716, 684, 652,
620, 588, 556, 524, 492, 460, 428, 396,
372, 356, 340, 324, 308, 292, 276, 260,
244, 228, 212, 196, 180, 164, 148, 132,
120, 112, 104, 96, 88, 80, 72, 64,
56, 48, 40, 32, 24, 16, 8, 0 };
QByteArray out;
foreach(qint8 const temp, in)
{
qint16 decoded = ulaw_decode[0];
if (temp != 0) {
decoded = ulaw_decode[static_cast<quint8>(temp)];
}
out.append(static_cast<qint8>(decoded & 0xff));
out.append(static_cast<qint8>(decoded >> 8 & 0xff));
}
return out;
}