6 #include <QStringBuilder>
7 #include <QStringLiteral>
19 using namespace swift::sound::sample_provider;
20 using namespace swift::config;
22 namespace swift::core::afv::audio
24 CCallsignSampleProvider::CCallsignSampleProvider(
const QAudioFormat &audioFormat,
26 :
ISampleProvider(parent), m_audioFormat(audioFormat), m_receiver(receiver),
27 m_decoder(audioFormat.sampleRate(), 1)
29 Q_ASSERT(audioFormat.channelCount() == 1);
33 this->setObjectName(on);
38 m_crackleSoundProvider->
setGain(0.0);
61 m_timer =
new QTimer(
this);
62 m_timer->setObjectName(this->objectName() +
":m_timer");
64 m_timer->setInterval(100);
65 connect(m_timer, &QTimer::timeout,
this, &CCallsignSampleProvider::timerElapsed);
70 const int noOfSamples = m_mixer->
readSamples(samples, count);
75 m_lastPacketLatch =
false;
88 void CCallsignSampleProvider::timerElapsed()
91 m_lastSamplesAddedUtc.msecsTo(QDateTime::currentDateTimeUtc()) > m_idleTimeoutMs)
101 m_aircraftType = aircraftType;
111 const int phaseDelayLength = (m_audioFormat.sampleRate() / 1000) * delayMs;
112 const QVector<float> phaseDelay(phaseDelayLength * 2, 0);
121 m_aircraftType = aircraftType;
136 m_distanceRatio = distanceRatio;
139 const QVector<qint16> audio = decodeOpus(audioDto.
audio);
140 m_audioInput->
addSamples(swift::sound::convertFromShortToFloat(audio));
143 m_lastSamplesAddedUtc = QDateTime::currentDateTimeUtc();
144 if (!m_timer->isActive()) { m_timer->start(); }
155 m_lastSamplesAddedUtc = QDateTime::currentDateTimeUtc();
156 if (!m_timer->isActive()) { m_timer->start(); }
159 void CCallsignSampleProvider::idle()
165 m_aircraftType.clear();
168 QVector<qint16> CCallsignSampleProvider::decodeOpus(
const QByteArray &opusData)
170 int decodedLength = 0;
171 const QVector<qint16> decoded = m_decoder.
decode(opusData, opusData.size(), &decodedLength);
175 void CCallsignSampleProvider::setEffects(
bool noEffects)
177 if (noEffects || m_bypassEffects || !m_inUse)
179 m_crackleSoundProvider->
setGain(0.0);
196 m_hfWhiteNoise->
setGain(m_hfWhiteNoiseGainMin);
197 m_acBusNoise->
setGain(m_acBusGainMin + 0.001f);
205 double crackleFactor = (((qExp(m_distanceRatio) * qPow(m_distanceRatio, -4.0)) / 350.0) - 0.00776652);
207 crackleFactor = std::clamp(crackleFactor, 0.0, 0.2);
209 m_crackleSoundProvider->
setGain(crackleFactor * 2);
210 m_whiteNoise->
setGain(m_whiteNoiseGainMin);
211 m_acBusNoise->
setGain(m_acBusGainMin);
221 m_bypassEffects = bypassEffects;
227 return QStringLiteral(
"In use: ") % boolToYesNo(m_inUse) % QStringLiteral(
" cs: ") % m_callsign %
228 QStringLiteral(
" type: ") % m_aircraftType;
const QString & callsign() const
The callsign.
void setBypassEffects(bool bypassEffects)
Bypass effects.
QString toQString() const
Info.
void addOpusSamples(const IAudioDto &audioDto, float distanceRatio)
Add samples.
int readSamples(QVector< float > &samples, qint64 count)
Read samples.
void active(const QString &callsign, const QString &aircraftType)
Is active?
void activeSilent(const QString &callsign, const QString &aircraftType)
Is active?
void addSilentSamples(const IAudioDto &audioDto)
Add samples.
uint getFrequencyHz() const
Get frequency in Hz.
void initialise(const QString &callsign)
Initialize.
static CallsignDelayCache & instance()
Singleton.
int get(const QString &callsign)
Callsign index.
void success(const QString &callsign)
Success.
void underflow(const QString &callsign)
Underflow.
Class for emitting a log message.
Derived & debug()
Set the severity to debug.
QVector< qint16 > decode(const QByteArray &opusData, int dataLength, int *decodedLength)
Decode.
void clearBuffer()
Clear the buffer.
int getBufferedBytes() const
Bytes from buffer.
void addSamples(const QVector< float > &samples)
Add samples.
void setBypassEffects(bool value)
Bypassing?
void setOutputGain(double outputGain)
Gain.
virtual int readSamples(QVector< float > &samples, qint64 count)
Read samples.
void addMixerInput(ISampleProvider *provider)
Add a provider.
void setGain(double gain)
Gain.
void setLooping(bool looping)
Looping.
void setGain(double gain)
Set the gain.
void setEnabled(bool enabled)
Enable.
void setMakeUpGain(double gain)
Set gain.
Sample provider interface.
static bool verbose()
Verbose logs?
Free functions in swift::misc.
QString classNameShort(const QObject *object)
Class name as from QMetaObject::className without namespace.
bool lastPacket
Used to indicate to receiver that the sender has stopped sending.
QByteArray audio
Opus compressed audio.