// AudioSampleManager.cpp: implementation of the AudioSampleManager class.
|
//
|
//////////////////////////////////////////////////////////////////////
|
|
#include "AudioSampleManager.h"
|
#include "AudioSample.h"
|
|
using namespace std;
|
|
AudioSampleManager * AudioSampleManager::instance = NULL;
|
bool AudioSampleManager::initialized = false;
|
CRITICAL_SECTION AudioSampleManager::instanceMutex;
|
|
int getSampleCounter = 0;
|
|
//////////////////////////////////////////////////////////////////////
|
// Construction/Destruction
|
//////////////////////////////////////////////////////////////////////
|
|
AudioSampleManager *
|
AudioSampleManager::GetInstance()
|
{
|
EnterCriticalSection(&instanceMutex);
|
if (!instance)
|
{
|
instance = new AudioSampleManager();
|
}
|
LeaveCriticalSection(&instanceMutex);
|
return instance;
|
}
|
|
void
|
AudioSampleManager::Initialize()
|
{
|
if (!initialized)
|
{
|
InitializeCriticalSection(&instanceMutex);
|
EnterCriticalSection(&instanceMutex);
|
instance = GetInstance();
|
initialized = true;
|
LeaveCriticalSection(&instanceMutex);
|
}
|
}
|
|
void
|
AudioSampleManager::Uninitialize()
|
{
|
if (initialized)
|
{
|
EnterCriticalSection(&instanceMutex);
|
delete instance;
|
instance = NULL;
|
initialized = false;
|
LeaveCriticalSection(&instanceMutex);
|
DeleteCriticalSection(&instanceMutex);
|
}
|
}
|
|
AudioSampleManager::AudioSampleManager()
|
{
|
char subFacilityName[100];
|
sprintf(subFacilityName, "AudioSampleManager:%x", this);
|
tracer.SetSubFacilityName(subFacilityName);
|
SetTraceLevel();
|
|
numSamplesCreated = 0;
|
InitializeCriticalSection(&audioSamplesMutex);
|
instance = NULL;
|
}
|
|
AudioSampleManager::~AudioSampleManager()
|
{
|
EnterCriticalSection(&audioSamplesMutex);
|
int numSamplesToDelete = audioSamples.size();
|
while (audioSamples.size() > 0)
|
{
|
AudioSample *audioSample = audioSamples.front();
|
audioSamples.pop_front();
|
delete audioSample;
|
}
|
LeaveCriticalSection(&audioSamplesMutex);
|
tracer.tracef(SIG, "~AudioSampleManager : created %d samples, freed %d samples\n", numSamplesCreated, numSamplesToDelete);
|
DeleteCriticalSection(&audioSamplesMutex);
|
}
|
|
int
|
AudioSampleManager::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", "AudioSampleManager", EE);
|
}
|
tracer.SetSystemMask(SystemMask);
|
return 0;
|
}
|
|
int
|
AudioSampleManager::GetAudioSample(AudioSample **ppAudioSample, TraceUser *container)
|
{
|
getSampleCounter = (getSampleCounter + 1) % 1000;
|
if (getSampleCounter == 0)
|
{
|
tracer.tracef(SIG, "GetAudioSample : free list has %d samples, created %d samples\n", audioSamples.size(), numSamplesCreated);
|
}
|
EnterCriticalSection(&audioSamplesMutex);
|
if (audioSamples.size() > 0)
|
{
|
*ppAudioSample = audioSamples.front();
|
audioSamples.pop_front();
|
LeaveCriticalSection(&audioSamplesMutex);
|
}
|
else
|
{
|
LeaveCriticalSection(&audioSamplesMutex);
|
*ppAudioSample = new AudioSample(this);
|
numSamplesCreated++;
|
}
|
EnterCriticalSection(&((*ppAudioSample)->sampleMutex));
|
if ((*ppAudioSample)->refCount > 0)
|
{
|
LeaveCriticalSection(&((*ppAudioSample)->sampleMutex));
|
*ppAudioSample = new AudioSample(this);
|
numSamplesCreated++;
|
EnterCriticalSection(&((*ppAudioSample)->sampleMutex));
|
}
|
(*ppAudioSample)->refCount = 1;
|
(*ppAudioSample)->SetDataSize(0);
|
(*ppAudioSample)->SetSilenceDuration(0);
|
LeaveCriticalSection(&((*ppAudioSample)->sampleMutex));
|
|
#ifdef DEBUG_AUDIOSAMPLES
|
tracer.tracef(EE, "GetAudioSample : Container 0x%x:%s got audioSample 0x%x\n", container, container->TraceName(), *ppAudioSample);
|
#endif
|
return 0;
|
}
|
|
int
|
AudioSampleManager::AudioSampleReleased(AudioSample *audioSample)
|
{
|
audioSample->refCount = 0;
|
EnterCriticalSection(&audioSamplesMutex);
|
audioSamples.push_back(audioSample);
|
LeaveCriticalSection(&audioSamplesMutex);
|
return 0;
|
}
|