wfview/audiohandler.h

115 wiersze
2.4 KiB
C
Czysty Zwykły widok Historia

2021-02-11 19:18:35 +00:00
#ifndef AUDIOHANDLER_H
#define AUDIOHANDLER_H
#define USE_RTAUDIO
#define USE_QTAUDIO
2021-02-11 19:18:35 +00:00
#include <QObject>
#include <QtMultimedia/QAudioOutput>
#include <QMutexLocker>
#include <QByteArray>
#include <QtEndian>
#ifdef USE_QTAUDIO
2021-02-11 19:18:35 +00:00
#include <QAudioFormat>
#include <QAudioDeviceInfo>
#include <QAudioOutput>
#include <QAudioInput>
#include <QIODevice>
#endif
#ifdef USE_RTAUDIO
#include "rtaudio/RtAudio.h"
#endif
2021-02-11 19:18:35 +00:00
#include <QThread>
2021-02-12 20:42:56 +00:00
#include <QTimer>
#include <QTime>
2021-03-09 17:22:16 +00:00
#include "resampler/speex_resampler.h"
2021-02-11 19:18:35 +00:00
2021-02-11 19:18:35 +00:00
#include <QDebug>
//#define BUFFER_SIZE (32*1024)
2021-03-09 17:22:16 +00:00
#define INTERNAL_SAMPLE_RATE 48000
struct audioPacket {
2021-03-14 08:44:30 +00:00
quint32 seq;
QTime time;
quint16 sent;
2021-03-09 17:22:16 +00:00
QByteArray datain;
QByteArray dataout;
};
2021-02-11 19:18:35 +00:00
class audioHandler : public QIODevice
{
Q_OBJECT
2021-02-11 19:18:35 +00:00
public:
audioHandler(QObject* parent = 0);
~audioHandler();
void getLatency();
2021-02-11 19:18:35 +00:00
bool setDevice(QAudioDeviceInfo deviceInfo);
void start();
void flush();
void stop();
qint64 readData(char* data, qint64 maxlen);
qint64 writeData(const char* data, qint64 len);
qint64 bytesAvailable() const;
bool isSequential() const;
2021-02-13 11:04:26 +00:00
void getNextAudioChunk(QByteArray &data);
bool isChunkAvailable();
2021-02-11 19:18:35 +00:00
public slots:
2021-03-09 17:22:16 +00:00
bool init(const quint8 bits, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool isulaw, const bool isinput, QString port, quint8 resampleQuality);
void incomingAudio(const audioPacket data);
void changeLatency(const quint16 newSize);
2021-02-11 19:18:35 +00:00
private slots:
void notified();
void stateChanged(QAudio::State state);
void setVolume(unsigned char volume);
2021-02-11 19:18:35 +00:00
signals:
void audioMessage(QString message);
void sendLatency(quint16 newSize);
2021-02-11 19:18:35 +00:00
void haveAudioData(const QByteArray& data);
2021-02-12 20:42:56 +00:00
2021-02-11 19:18:35 +00:00
private:
void reinit();
QMutex mutex;
2021-02-12 12:58:37 +00:00
bool isInitialized;
QAudioOutput* audioOutput;
QAudioInput* audioInput;
2021-02-11 19:18:35 +00:00
bool isUlaw;
quint16 latency;
2021-02-11 19:18:35 +00:00
bool isInput; // Used to determine whether input or output audio
2021-02-27 12:52:21 +00:00
int chunkSize;
bool chunkAvailable;
2021-03-14 08:44:30 +00:00
quint32 lastSeq;
2021-02-11 19:18:35 +00:00
QAudioFormat format;
QAudioDeviceInfo deviceInfo;
2021-02-12 14:28:55 +00:00
quint16 radioSampleRate;
quint8 radioSampleBits;
2021-03-09 17:22:16 +00:00
quint8 radioChannels;
QVector<audioPacket> audioBuffer;
2021-03-09 17:22:16 +00:00
SpeexResamplerState* resampler;
unsigned int ratioNum;
unsigned int ratioDen;
2021-02-11 19:18:35 +00:00
};
#endif // AUDIOHANDLER_H