// AudioTransformer.cpp: implementation of the AudioTransformer class. // ////////////////////////////////////////////////////////////////////// #include "AudioTransformer.h" #include "AudioSample.h" using namespace std; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// AudioTransformer::AudioTransformer() { } AudioTransformer::~AudioTransformer() { } int AudioTransformer::StartTransform() { tracer.tracef(EE, "StartTransform\n"); SetTraceLevel(); int result = TransformStarted(); if (result != 0) { tracer.tracef(ERR, "StartTransform : TransformStarted returned error %d\n", result); } tracer.tracef(EE, "~StartTransform\n"); return result; } int AudioTransformer::StopTransform() { tracer.tracef(EE, "StopTransform\n"); int result = TransformStopped(); if (result != 0) { tracer.tracef(ERR, "StopTransform : TransformStopped returned error %d\n", result); } tracer.tracef(EE, "~StopTransform\n"); return result; } int AudioTransformer::TransformStarted() { return 0; } int AudioTransformer::TransformStopped() { return 0; } int AudioTransformer::RenderAudioSamples(std::vector > &data) { tracer.tracef(DET, "RenderAudioSamples\n"); AudioSample *audioSample = NULL; int result(0); result = TransformAudioSamples(data, &audioSample); if (result != 0) { if (audioSample) { audioSample->Release(this); audioSample = NULL; } } EnterCriticalSection(&audioSinksMutex); vector::iterator iter = audioSinks.begin(); for (iter = audioSinks.begin(); iter != audioSinks.end(); iter++) { tracer.tracef(DET, "RenderAudioSamples : sending sample 0x%x to 0x%x\n", audioSample, *iter); SendAudioSample(audioSample, *iter); } LeaveCriticalSection(&audioSinksMutex); if (audioSample) { audioSample->Release(this); audioSample = NULL; } tracer.tracef(DET, "~RenderAudioSamples\n"); return result; } int AudioTransformer::GenerateData(AudioSample **ppAudioSample) { tracer.tracef(DET, "GenerateData\n"); // get data from all sources inputData.clear(); int result(0); *ppAudioSample = NULL; EnterCriticalSection(&audioSourcesMutex); vector::iterator iter = audioSources.begin(); for (iter = audioSources.begin(); iter != audioSources.end(); iter++) { AudioSample *audioSample = NULL; // tracer.tracef(DET, "GenerateData : calling GiveNextAudioSample\n"); result = (*iter)->GiveNextAudioSample(&audioSample, this); if (result != 0) { tracer.tracef(ERR, "GenerateData : GiveNextAudioSample from %s returned error %d\n", (*iter)->TraceName(), result); if (audioSample) { audioSample->Release(this); audioSample = NULL; } } else { if (audioSample) { inputData.push_back(make_pair(audioSample, *iter)); } } } LeaveCriticalSection(&audioSourcesMutex); // transform the data result = TransformAudioSamples(inputData, ppAudioSample); if (result != 0) { if (*ppAudioSample) { tracer.tracef(ERR, "GenerateData : TransformAudioSamples returned error %d\n", result); (*ppAudioSample)->Release(this); *ppAudioSample = NULL; } } // release all the input samples // (since they were obtained by GiveNextAudioSample, they will not be released by the corresponding source for (int i = 0; i < inputData.size(); i++) { AudioSample *sample = (inputData[i]).first; if (sample) { sample->Release(this); } } tracer.tracef(DET, "~GenerateData\n"); return result; } int AudioTransformer::TransformAudioSamples(std::vector > &data, AudioSample **ppAudioSample) { tracer.tracef(ERR, "AudioTransformer : ERROR : pure virtual function call !!!\n"); return 0; }