Add additional checking to attempt to debug memory trashing.

pull/219/head
Mooneer Salem 2022-03-22 01:31:36 -07:00
parent 1b950eb126
commit d421d7e8f7
5 changed files with 64 additions and 34 deletions

View File

@ -48,20 +48,29 @@ int FreeDVTransmitStep::getOutputSampleRate() const
std::shared_ptr<short> FreeDVTransmitStep::execute(std::shared_ptr<short> inputSamples, int numInputSamples, int* numOutputSamples)
{
auto mode = interface_.getTxMode();
*numOutputSamples = interface_.getTxNNomModemSamples();
short* outputSamples = new short[*numOutputSamples];
assert(outputSamples != nullptr);
if (mode == FREEDV_MODE_800XA || mode == FREEDV_MODE_2400B)
short* outputSamples = nullptr;
if (numInputSamples > 0)
{
/* 800XA doesn't support complex output just yet */
interface_.transmit(outputSamples, inputSamples.get());
auto mode = interface_.getTxMode();
*numOutputSamples = interface_.getTxNNomModemSamples();
outputSamples = new short[*numOutputSamples];
assert(outputSamples != nullptr);
if (mode == FREEDV_MODE_800XA || mode == FREEDV_MODE_2400B)
{
/* 800XA doesn't support complex output just yet */
interface_.transmit(outputSamples, inputSamples.get());
}
else
{
interface_.complexTransmit(outputSamples, inputSamples.get(), getFreqOffsetFn_(), *numOutputSamples);
}
}
else
else
{
interface_.complexTransmit(outputSamples, inputSamples.get(), getFreqOffsetFn_(), *numOutputSamples);
*numOutputSamples = 0;
}
return std::shared_ptr<short>(outputSamples, std::default_delete<short[]>());

View File

@ -21,6 +21,7 @@
//=========================================================================
#include "PlaybackStep.h"
#include <cassert>
PlaybackStep::PlaybackStep(
int inputSampleRate, std::function<int()> fileSampleRateFn,
@ -51,14 +52,19 @@ int PlaybackStep::getOutputSampleRate() const
std::shared_ptr<short> PlaybackStep::execute(std::shared_ptr<short> inputSamples, int numInputSamples, int* numOutputSamples)
{
auto playFile = getSndFileFn_();
assert(playFile != nullptr);
unsigned int nsf = numInputSamples * getOutputSampleRate()/getInputSampleRate();
assert(nsf > 0);
short* outputSamples = new short[nsf];
assert(outputSamples != nullptr);
*numOutputSamples = sf_read_short(playFile, outputSamples, nsf);
if (*numOutputSamples == 0)
if ((unsigned)*numOutputSamples < nsf)
{
fileCompleteFn_();
}
return std::shared_ptr<short>(outputSamples, std::default_delete<short[]>());
}
}

View File

@ -62,13 +62,24 @@ int ResampleStep::getOutputSampleRate() const
std::shared_ptr<short> ResampleStep::execute(std::shared_ptr<short> inputSamples, int numInputSamples, int* numOutputSamples)
{
double scaleFactor = ((double)outputSampleRate_)/((double)inputSampleRate_);
int outputArraySize = std::max(numInputSamples, (int)(scaleFactor*numInputSamples));
short* outputSamples = new short[outputArraySize];
*numOutputSamples = resample(
resampleState_, outputSamples, inputSamples.get(), outputSampleRate_,
inputSampleRate_, outputArraySize, numInputSamples);
short* outputSamples = nullptr;
if (numInputSamples > 0)
{
double scaleFactor = ((double)outputSampleRate_)/((double)inputSampleRate_);
int outputArraySize = std::max(numInputSamples, (int)(scaleFactor*numInputSamples));
assert(outputArraySize > 0);
outputSamples = new short[outputArraySize];
assert(outputSamples != nullptr);
*numOutputSamples = resample(
resampleState_, outputSamples, inputSamples.get(), outputSampleRate_,
inputSampleRate_, outputArraySize, numInputSamples);
}
else
{
*numOutputSamples = 0;
}
return std::shared_ptr<short>(outputSamples, std::default_delete<short[]>());
}

View File

@ -53,18 +53,22 @@ int SpeexStep::getOutputSampleRate() const
std::shared_ptr<short> SpeexStep::execute(std::shared_ptr<short> inputSamples, int numInputSamples, int* numOutputSamples)
{
short* outputSamples = new short[numInputSamples];
assert(outputSamples != nullptr);
memcpy(outputSamples, inputSamples.get(), sizeof(short)*numInputSamples);
g_mutexProtectingCallbackData.Lock();
if (*speexStateObj_)
short* outputSamples = nullptr;
if (numInputSamples > 0)
{
speex_preprocess_run(*speexStateObj_, outputSamples);
}
g_mutexProtectingCallbackData.Unlock();
outputSamples = new short[numInputSamples];
assert(outputSamples != nullptr);
memcpy(outputSamples, inputSamples.get(), sizeof(short)*numInputSamples);
g_mutexProtectingCallbackData.Lock();
if (*speexStateObj_)
{
speex_preprocess_run(*speexStateObj_, outputSamples);
}
g_mutexProtectingCallbackData.Unlock();
}
*numOutputSamples = numInputSamples;
return std::shared_ptr<short>(outputSamples, std::default_delete<short[]>());
}
}

View File

@ -53,17 +53,17 @@ static wxWindow* createMyExtraPlayFilePanel(wxWindow *parent)
void MainFrame::StopPlayFileToMicIn(void)
{
g_mutexProtectingCallbackData.Lock();
if (g_playFileToMicIn)
{
g_mutexProtectingCallbackData.Lock();
g_playFileToMicIn = false;
sf_close(g_sfPlayFile);
g_sfPlayFile = nullptr;
SetStatusText(wxT(""));
m_menuItemPlayFileToMicIn->SetItemLabel(wxString(_("Start Play File - Mic In...")));
g_mutexProtectingCallbackData.Unlock();
VoiceKeyerProcessEvent(VK_PLAY_FINISHED);
}
g_mutexProtectingCallbackData.Unlock();
}
//-------------------------------------------------------------------------