xref: /haiku/headers/private/media/experimental/MediaConnection.h (revision 9642f7705b27e5c270c15fa526d14e1848c2c27d)
1 /*
2  * Copyright 2015-2018, Dario Casalinuovo. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 #ifndef _MEDIA_CONNECTION_H
7 #define _MEDIA_CONNECTION_H
8 
9 #include <BufferGroup.h>
10 #include <MediaDefs.h>
11 
12 #include <MediaClient.h>
13 #include <MediaClientDefs.h>
14 
15 
16 namespace BPrivate { namespace media {
17 
18 class BMediaClientNode;
19 
20 
21 // The BMediaConnection class is the swiss knife of BMediaClient.
22 // It represents a connection between two nodes and allow to create complex
23 // nodes without dealing with the unneeded complexity. Two local connections,
24 // can be binded, this means that when you will receive a buffer A as input,
25 // the BufferReceived function will be called so that you can process the BBuffer,
26 // and once the function returns the output will be automatically forwarded
27 // to the connection B SendBuffer method.
28 // It's not possible to mix a BMediaInput with a BMediaOutput in the same class.
29 class BMediaConnection {
30 public:
31 	const media_connection&			Connection() const;
32 	BMediaClient*					Client() const;
33 
34 	media_connection_id				Id() const;
35 	const char*						Name() const;
36 
37 	bool							HasBinding() const;
38 	BMediaConnection*				Binding() const;
39 
40 	bool							IsConnected() const;
41 
42 	// If the connection is connected get the other endpoint,
43 	// return media_connection::null otherwise.
44 	media_connection				Endpoint();
45 
46 	// Represents the buffer size, implement it to return the buffer size
47 	// you decided for this connection.
48 	// TODO: Do we want this (and ChainSize) moved on the output side?
49 	// Or perhaps provide an implementation based on the buffer group
50 	// for the consumer?
51 	// Problem is: the consumer has not easy access to the buffer group,
52 	// so we way want to add a special messaging between clients after
53 	// connection, so that inputs know the buffer size and chain size.
54 	virtual size_t					BufferSize() const = 0;
55 	// Implement it to specify the size of your chain of buffers.
56 	//virtual int32					ChainSize() const = 0;
57 
58 	// Disconnect this connection. When a connection is disconnected,
59 	// it can be reused as brand new.
60 	status_t						Disconnect();
61 
62 	// Once you are done with this connection you release it, it automatically
63 	// remove the object from the BMediaClient and free all used resources.
64 	// This will make the connection to disappear completely, so if you
65 	// want to preserve it for future connections just Disconnect() it.
66 	status_t						Release();
67 
68 protected:
69 									BMediaConnection(
70 										media_connection_kinds kinds,
71 										const char* name = NULL);
72 	virtual							~BMediaConnection();
73 
74 private:
75 	// Those callbacks are shared between BMediaInput and BMediaOutput
76 	virtual void					Connected(const media_format& format);
77 	virtual void					Disconnected();
78 
79 			void					_ConnectionRegistered(BMediaClient* owner,
80 										media_connection_id id);
81 
82 	const media_source&				_Source() const;
83 	const media_destination&		_Destination() const;
84 
85 	media_connection				fConnection;
86 
87 	BMediaClient*					fOwner;
88 
89 	// A connection might be binded so that it will automatically
90 	// forward or receive the data from/to a local BMediaConnection,
91 	// see BMediaClient::Bind.
92 	BMediaConnection*				fBind;
93 
94 	bool							fConnected;
95 
96 	virtual	void					_ReservedMediaConnection0();
97 	virtual	void					_ReservedMediaConnection1();
98 	virtual	void					_ReservedMediaConnection2();
99 	virtual	void					_ReservedMediaConnection3();
100 	virtual	void					_ReservedMediaConnection4();
101 	virtual	void					_ReservedMediaConnection5();
102 	virtual	void					_ReservedMediaConnection6();
103 	virtual	void					_ReservedMediaConnection7();
104 	virtual	void					_ReservedMediaConnection8();
105 	virtual	void					_ReservedMediaConnection9();
106 	virtual	void					_ReservedMediaConnection10();
107 	uint32							fPadding[64];
108 
109 	friend class BMediaClient;
110 	friend class BMediaClientNode;
111 
112 	friend class BMediaInput;
113 	friend class BMediaOutput;
114 };
115 
116 
117 class BMediaInput : public virtual BMediaConnection {
118 protected:
119 									BMediaInput(const char* name = NULL);
120 	virtual							~BMediaInput();
121 
122 	// Callbacks
123 	virtual status_t				AcceptFormat(media_format* format) = 0;
124 
125 	virtual void					HandleBuffer(BBuffer* buffer);
126 
127 	virtual void					Connected(const media_format& format);
128 	virtual void					Disconnected();
129 
130 private:
131 
132 	virtual	void					_ReservedMediaInput0();
133 	virtual	void					_ReservedMediaInput1();
134 	virtual	void					_ReservedMediaInput2();
135 	virtual	void					_ReservedMediaInput3();
136 	virtual	void					_ReservedMediaInput4();
137 	virtual	void					_ReservedMediaInput5();
138 	virtual	void					_ReservedMediaInput6();
139 	virtual	void					_ReservedMediaInput7();
140 	virtual	void					_ReservedMediaInput8();
141 	virtual	void					_ReservedMediaInput9();
142 	virtual	void					_ReservedMediaInput10();
143 	uint32							fPadding[32];
144 
145 	friend class BMediaClientNode;
146 };
147 
148 
149 class BMediaOutput : public virtual BMediaConnection {
150 protected:
151 									BMediaOutput(const char* name = NULL);
152 	virtual							~BMediaOutput();
153 
154 	// Callbacks
155 	virtual status_t				PrepareToConnect(media_format* format) = 0;
156 	virtual status_t				FormatProposal(media_format* format) = 0;
157 
158 	// When a connection is not binded with another, and you really don't want
159 	// to use BMediaGraph it's your job to send the buffer to the connection
160 	// you want. You might want to ovverride it so that you can track something,
161 	// in this case be sure to call the base version. Be sure to know what
162 	// you are doing.
163 	virtual	status_t				SendBuffer(BBuffer* buffer);
164 
165 	virtual void					Connected(const media_format& format);
166 	virtual void					Disconnected();
167 
168 private:
169 
170 	// TODO: possibly unneeded.
171 	void							_SetEnabled(bool enabled);
172 	bool							_IsEnabled() const;
173 
174 	bool							fEnabled;
175 	size_t							fFramesSent;
176 
177 	BBufferGroup*					fBufferGroup;
178 
179 	virtual	void					_ReservedMediaOutput0();
180 	virtual	void					_ReservedMediaOutput1();
181 	virtual	void					_ReservedMediaOutput2();
182 	virtual	void					_ReservedMediaOutput3();
183 	virtual	void					_ReservedMediaOutput4();
184 	virtual	void					_ReservedMediaOutput5();
185 	virtual	void					_ReservedMediaOutput6();
186 	virtual	void					_ReservedMediaOutput7();
187 	virtual	void					_ReservedMediaOutput8();
188 	virtual	void					_ReservedMediaOutput9();
189 	virtual	void					_ReservedMediaOutput10();
190 	uint32							fPadding[32];
191 
192 	friend class BMediaClientNode;
193 };
194 
195 
196 }
197 
198 }
199 
200 using namespace BPrivate::media;
201 
202 #endif
203