wfview/audiohandler.h

157 wiersze
3.4 KiB
C
Czysty Zwykły widok Historia

2021-02-11 19:18:35 +00:00
#ifndef AUDIOHANDLER_H
#define AUDIOHANDLER_H
2022-04-05 15:47:43 +00:00
/* QT Headers */
2021-02-11 19:18:35 +00:00
#include <QObject>
#include <QByteArray>
2021-05-24 08:27:18 +00:00
#include <QMutex>
2021-05-27 12:54:52 +00:00
#include <QtEndian>
#include <QtMath>
2022-04-05 15:47:43 +00:00
#include <QThread>
#include <QTime>
#include <QMap>
#include <QDebug>
2022-05-02 12:08:42 +00:00
#include <QTimer>
2021-06-04 07:24:26 +00:00
2022-04-05 15:47:43 +00:00
/* QT Audio Headers */
2021-06-04 07:24:26 +00:00
#include <QAudioOutput>
#include <QAudioFormat>
#include <QAudioDeviceInfo>
#include <QAudioInput>
#include <QIODevice>
2022-01-29 22:50:58 +00:00
2022-04-05 15:47:43 +00:00
/* Current resampler code */
#include "resampler/speex_resampler.h"
2022-03-23 17:27:47 +00:00
2022-04-05 15:47:43 +00:00
/* Potential new resampler */
//#include <r8bbase.h>
//#include <CDSPResampler.h>
2021-07-29 15:18:59 +00:00
2022-04-05 15:47:43 +00:00
/* Opus */
2021-06-16 08:52:47 +00:00
#ifdef Q_OS_WIN
2021-06-16 08:49:38 +00:00
#include "opus.h"
2021-06-16 08:52:47 +00:00
#else
#include "opus/opus.h"
#endif
2022-04-05 15:47:43 +00:00
/* Eigen */
2022-04-08 11:12:31 +00:00
#ifndef Q_OS_WIN
2022-04-03 23:23:23 +00:00
#include <eigen3/Eigen/Eigen>
#else
2022-04-03 19:16:52 +00:00
#include <Eigen/Eigen>
2022-04-03 23:23:23 +00:00
#endif
2022-04-03 19:16:52 +00:00
2022-04-05 15:47:43 +00:00
/* wfview Packet types */
#include "packettypes.h"
2021-02-11 19:18:35 +00:00
2022-04-05 15:47:43 +00:00
/* Logarithmic taper for volume control */
#include "audiotaper.h"
2021-05-16 20:16:59 +00:00
#define MULAW_BIAS 33
#define MULAW_MAX 0x1fff
struct audioPacket {
2021-03-14 08:44:30 +00:00
quint32 seq;
QTime time;
quint16 sent;
QByteArray data;
2022-01-29 22:50:58 +00:00
quint8 guid[GUIDLEN];
};
2021-06-04 07:24:26 +00:00
struct audioSetup {
QString name;
quint16 latency;
quint8 codec;
2022-04-03 19:16:52 +00:00
bool ulaw = false;
2021-06-04 07:24:26 +00:00
bool isinput;
2022-04-03 19:16:52 +00:00
QAudioFormat format; // Use this for all audio APIs
2021-06-04 07:24:26 +00:00
QAudioDeviceInfo port;
quint8 resampleQuality;
unsigned char localAFgain;
2022-04-10 22:13:51 +00:00
quint16 blockSize=20; // Each 'block' of audio is 20ms long by default.
quint8 guid[GUIDLEN];
2021-06-04 07:24:26 +00:00
};
// For QtMultimedia, use a native QIODevice
2021-05-23 15:09:41 +00:00
class audioHandler : public QObject
2021-02-11 19:18:35 +00:00
{
Q_OBJECT
public:
audioHandler(QObject* parent = 0);
~audioHandler();
2021-05-27 17:34:44 +00:00
int getLatency();
2021-02-11 19:18:35 +00:00
2021-06-04 07:24:26 +00:00
void start();
void stop();
quint16 getAmplitude();
2021-05-23 15:09:41 +00:00
2021-06-04 07:24:26 +00:00
public slots:
bool init(audioSetup setup);
void changeLatency(const quint16 newSize);
void setVolume(unsigned char volume);
2021-05-27 17:34:44 +00:00
void incomingAudio(const audioPacket data);
2021-02-11 19:18:35 +00:00
2021-06-04 07:24:26 +00:00
private slots:
void stateChanged(QAudio::State state);
2022-04-10 22:13:51 +00:00
void clearUnderrun();
void getNextAudioChunk();
2021-06-04 07:24:26 +00:00
2021-02-11 19:18:35 +00:00
signals:
void audioMessage(QString message);
void sendLatency(quint16 newSize);
2022-04-10 22:13:51 +00:00
void haveAudioData(const audioPacket& data);
void haveLevels(quint16 amplitude,quint16 latency,quint16 current,bool under);
2021-02-11 19:18:35 +00:00
private:
2021-06-04 07:24:26 +00:00
bool isUnderrun = false;
bool isInitialized=false;
2021-07-06 09:04:35 +00:00
bool isReady = false;
bool audioBuffered = false;
2021-06-04 07:24:26 +00:00
QAudioOutput* audioOutput=Q_NULLPTR;
QAudioInput* audioInput=Q_NULLPTR;
2022-04-03 19:16:52 +00:00
QIODevice* audioDevice=Q_NULLPTR;
2021-06-04 07:24:26 +00:00
QAudioFormat format;
QAudioDeviceInfo deviceInfo;
2021-05-23 15:09:41 +00:00
SpeexResamplerState* resampler = Q_NULLPTR;
2022-05-02 10:56:40 +00:00
QTime lastReceived;
2022-04-03 19:16:52 +00:00
//r8b::CFixedBuffer<double>* resampBufs;
//r8b::CPtrKeeper<r8b::CDSPResampler24*>* resamps;
2021-05-16 20:16:59 +00:00
quint16 audioLatency;
2021-06-04 07:24:26 +00:00
quint32 lastSeq;
2021-06-17 08:55:09 +00:00
quint32 lastSentSeq=0;
2022-04-03 19:16:52 +00:00
qint64 elapsedMs = 0;
2021-06-17 08:55:09 +00:00
int delayedPackets=0;
2021-11-07 13:27:52 +00:00
double resampleRatio;
volatile bool ready = false;
audioPacket tempBuf;
quint16 currentLatency;
2022-04-03 19:16:52 +00:00
float amplitude;
qreal volume=1.0;
2022-04-05 15:47:43 +00:00
2021-06-04 07:24:26 +00:00
audioSetup setup;
2022-04-05 15:47:43 +00:00
2021-06-16 08:49:38 +00:00
OpusEncoder* encoder=Q_NULLPTR;
OpusDecoder* decoder=Q_NULLPTR;
2022-04-06 21:02:43 +00:00
QTimer* underTimer;
2021-02-11 19:18:35 +00:00
};
2022-04-03 19:16:52 +00:00
// Various audio handling functions declared inline
typedef Eigen::Matrix<quint8, Eigen::Dynamic, 1> VectorXuint8;
typedef Eigen::Matrix<qint8, Eigen::Dynamic, 1> VectorXint8;
typedef Eigen::Matrix<qint16, Eigen::Dynamic, 1> VectorXint16;
typedef Eigen::Matrix<qint32, Eigen::Dynamic, 1> VectorXint32;
2021-02-11 19:18:35 +00:00
#endif // AUDIOHANDLER_H