Skip to content

Commit 9ed2886

Browse files
committed
Add additional guarding around Codec2 FIFO calls.
1 parent 031da28 commit 9ed2886

File tree

7 files changed

+16
-68
lines changed

7 files changed

+16
-68
lines changed

src/pipeline/FreeDVReceiveStep.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ std::shared_ptr<short> FreeDVReceiveStep::execute(std::shared_ptr<short> inputSa
7373
COMP rx_fdm_offset[freedv_get_n_max_modem_samples(dv_)];
7474

7575
short* inputPtr = inputSamples.get();
76-
while (numInputSamples > 0)
76+
while (numInputSamples > 0 && inputPtr != nullptr)
7777
{
7878
codec2_fifo_write(inputSampleFifo_, inputPtr++, 1);
7979
numInputSamples--;

src/pipeline/FreeDVTransmitStep.cpp

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ std::shared_ptr<short> FreeDVTransmitStep::execute(std::shared_ptr<short> inputS
7171
*numOutputSamples = 0;
7272

7373
short* inputPtr = inputSamples.get();
74-
while (numInputSamples > 0)
74+
while (numInputSamples > 0 && inputPtr)
7575
{
7676
codec2_fifo_write(inputSampleFifo_, inputPtr++, 1);
7777
numInputSamples--;
@@ -116,60 +116,4 @@ std::shared_ptr<short> FreeDVTransmitStep::execute(std::shared_ptr<short> inputS
116116
}
117117

118118
return std::shared_ptr<short>(outputSamples, std::default_delete<short[]>());
119-
#if 0
120-
short* outputSamples = nullptr;
121-
122-
int mode = freedv_get_mode(dv_);
123-
int samplesUsedForFifo = freedv_get_n_speech_samples(dv_);
124-
int numTransmitRuns = (codec2_fifo_used(inputSampleFifo_) + numInputSamples) / samplesUsedForFifo;
125-
int nfreedv = freedv_get_n_nom_modem_samples(dv_);
126-
127-
if (numTransmitRuns)
128-
{
129-
*numOutputSamples = freedv_get_n_nom_modem_samples(dv_) * numTransmitRuns;
130-
outputSamples = new short[*numOutputSamples];
131-
assert(outputSamples != nullptr);
132-
133-
short codecInput[samplesUsedForFifo];
134-
short* tmpOutput = outputSamples;
135-
short* tmpInput = inputSamples.get();
136-
137-
while (numInputSamples > 0)
138-
{
139-
codec2_fifo_write(inputSampleFifo_, tmpInput++, 1);
140-
numInputSamples--;
141-
142-
if (codec2_fifo_used(inputSampleFifo_) >= samplesUsedForFifo)
143-
{
144-
codec2_fifo_read(inputSampleFifo_, codecInput, samplesUsedForFifo);
145-
146-
if (mode == FREEDV_MODE_800XA)
147-
{
148-
/* 800XA doesn't support complex output just yet */
149-
freedv_tx(dv_, tmpOutput, codecInput);
150-
}
151-
else
152-
{
153-
COMP tx_fdm[nfreedv];
154-
COMP tx_fdm_offset[nfreedv];
155-
156-
freedv_comptx(dv_, tx_fdm, codecInput);
157-
158-
freq_shift_coh(tx_fdm_offset, tx_fdm, getFreqOffsetFn_(), getOutputSampleRate(), &txFreqOffsetPhaseRectObj_, nfreedv);
159-
for(int i = 0; i<nfreedv; i++)
160-
tmpOutput[i] = tx_fdm_offset[i].real;
161-
}
162-
163-
tmpOutput += samplesUsedForFifo;
164-
}
165-
}
166-
}
167-
else
168-
{
169-
codec2_fifo_write(inputSampleFifo_, inputSamples.get(), numInputSamples);
170-
*numOutputSamples = 0;
171-
}
172-
173-
return std::shared_ptr<short>(outputSamples, std::default_delete<short[]>());
174-
#endif
175119
}

src/pipeline/LinkStep.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,10 @@ void LinkStep::clearFifo()
5353
std::shared_ptr<short> LinkStep::InputStep::execute(std::shared_ptr<short> inputSamples, int numInputSamples, int* numOutputSamples)
5454
{
5555
auto fifo = parent_->getFifo();
56-
if (numInputSamples > 0)
56+
auto samplePtr = inputSamples.get();
57+
if (numInputSamples > 0 && samplePtr != nullptr)
5758
{
58-
codec2_fifo_write(fifo, inputSamples.get(), numInputSamples);
59+
codec2_fifo_write(fifo, samplePtr, numInputSamples);
5960
}
6061

6162
// Since we short circuited to the output step, don't return any samples here.

src/pipeline/RADEReceiveStep.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ std::shared_ptr<short> RADEReceiveStep::execute(std::shared_ptr<short> inputSamp
7373
float features_out[rade_n_features_in_out(dv_)];
7474

7575
short* inputPtr = inputSamples.get();
76-
while (numInputSamples > 0)
76+
while (numInputSamples > 0 && inputPtr != nullptr)
7777
{
7878
codec2_fifo_write(inputSampleFifo_, inputPtr++, 1);
7979
numInputSamples--;

src/pipeline/RADETransmitStep.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ std::shared_ptr<short> RADETransmitStep::execute(std::shared_ptr<short> inputSam
6767
*numOutputSamples = 0;
6868

6969
short* inputPtr = inputSamples.get();
70-
while (numInputSamples > 0)
70+
while (numInputSamples > 0 && inputPtr != nullptr)
7171
{
7272
codec2_fifo_write(inputSampleFifo_, inputPtr++, 1);
7373
numInputSamples--;

src/pipeline/SpeexStep.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ int SpeexStep::getOutputSampleRate() const
6262
std::shared_ptr<short> SpeexStep::execute(std::shared_ptr<short> inputSamples, int numInputSamples, int* numOutputSamples)
6363
{
6464
short* outputSamples = nullptr;
65+
*numOutputSamples = 0;
6566

6667
int numSpeexRuns = (codec2_fifo_used(inputSampleFifo_) + numInputSamples) / numSamplesPerSpeexRun_;
6768
if (numSpeexRuns > 0)
@@ -73,7 +74,7 @@ std::shared_ptr<short> SpeexStep::execute(std::shared_ptr<short> inputSamples, i
7374
short* tmpOutput = outputSamples;
7475
short* tmpInput = inputSamples.get();
7576

76-
while (numInputSamples > 0)
77+
while (numInputSamples > 0 && tmpInput != nullptr)
7778
{
7879
codec2_fifo_write(inputSampleFifo_, tmpInput++, 1);
7980
numInputSamples--;
@@ -86,10 +87,9 @@ std::shared_ptr<short> SpeexStep::execute(std::shared_ptr<short> inputSamples, i
8687
}
8788
}
8889
}
89-
else
90+
else if (numInputSamples > 0 && inputSamples.get() != nullptr)
9091
{
9192
codec2_fifo_write(inputSampleFifo_, inputSamples.get(), numInputSamples);
92-
*numOutputSamples = 0;
9393
}
9494

9595
return std::shared_ptr<short>(outputSamples, std::default_delete<short[]>());

src/pipeline/TxRxThread.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,7 @@ void TxRxThread::txProcessing_()
646646
do
647647
{
648648
auto outputSamples = pipeline_->execute(inputSamplesPtr, 0, &nout);
649-
if (nout > 0)
649+
if (nout > 0 && outputSamples.get() != nullptr)
650650
{
651651
codec2_fifo_write(cbData->outfifo1, outputSamples.get(), nout);
652652
}
@@ -665,7 +665,10 @@ void TxRxThread::txProcessing_()
665665
fprintf(stderr, " nout: %d\n", nout);
666666
}
667667

668-
codec2_fifo_write(cbData->outfifo1, outputSamples.get(), nout);
668+
if (outputSamples.get() != nullptr)
669+
{
670+
codec2_fifo_write(cbData->outfifo1, outputSamples.get(), nout);
671+
}
669672
}
670673

671674
txModeChangeMutex.Unlock();
@@ -734,7 +737,7 @@ void TxRxThread::rxProcessing_()
734737
auto outputSamples = pipeline_->execute(inputSamplesPtr, nsam, &nout);
735738
auto outFifo = (g_nSoundCards == 1) ? cbData->outfifo1 : cbData->outfifo2;
736739

737-
if (nout > 0)
740+
if (nout > 0 && outputSamples.get() != nullptr)
738741
{
739742
codec2_fifo_write(outFifo, outputSamples.get(), nout);
740743
}

0 commit comments

Comments
 (0)