xref: /haiku/src/add-ons/media/media-add-ons/mixer/AudioMixer.h (revision 9563f44bfd75799f67201067483694e82b5779b9)
1 /*
2  * Copyright 2002 David Shipman,
3  * Copyright 2003-2007 Marcus Overhagen
4  * Copyright 2007 Haiku Inc. All rights reserved.
5  * Distributed under the terms of the MIT License.
6  */
7 #ifndef _AUDIOMIXER_H
8 #define _AUDIOMIXER_H
9 
10 
11 #include <BufferConsumer.h>
12 #include <BufferGroup.h>
13 #include <BufferProducer.h>
14 #include <Controllable.h>
15 #include <MediaEventLooper.h>
16 #include <MediaNode.h>
17 
18 
19 class MixerCore;
20 
21 
22 class AudioMixer : public BBufferConsumer, public BBufferProducer,
23 	public BControllable, public BMediaEventLooper {
24 public:
25 							AudioMixer(BMediaAddOn *addOn, bool isSystemMixer);
26 							~AudioMixer();
27 
28 		void				DisableNodeStop();
29 
30 		// AudioMixer support
31 		void				ApplySettings();
32 
33 		void				PublishEventLatencyChange();
34 		void				UpdateParameterWeb();
35 
36 		void				HandleInputBuffer(BBuffer *buffer, bigtime_t lateness);
37 
38 		BBufferGroup *		CreateBufferGroup();
39 
40 		float				dB_to_Gain(float db);
41 		float				Gain_to_dB(float gain);
42 
43 		// BMediaNode methods
44 		BMediaAddOn *		AddOn(int32 *internal_id) const;
45 		void				NodeRegistered();
46 		void 				Stop(bigtime_t performance_time, bool immediate);
47 		void 				SetTimeSource(BTimeSource * time_source);
48 		using BBufferProducer::SendBuffer;
49 
50 protected:
51 		// BControllable methods
52 		status_t 			GetParameterValue(int32 id,
53 											bigtime_t *last_change,
54 											void *value,
55 											size_t *ioSize);
56 
57 		void				SetParameterValue(int32 id, bigtime_t when,
58 											const void *value,
59 											size_t size);
60 
61 		// BBufferConsumer methods
62 		status_t			HandleMessage(int32 message, const void* data,
63 											size_t size);
64 		status_t			AcceptFormat(const media_destination &dest,
65 											media_format *format);
66 		status_t			GetNextInput(int32 *cookie,
67 											media_input *out_input);
68 		void				DisposeInputCookie(int32 cookie);
69 		void				BufferReceived(BBuffer *buffer);
70 		void				ProducerDataStatus(const media_destination &for_whom,
71 											int32 status,
72 											bigtime_t at_performance_time);
73 		status_t			GetLatencyFor(const media_destination &for_whom,
74 											bigtime_t *out_latency,
75 											media_node_id *out_timesource);
76 		status_t			Connected(const media_source &producer,
77 											const media_destination &where,
78 											const media_format &with_format,
79 											media_input *out_input);
80 		void				Disconnected(const media_source &producer,
81 											const media_destination &where);
82 		status_t			FormatChanged(const media_source &producer,
83 											const media_destination &consumer,
84 											int32 change_tag,
85 											const media_format &format);
86 
87 		// BBufferProducer methods
88 		status_t 			FormatSuggestionRequested(media_type type,
89 											int32 quality,
90 											media_format *format);
91 		status_t 			FormatProposal(const media_source &output,
92 											media_format *format);
93 		status_t			FormatChangeRequested(
94 											const media_source& source,
95 											const media_destination &destination,
96 											media_format *io_format,
97 											int32 *_deprecated_);
98 		status_t			GetNextOutput(int32 *cookie,media_output *out_output);
99 		status_t			DisposeOutputCookie(int32 cookie);
100 		status_t			SetBufferGroup(const media_source &for_source,
101 											BBufferGroup *group);
102 		status_t			GetLatency(bigtime_t *out_latency);
103 		status_t			PrepareToConnect(const media_source &what,
104 											const media_destination &where,
105 											media_format *format,
106 											media_source *out_source,
107 											char *out_name);
108 		void				Connect(status_t error,
109 											const media_source &source,
110 											const media_destination &destination,
111 											const media_format &format,
112 											char *io_name);
113 		void				Disconnect(const media_source &what,
114 											const media_destination &where);
115 		void				LateNoticeReceived(const media_source &what,
116 											bigtime_t how_much,
117 											bigtime_t performance_time);
118 		void				EnableOutput(const media_source &what,
119 											bool enabled,
120 											int32 *_deprecated_);
121 		void				LatencyChanged(const media_source &source,
122 											const media_destination &destination,
123 											bigtime_t new_latency, uint32 flags);
124 
125 		// BMediaEventLooper methods
126 		void				HandleEvent(const media_timed_event *event,
127 											bigtime_t lateness,
128 											bool realTimeEvent = false);
129 
130 private:
131 		BMediaAddOn			*fAddOn;
132 		MixerCore			*fCore;
133 		BParameterWeb		*fWeb; // local pointer to parameterweb
134 		BBufferGroup		*fBufferGroup;
135 		bigtime_t			fDownstreamLatency;
136 		bigtime_t			fInternalLatency;
137 		bool				fDisableStop;
138 		media_format		fDefaultFormat;
139 };
140 
141 #endif	// _AUDIOMIXER_H
142