⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcmmixer.cxx

📁 rtp在linux下的实现
💻 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 + -