9 using namespace swift::config;
11 using namespace swift::sound::sample_provider;
13 namespace swift::core::afv::audio
15 CSoundcardSampleProvider::CSoundcardSampleProvider(
int sampleRate,
const QVector<quint16> &transceiverIDs,
19 const QString on = QStringLiteral(
"%1 sample rate: %2, transceivers: %3")
22 .
arg(transceiverIDs.size());
25 m_waveFormat.setSampleRate(sampleRate);
26 m_waveFormat.setChannelCount(1);
27 m_waveFormat.setSampleFormat(QAudioFormat::Int16);
28 static_assert(Q_BYTE_ORDER == Q_LITTLE_ENDIAN);
31 m_receiverIDs = transceiverIDs;
33 constexpr
int voiceInputNumber = 4;
34 for (quint16 transceiverID : transceiverIDs)
39 m_receiverInputs.push_back(transceiverInput);
40 m_receiverIDs.push_back(transceiverID);
49 receiverInput->setBypassEffects(value);
61 txTransceiversFiltered.
erase(
62 std::remove_if(txTransceiversFiltered.
begin(), txTransceiversFiltered.
end(),
63 [
this](
const TxTransceiverDto &d) { return !m_receiverIDs.contains(d.id); }),
64 txTransceiversFiltered.
end());
68 auto it = std::find_if(
69 m_receiverInputs.begin(), m_receiverInputs.end(),
72 if (it != m_receiverInputs.end()) { (*it)->setMute(
true); }
80 receiverInput->setMute(
false);
95 rxTransceiversFilteredAndSorted.
erase(
96 std::remove_if(rxTransceiversFilteredAndSorted.
begin(), rxTransceiversFilteredAndSorted.
end(),
97 [
this](
const RxTransceiverDto &r) { return !m_receiverIDs.contains(r.id); }),
98 rxTransceiversFilteredAndSorted.
end());
100 std::sort(rxTransceiversFilteredAndSorted.
begin(), rxTransceiversFilteredAndSorted.
end(),
102 return a.distanceRatio > b.distanceRatio;
105 if (!rxTransceiversFilteredAndSorted.
isEmpty())
107 bool audioPlayed =
false;
109 for (
const auto rxTransceiver : rxTransceiversFilteredAndSorted)
111 if (!handledTransceiverIDs.contains(rxTransceiver.id))
113 handledTransceiverIDs.push_back(rxTransceiver.id);
116 auto it = std::find_if(
117 m_receiverInputs.begin(), m_receiverInputs.end(),
120 if (it != m_receiverInputs.end()) { receiverInput = *it; }
122 if (!receiverInput) {
continue; }
123 if (receiverInput->
getMute()) {
continue; }
127 receiverInput->
addOpusSamples(audioDto, rxTransceiver.frequency, rxTransceiver.distanceRatio);
132 receiverInput->
addSilentSamples(audioDto, rxTransceiver.frequency, rxTransceiver.distanceRatio);
136 if (CBuildConfig::isLocalDeveloperDebugBuild())
138 receiverInput->logVoiceInputs(QStringLiteral(
"Transceiver %1 ").arg(rxTransceiver.id), 1500);
149 auto it = std::find_if(
150 m_receiverInputs.begin(), m_receiverInputs.end(),
153 if (it != m_receiverInputs.end()) { (*it)->setFrequency(radioTransceiver.frequencyHz); }
158 const quint16 transceiverID = receiverInput->getId();
159 const bool contains = std::any_of(radioTransceivers.
cbegin(), radioTransceivers.
cend(),
160 [transceiverID](
const auto &tx) { return transceiverID == tx.id; });
161 if (!contains) { receiverInput->setFrequency(0); }
167 return m_receiverInputs.at(transceiverID)->getReceivingCallsignsString();
172 auto receiverInput = std::find_if(m_receiverInputs.begin(), m_receiverInputs.end(),
173 [&](
const auto receiver) { return receiver->getId() == transceiverID; });
174 if (receiverInput == m_receiverInputs.end()) {
return false; }
175 return (*receiverInput)->setGainRatio(gainRatio);
180 return m_receiverInputs.at(transceiverID)->getReceivingCallsigns();
void addSilentSamples(const IAudioDto &audioDto, uint frequency, float distanceRatio)
Add samples.
void receivingCallsignsChanged(const TransceiverReceivingCallsignsChangedArgs &args)
Receving callsigns have changed.
bool getMute() const
Mute.
void addOpusSamples(const IAudioDto &audioDto, uint frequency, float distanceRatio)
Add samples.
int readSamples(QVector< float > &samples, qint64 count)
Read samples.
bool setGainRatioForTransceiver(quint16 transceiverID, double gainRatio)
Setting gain for specified receiver.
void setBypassEffects(bool value)
Bypass effects.
swift::misc::aviation::CCallsignSet getReceivingCallsigns(quint16 transceiverID) const
Receiving callsign as single string.
void receivingCallsignsChanged(const TransceiverReceivingCallsignsChangedArgs &args)
Changed callsigns.
void updateRadioTransceivers(const QVector< TransceiverDto > &radioTransceivers)
Update all tranceivers.
QString getReceivingCallsignsString(quint16 transceiverID) const
Receiving callsign as single string.
void pttUpdate(bool active, const QVector< TxTransceiverDto > &txTransceivers)
Update PTT.
void addOpusSamples(const IAudioDto &audioDto, const QVector< RxTransceiverDto > &rxTransceivers)
Add OPUS samples.
Value object for a set of callsigns.
int readSamples(QVector< float > &samples, qint64 count)
Read samples.
void addMixerInput(ISampleProvider *provider)
Add a provider.
Sample provider interface.
Free functions in swift::misc.
QString classNameShort(const QObject *object)
Class name as from QMetaObject::className without namespace.
QList< T >::iterator begin()
QList< T >::const_iterator cbegin() const const
QList< T >::const_iterator cend() const const
QList< T >::iterator end()
QList< T >::iterator erase(QList< T >::const_iterator begin, QList< T >::const_iterator end)
bool isEmpty() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void setObjectName(QAnyStringView name)
QString arg(Args &&... args) const const
Transmit transceiver DTO.