1/*
2 * Copyright 2012, Gerasim Troeglazov (3dEyes**), 3dEyes@gmail.com.
3 * All rights reserved.
4 * Distributed under the terms of the MIT License.
5 */
6
7#ifndef __EQUALIZER_NODE_H__
8#define __EQUALIZER_NODE_H__
9
10#include <Controllable.h>
11#include <BufferProducer.h>
12#include <BufferConsumer.h>
13#include <MediaEventLooper.h>
14
15#include "Equalizer.h"
16
17class BMediaAddOn;
18class BBufferGroup;
19
20#define BUFF_SIZE 		0x2000
21
22#define ID_AUDIO_INPUT	1
23#define	ID_AUDIO_OUTPUT 2
24
25#define P_PREAMP_LABEL 	100
26#define P_PREAMP 		101
27#define P_MUTE			102
28#define P_BYPASS		103
29#define	P_BAND_LABELS 	200
30#define P_BANDS 		300
31
32class EqualizerNode : public	BBufferConsumer,
33					 public	BBufferProducer,
34					 public	BControllable,
35					 public	BMediaEventLooper {
36public:
37	virtual 				~EqualizerNode();
38							EqualizerNode(BMediaAddOn* pAddOn = NULL);
39	//BMediaNode
40public:
41	virtual		BMediaAddOn *AddOn(int32* id) const;
42	virtual		status_t 	HandleMessage(int32 code, const void* data,	size_t size);
43protected:
44	virtual 	void 		NodeRegistered();
45	//BControllable
46public:
47	virtual 	status_t 	GetParameterValue(int32 id,	bigtime_t* lastChangeTime,
48								void* value, size_t* size);
49	virtual 	void 		SetParameterValue(int32 id,	bigtime_t changeTime,
50								const void* value, size_t size);
51	//BBufferConsumer
52public:
53	virtual 	void 		BufferReceived(BBuffer* buffer);
54	virtual 	status_t 	AcceptFormat(const media_destination &dst,
55								media_format* format);
56	virtual 	status_t 	GetNextInput(int32* cookie,	media_input* input);
57	virtual 	void 		DisposeInputCookie(int32 cookie);
58	virtual 	status_t 	FormatChanged(const media_source &src,
59								const media_destination &dst,
60							int32 change_tag, const media_format &format);
61	virtual 	void 		ProducerDataStatus(const media_destination &dst,
62								int32 status,
63								bigtime_t when);
64	virtual 	status_t 	GetLatencyFor(const media_destination &dst,
65								bigtime_t* latency,
66								media_node_id* time_src);
67	virtual 	status_t 	Connected(const media_source &src,
68								const media_destination &dst,
69								const media_format &format,
70								media_input* input);
71	virtual 	void 		Disconnected(const media_source &src,
72								const media_destination &dst);
73	//BBufferProducer
74public:
75	virtual 	status_t 	FormatSuggestionRequested(media_type type,
76								int32 quality, media_format* format);
77	virtual 	status_t 	FormatProposal(const media_source &src,
78								media_format* format);
79	virtual 	status_t 	FormatChangeRequested(const media_source &src,
80								const media_destination &dst,
81								media_format* format,
82								int32* _deprecated_);
83	virtual 	void 		LateNoticeReceived(const media_source &src,
84								bigtime_t late,	bigtime_t when);
85	virtual 	status_t	GetNextOutput(int32 *cookie, media_output* output);
86	virtual 	status_t 	DisposeOutputCookie(int32 cookie);
87	virtual 	status_t	SetBufferGroup(const media_source &src,
88								BBufferGroup* group);
89	virtual 	status_t 	PrepareToConnect(const media_source &src,
90								const media_destination &dst,
91								media_format* format, media_source* source,
92								char* name);
93	virtual 	void 		Connect(status_t status,
94								const media_source &src,
95								const media_destination &dst,
96								const media_format &format,
97								char* name);
98	virtual		void 		Disconnect(const media_source &src,
99								const media_destination &dst);
100	virtual 	void 		EnableOutput(const media_source &src,
101								bool enabled, int32* _deprecated_);
102	virtual 	status_t 	GetLatency(bigtime_t* outLatency);
103	virtual 	void 		LatencyChanged(	const media_source &src,
104								const media_destination &dst,
105								bigtime_t latency, uint32 flags);
106	//BMediaEventLooper
107protected:
108	virtual 	bigtime_t 	OfflineTime();
109	//EqualizerNode
110protected:
111	virtual 	void 		HandleEvent(const media_timed_event* event,
112								bigtime_t late,
113								bool realTimeEvent = false);
114				void 		ParameterEventProcessing(const media_timed_event* event);
115				status_t 	ValidateFormat(const media_format &preferred_format,
116								media_format &proposed_format);
117				void 		SetOutputFormat(media_format &format);
118	virtual 	void 		InitParameterValues(void);
119	virtual 	void 		InitParameterWeb(void);
120	virtual 	void 		InitFilter(void);
121	virtual 	bigtime_t 	GetFilterLatency(void);
122	virtual 	void 		FilterBuffer(BBuffer* pBuffer);
123
124private:
125	BMediaAddOn*			fAddOn;
126	BParameterWeb*			fWeb;
127
128	Equalizer				fEqualizer;
129
130	media_format			fPreferredFormat;
131	media_format			fFormat;
132	media_input				fInputMedia;
133	media_output			fOutputMedia;
134
135	int32					fMute;
136	int32					fByPass;
137
138	bigtime_t				fMuteLastChanged;
139	bigtime_t				fByPassLastChanged;
140	bigtime_t				fPreAmpLastChanged;
141	bigtime_t				fBandsLastChanged[EQ_BANDS];
142
143	bigtime_t				fProcessLatency;
144	bigtime_t				fDownstreamLatency;
145	bool					fOutputMediaEnabled;
146};
147
148#endif //__EQUALIZER_NODE_H__
149