// 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; }