summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/jabber/jingle/libjingle/talk/session/phone/portaudiomediaengine.h
blob: 89922e77cc9842da539ce95c21b3fb37a16ea443 (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
#ifndef PORTAUDIOMEDIAENGINE_H
#define PORTAUDIOMEDIAENGINE_H

#include <portaudio.h>
#include <speex.h>
#include <ortp/ortp.h>

#include "talk/session/phone/mediaengine.h"

class PortAudioMediaChannel : public cricket::MediaChannel 
{
public:
	PortAudioMediaChannel();
	virtual ~PortAudioMediaChannel();
	virtual void SetCodec(const char *codec);
	virtual void OnPacketReceived(const void *data, int len);

	virtual void SetPtqlayout(bool ptqlayout);
	virtual void SetSend(bool send);

	virtual float GetCurrentQuality();
	virtual int GetOutputLevel();

	void readOutput(float*, int);
	void writeInput(float*, int);

protected:
	void readBuffer(float*, float**, float*, float*, float*, int);
	void writeBuffer(float*, float*, float**, float*, float*, int);

private:
	bool mute_;
	bool play_;
	PortAudioStream* stream_;

	// Buffers
	float *out_buffer_, *out_buffer_read_, *out_buffer_write_, *out_buffer_end_;
	float *in_buffer_, *in_buffer_read_, *in_buffer_write_, *in_buffer_end_;

	// Speex
	SpeexBits speex_bits_;
	void *speex_enc_state_, *speex_dec_state_;
	float *speex_frame_;
	int speex_frame_size_;

	// ORTP
	int rtp_socket_;
	RtpSession* rtp_session_;
	int rtp_timestamp_;
};


class PortAudioMediaEngine : public cricket::MediaEngine 
{
public:
	PortAudioMediaEngine();
	~PortAudioMediaEngine();
	virtual bool Init();
	virtual void Terminate();

	virtual cricket::MediaChannel *CreateChannel();

	virtual int SetAudioOptions(int options);
	virtual int SetSoundDevices(int wave_in_device, int wave_out_device);

	virtual int GetInputLevel();
};

#endif