summaryrefslogtreecommitdiff
path: root/orkbasecxx/filters/gsm/GsmFilters.cpp
blob: 3cc8f364af05505170ad33278381eb5cf1523447 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
 * Oreka -- A media capture and retrieval platform
 * 
 * Copyright (C) 2005, orecx LLC
 *
 * http://www.orecx.com
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License.
 * Please refer to http://www.gnu.org/copyleft/gpl.html
 *
 */
//#pragma warning( disable: 4786 ) // disables truncated symbols in browse-info warning

#include "GsmFilters.h"

GsmToPcmFilter::GsmToPcmFilter()
{
	CStdString logMsg;

	gsmState = gsm_create();
	if(!gsmState)
	{
		logMsg = "gsm_create() returned memory allocation problem";
		throw(logMsg);
	}
}

GsmToPcmFilter::~GsmToPcmFilter()
{
	gsm_destroy(gsmState);
}

FilterRef GsmToPcmFilter::Instanciate()
{
	FilterRef Filter(new GsmToPcmFilter());
	return Filter;
}

void GsmToPcmFilter::AudioChunkIn(AudioChunkRef& inputAudioChunk)
{
	m_outputAudioChunk.reset();

	if(inputAudioChunk.get() == NULL)
	{
		return;
	}
	if(inputAudioChunk->GetNumSamples() == 0)
	{
		return;
	}
	AudioChunkDetails outputDetails = *inputAudioChunk->GetDetails();
	if(outputDetails.m_rtpPayloadType != GetInputRtpPayloadType())
	{
		return;
	}

	// Create output buffer
	m_outputAudioChunk.reset(new AudioChunk());
	outputDetails.m_rtpPayloadType = -1;		//  Override details that this filter changes
	outputDetails.m_encoding = PcmAudio;
	int numSamples = 160;	// standard GSM frame is 33 bytes for 160 PCM samples (20 ms)
	outputDetails.m_numBytes = numSamples*2;
	short* outputBuffer = (short*)m_outputAudioChunk->CreateBuffer(outputDetails);
	unsigned char* inputBuffer = (unsigned char*)inputAudioChunk->m_pBuffer;
	gsm_decode(gsmState, inputBuffer, outputBuffer);
}

void GsmToPcmFilter::AudioChunkOut(AudioChunkRef& chunk)
{
	chunk = m_outputAudioChunk;
}

AudioEncodingEnum GsmToPcmFilter::GetInputAudioEncoding()
{
	return GsmAudio;
}

AudioEncodingEnum GsmToPcmFilter::GetOutputAudioEncoding()
{
	return PcmAudio;
}

CStdString GsmToPcmFilter::GetName()
{
	return "GsmToPcm";
}

int GsmToPcmFilter::GetInputRtpPayloadType()
{
	return 0x3;
}

void GsmToPcmFilter::CaptureEventIn(CaptureEventRef& event)
{
	;
}

void GsmToPcmFilter::CaptureEventOut(CaptureEventRef& event)
{
	;
}