// FIRTransformer.cpp: implementation of the FIRTransformer class. // ////////////////////////////////////////////////////////////////////// #include "AudioSample.h" #include "AudioSampleManager.h" #include "DSP/FIRFilter.h" #include "FIRTransformer.h" using namespace std; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// FIRTransformer::FIRTransformer() { char subFacilityName[100]; sprintf(subFacilityName, "FIRTransformer:%x", this); tracer.SetSubFacilityName(subFacilityName); SetTraceLevel(); firFilter = NULL; } FIRTransformer::~FIRTransformer() { if (firFilter) { switch(this->sampleSize) { case 8: delete (FIRFilter*)firFilter; break; case 16: delete (FIRFilter*)firFilter; break; case 32: delete (FIRFilter*)firFilter; break; default: break; } firFilter = NULL; } } int FIRTransformer::SetTraceLevel() { long SystemMask = 0; if ((SystemMask = GetRegKeyLong(HKEY_CURRENT_USER, "Software\\Cisco Systems\\MTC\\Tracing", "AllComponents", 0x0)) == 0) { SystemMask = GetRegKeyLong(HKEY_CURRENT_USER, "Software\\Cisco Systems\\MTC\\Tracing", "FIRTransformer", 0x100000); } tracer.SetSystemMask(SystemMask); return 0; } int FIRTransformer::SetCoefficients(double *coeffs, int numCoeffs, int sampleSize) { int result = 0; if (firFilter) { switch(this->sampleSize) { case 8: delete (FIRFilter*)firFilter; break; case 16: delete (FIRFilter*)firFilter; break; case 32: delete (FIRFilter*)firFilter; break; default: break; } firFilter = NULL; } switch(sampleSize) { case 8: firFilter = new FIRFilter(coeffs, numCoeffs); break; case 16: firFilter = new FIRFilter(coeffs, numCoeffs); break; case 32: firFilter = new FIRFilter(coeffs, numCoeffs); break; default: result = -10; break; } this->sampleSize = sampleSize; return 0; } int FIRTransformer::TransformAudioSamples(std::vector > &data, AudioSample **ppAudioSample) { tracer.tracef(DET, "TransformAudioSamples\n"); AudioSample *inSample = NULL; if (data.size() > 0) { inSample = data[0].first; } AudioSample *outSample; int result = 0; if (!inSample) { outSample = NULL; } else { tracer.tracef(DET, "TransformAudioSamples : inSample : minFrameDuration %d, dataSize %d, silenceDuration %d\n", inSample->MinFrameDuration(), inSample->DataSize(), inSample->GetSilenceDuration()); if (inSample->DataSize() <= 0) { inSample->AddRef(this); (*ppAudioSample) = inSample; } else { result = AudioSampleManager::GetInstance()->GetAudioSample(&outSample, this); *ppAudioSample = outSample; WAVEFORMATEX sampleFormat; inSample->GetFormat(&sampleFormat); outSample->SetFormat(sampleFormat); outSample->SetDataSize(inSample->DataSize()); tracer.tracef(DET, "TransformAudioSamples : sampleFormat.wBitsPerSample %d\n", sampleFormat.wBitsPerSample); int numSamples = (inSample->DataSize() * 8) / sampleFormat.wBitsPerSample; switch(sampleSize) { case 8: result = ((FIRFilter *)firFilter)->DoFIR((void *)(inSample->Data()), (void *)(outSample->Data()), numSamples); break; case 16: result = ((FIRFilter *)firFilter)->DoFIR((void *)(inSample->Data()), (void *)(outSample->Data()), numSamples); break; case 32: result = ((FIRFilter *)firFilter)->DoFIR((void *)(inSample->Data()), (void *)(outSample->Data()), numSamples); break; default: result = -20; break; } } } tracer.tracef(DET, "~TransformAudioSamples : returning %d\n", result); return result; }