xref: /haiku/src/add-ons/media/media-add-ons/tone_producer_demo/ToneProducer.h (revision 7729bad4bde404b76d0d42db02917d83081e609e)
1 /*
2 	ToneProducer.h
3 
4 	Copyright 1999, Be Incorporated.   All Rights Reserved.
5 	This file may be used under the terms of the Be Sample Code License.
6 
7 	NOTES eamoon@meadgroup.com 11june99
8 	- this node has some holes in it, but it's pretty useful starting
9 	  point for writing producers.
10 	- I've tried to clean up the format negotiation a bit, which didn't
11 	  fare too well when faced with an apathetic downstream node
12 	  (LoggingConsumer.)
13 
14 	KNOWN BUGS
15 	  eamoon 17jun99
16 	  * Can't handle 2 channels, but is too polite to refuse.
17 	    How embarrassing.
18 
19 */
20 
21 #ifndef ToneProducer_H
22 #define ToneProducer_H 1
23 
24 #include <media/BufferProducer.h>
25 #include <media/MediaEventLooper.h>
26 #include <media/Controllable.h>
27 
28 class BMediaAddOn;
29 
30 // ----------------
31 // ToneProducer - a node to generate precisely defined digital tones
32 class ToneProducer : public BBufferProducer,  public BControllable, public BMediaEventLooper
33 {
34 public:
35 	enum event_t {
36 		// e.moon 2jun99
37 		_PARAMETER_EVENT 		= BTimedEventQueue::B_USER_EVENT
38 	};
39 
40 public:
41 	// add-on-friendly ctor
42 	// e.moon [8jun99]
43 	ToneProducer(BMediaAddOn* pAddOn=0);
44 	~ToneProducer();
45 
46 // BMediaNode methods
47 	BMediaAddOn* AddOn(	int32* internal_id) const;
48 
49 // BControllable methods
50 	status_t GetParameterValue(
51 		int32 id,
52 		bigtime_t* last_change,
53 		void* value,
54 		size_t* ioSize);
55 
56 	void SetParameterValue(
57 		int32 id,
58 		bigtime_t when,
59 		const void* value,
60 		size_t size);
61 
62 	status_t StartControlPanel(
63 		BMessenger* pMessenger);
64 
65 // BBufferProducer methods
66 	status_t FormatSuggestionRequested(
67 		media_type type,
68 		int32 quality,
69 		media_format* format);
70 
71 	status_t FormatProposal(
72 		const media_source& output,
73 		media_format* format);
74 
75 	/* If the format isn't good, put a good format into *io_format and return error */
76 	/* If format has wildcard, specialize to what you can do (and change). */
77 	/* If you can change the format, return OK. */
78 	/* The request comes from your destination sychronously, so you cannot ask it */
79 	/* whether it likes it -- you should assume it will since it asked. */
80 	status_t FormatChangeRequested(
81 		const media_source& source,
82 		const media_destination& destination,
83 		media_format* io_format,
84 		int32* _deprecated_);
85 
86 	status_t GetNextOutput(	/* cookie starts as 0 */
87 		int32* cookie,
88 		media_output* out_output);
89 
90 	status_t DisposeOutputCookie(
91 		int32 cookie);
92 
93 	/* In this function, you should either pass on the group to your upstream guy, */
94 	/* or delete your current group and hang on to this group. Deleting the previous */
95 	/* group (unless you passed it on with the reclaim flag set to false) is very */
96 	/* important, else you will 1) leak memory and 2) block someone who may want */
97 	/* to reclaim the buffers living in that group. */
98 	status_t SetBufferGroup(
99 		const media_source& for_source,
100 		BBufferGroup* group);
101 
102 	/* Iterates over all outputs and maxes the latency found */
103 	status_t GetLatency(
104 		bigtime_t* out_latency);
105 
106 	status_t PrepareToConnect(
107 		const media_source& what,
108 		const media_destination& where,
109 		media_format* format,
110 		media_source* out_source,
111 		char* out_name);
112 
113 	void Connect(
114 		status_t error,
115 		const media_source& source,
116 		const media_destination& destination,
117 		const media_format& format,
118 		char* io_name);
119 
120 	void Disconnect(
121 		const media_source& what,
122 		const media_destination& where);
123 
124 	void LateNoticeReceived(
125 		const media_source& what,
126 		bigtime_t how_much,
127 		bigtime_t performance_time);
128 
129 	void EnableOutput(
130 		const media_source & what,
131 		bool enabled,
132 		int32* _deprecated_);
133 
134 	status_t SetPlayRate(
135 		int32 numer,
136 		int32 denom);
137 
138 	status_t HandleMessage(
139 		int32 message,
140 		const void* data,
141 		size_t size);
142 
143 	void AdditionalBufferRequested(
144 		const media_source& source,
145 		media_buffer_id prev_buffer,
146 		bigtime_t prev_time,
147 		const media_seek_tag* prev_tag);	//	may be NULL
148 
149 	void LatencyChanged(
150 		const media_source& source,
151 		const media_destination& destination,
152 		bigtime_t new_latency,
153 		uint32 flags);
154 
155 // BMediaEventLooper methods
156 	void NodeRegistered();
157 
158 	void Start(bigtime_t performance_time);
159 
160 	// Workaround for a Metrowerks PPC compiler bug
161 	void Stop(bigtime_t performance_time, bool immediate);
162 
163 	void SetRunMode(run_mode mode);
164 
165 	void HandleEvent(
166 		const media_timed_event* event,
167 		bigtime_t lateness,
168 		bool realTimeEvent = false);
169 
170 private:
171 	void AllocateBuffers();
172 	BBuffer* FillNextBuffer(bigtime_t event_time);
173 
174 	// 20sep99 e.moon: stereo support
175 	void FillSineBuffer(float* data, size_t numFrames, bool stereo);
176 	void FillTriangleBuffer(float* data, size_t numFrames, bool stereo);
177 	void FillSawtoothBuffer(float* data, size_t numFrames, bool stereo);
178 
179 	BParameterWeb* mWeb;
180 	BBufferGroup* mBufferGroup;
181 	bigtime_t mLatency, mInternalLatency;
182 	media_output mOutput;
183 	bool mOutputEnabled;
184 	media_format mPreferredFormat;
185 
186 	// These next attributes are related to tone buffer generation
187 	double mTheta;			// generic parameter used by all generators
188 	bool mWaveAscending;		// used by the triangle-wave generator
189 	float mFrequency;		// can be anything, in Hertz
190 	float mGain;				// should be in the range [0,1]
191 	int32 mWaveform;
192 	uint64 mFramesSent;
193 	bigtime_t mStartTime;
194 
195 	// more parameter handling
196 	bigtime_t mGainLastChanged;
197 	bigtime_t mFreqLastChanged;
198 	bigtime_t mWaveLastChanged;
199 
200 	// host addon
201 	// [8jun99] e.moon
202 	BMediaAddOn*		m_pAddOn;
203 };
204 
205 #endif
206