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 __VST_NODE_H__
8#define __VST_NODE_H__
9
10#include <Controllable.h>
11#include <BufferProducer.h>
12#include <BufferConsumer.h>
13#include <MediaEventLooper.h>
14
15#include "VSTHost.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//parameter IDs
26enum param_id_t {
27	P_MUTE		= 50,
28	P_BYPASS,
29
30	P_PARAM		= 5000,
31	P_ABOUT		= 6000,
32	P_LABEL		= 7000,
33	P_LABEL2	= 8000,
34	P_LABEL3	= 9000,
35};
36
37
38class VSTNode : public	BBufferConsumer,
39				public	BBufferProducer,
40				public	BControllable,
41				public	BMediaEventLooper {
42public:
43	virtual 				~VSTNode();
44							VSTNode(BMediaAddOn *addon, const char *name,
45								const char* path);
46	//BMediaNode
47public:
48	virtual		BMediaAddOn *AddOn(int32 *id) const;
49	virtual		status_t 	HandleMessage(int32 code, const void *data,	size_t size);
50protected:
51	virtual 	void 		NodeRegistered();
52	//BControllable
53public:
54	virtual 	status_t 	GetParameterValue(int32 id,	bigtime_t *lastChangeTime,
55									void *value, size_t *size);
56	virtual 	void 		SetParameterValue(int32 id,	bigtime_t changeTime,
57									const void *value, size_t size);
58	//BBufferConsumer
59public:
60	virtual 	void 		BufferReceived(BBuffer *buffer);
61	virtual 	status_t 	AcceptFormat(const media_destination &dst,
62							media_format *format);
63	virtual 	status_t 	GetNextInput(int32 *cookie,	media_input *input);
64	virtual 	void 		DisposeInputCookie(int32 cookie);
65	virtual 	status_t 	FormatChanged(const media_source &src,
66									const media_destination &dst,
67							int32 change_tag, const media_format &format);
68	virtual 	void 		ProducerDataStatus(const media_destination &dst,
69									int32 status,
70									bigtime_t when);
71	virtual 	status_t 	GetLatencyFor(const media_destination &dst,
72							bigtime_t *latency,
73							media_node_id *time_src);
74	virtual 	status_t 	Connected(const media_source &src,
75									const media_destination &dst,
76									const media_format &format,
77									media_input *input);
78	virtual 	void 		Disconnected(const media_source &src,
79									const media_destination &dst);
80	//BBufferProducer
81public:
82	virtual 	status_t 	FormatSuggestionRequested(media_type type,
83									int32 quality, media_format *format);
84	virtual 	status_t 	FormatProposal(const media_source &src,
85									media_format *format);
86	virtual 	status_t 	FormatChangeRequested(const media_source &src,
87									const media_destination &dst,
88									media_format *format,
89									int32* _deprecated_);
90	virtual 	void 		LateNoticeReceived(const media_source &src,
91									bigtime_t late,	bigtime_t when);
92	virtual 	status_t	GetNextOutput(int32 *cookie, media_output *output);
93	virtual 	status_t 	DisposeOutputCookie(int32 cookie);
94	virtual 	status_t	SetBufferGroup(const media_source &src,
95									BBufferGroup *group);
96	virtual 	status_t 	PrepareToConnect(const media_source &src,
97									const media_destination &dst,
98									media_format *format, media_source *out_source,
99									char *name);
100	virtual 	void 		Connect(status_t status,
101									const media_source &src,
102									const media_destination &dst,
103									const media_format &format,
104									char* name);
105	virtual		void 		Disconnect(const media_source &src,
106									const media_destination &dst);
107	virtual 	void 		EnableOutput(const media_source &src,
108									bool enabled, int32* _deprecated_);
109	virtual 	status_t 	GetLatency(bigtime_t *outLatency);
110	virtual 	void 		LatencyChanged(	const media_source &src,
111									const media_destination &dst,
112									bigtime_t latency, uint32 flags);
113	//BMediaEventLooper
114protected:
115	virtual 	bigtime_t 	OfflineTime();
116	//VSTNode
117protected:
118	virtual 	void 		HandleEvent(const media_timed_event *event,
119									bigtime_t late,
120									bool realTimeEvent=false);
121				void 		ParameterEventProcessing(const media_timed_event *event);
122				status_t 	ValidateFormat(const media_format& preferredFormat,
123									media_format &proposedFormat);
124				void 		SetOutputFormat(media_format& ioFormat);
125	virtual 	void 		InitParameterValues();
126	virtual 	void 		InitParameterWeb();
127	virtual 	void 		InitFilter();
128	virtual 	bigtime_t 	GetFilterLatency();
129	virtual 	void 		FilterBuffer(BBuffer* pBuffer);
130
131private:
132	BMediaAddOn				*fAddOn;
133	VSTPlugin				*fPlugin;
134	BParameterWeb			*fWeb;
135
136	media_format			fPreferredFormat;
137	media_format			fFormat;
138	media_input				fInputMedia;
139	media_output			fOutputMedia;
140	bool					fOutputMediaEnabled;
141	bigtime_t				fDownstreamLatency;
142	bigtime_t				fProcessLatency;
143
144	int32					fBlockSize;
145	int32					fMute;
146	int32					fByPass;
147	bigtime_t				fMuteLastChanged;
148	bigtime_t				fByPassLastChanged;
149};
150
151#endif //__VST_NODE_H__
152