📄 pcmmixer.cxx
字号:
// PCMMixer.cpp: implementation of the PCMMixer class.
//
//////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include "PCMMixer.h"
#include "AudioSample.h"
#include "AudioSampleManager.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
PCMMixer::PCMMixer()
{
char subFacilityName[100];
sprintf(subFacilityName, "PCMMixer:%x", this);
tracer.SetSubFacilityName(subFacilityName);
SetTraceLevel();
}
PCMMixer::~PCMMixer()
{
}
int
PCMMixer::SetTraceLevel()
{
#ifdef WIN32
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", "PCMMixer", 0x100000);
}
#endif
return 0;
}
int
PCMMixer::TransformAudioSamples(std::vector<std::pair<AudioSample *, AudioSource *> > &data, AudioSample **ppAudioSample)
{
tracer.tracef(DET, "TransformAudioSamples\n");
if(data.size() == 0)
{
tracer.tracef(DET, "TransformAudioSamples:No data, ignoring\n");
return 0;
}
int result = 0;
AudioSample *inSample = data[0].first;
if (data.size() == 1)
{
*ppAudioSample = inSample;
inSample->AddRef();
}
else
{
// create new audio sample
AudioSample *outSample;
result = AudioSampleManager::GetInstance()->GetAudioSample(&outSample);
*ppAudioSample = outSample;
WAVEFORMATEX sampleFormat;
inSample->GetFormat(&sampleFormat);
outSample->SetFormat(sampleFormat);
short *dataOut = (short *)(outSample->Data());
// find out how many need to be mixed
int maxInputSize(0);
int maxSilenceDuration(0);
for (int i=0; i< data.size(); i++)
{
int sampleDataSize = (data[i].first)->DataSize();
if (sampleDataSize > maxInputSize)
{
maxInputSize = sampleDataSize;
}
else if (sampleDataSize == 0)
{
maxSilenceDuration = max(maxSilenceDuration, (data[i].first)->GetSilenceDuration());
}
}
outSample->SetSilenceDuration(maxSilenceDuration); // in case all are silence packets
int samplesToMix = (outSample->BufferSize() > maxInputSize ? maxInputSize : outSample->BufferSize()) / 2;
// mix samples
for (int i=0; i<samplesToMix; i++)
{
double total = 0;
// first add the samples
for (int j=0; j<data.size(); j++)
{
AudioSample *audioSample = data[j].first;
short *dataIn = (short *)(audioSample->Data());
if (audioSample->DataSize() >= (i+1) * 2) // sample #0 means datasize has to be = (0+1) * 2
{
total += dataIn[i];
}
}
// limit the volume
if (total > 32767.0)
{
total = 32767.0;
}
else if (total < -32768.0)
{
total = -32768.0;
}
dataOut[i] = (short)total;
}
outSample->SetDataSize(samplesToMix * 2);
tracer.tracef(DET, "TransformAudioSamples : outSample->DataSize = %d\n", samplesToMix * 2);
}
tracer.tracef(DET, "~TransformAudioSamples\n");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -