MediaConnection.h revision e8bf0f3e
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
16namespace BPrivate { namespace media {
17
18class 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.
29class BMediaConnection {
30public:
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	// This allow to specify a format that will be used while
43	// connecting to another node.
44	void							SetAcceptedFormat(
45										const media_format& format);
46	const media_format&				AcceptedFormat() const;
47
48	// Represents the buffer size, depends on the format set or negotiated
49	// for this connection.
50	size_t							BufferSize() const;
51
52	// Disconnect this connection. When a connection is disconnected,
53	// it can be reused as brand new.
54	status_t						Disconnect();
55
56	// Once you are done with this connection you release it, it automatically
57	// remove the object from the BMediaClient and free all used resources.
58	// This will make the connection to disappear completely, so if you
59	// want to preserve it for future connections just Disconnect() it.
60	status_t						Release();
61
62protected:
63									BMediaConnection(
64										media_connection_kinds kinds);
65	virtual							~BMediaConnection();
66
67	// Those callbacks are shared between BMediaInput and BMediaOutput
68	virtual void					Connected(const media_format& format);
69	virtual void					Disconnected();
70
71	// Specify a latency range to allow the connection behave correctly.
72	// Ideally the minimum latency should be the algorithmic latency you expect
73	// from the node and will be used as starting point. The max latency is the
74	// maximum acceptable by you, over that point the node will adjust it's
75	// performance time to recover if a big delay happen.
76			void					SetLatencyRange(bigtime_t min,
77										bigtime_t max);
78
79			void					GetLatencyRange(bigtime_t* min,
80										bigtime_t* max) const;
81
82private:
83
84			void					_ConnectionRegistered(BMediaClient* owner,
85										media_connection_id id);
86
87	const media_source&				_Source() const;
88	const media_destination&		_Destination() const;
89
90	media_connection				fConnection;
91
92	BMediaClient*					fOwner;
93
94	// A connection might be binded so that it will automatically
95	// forward or receive the data from/to a local BMediaConnection,
96	// see BMediaClient::Bind.
97	BMediaConnection*				fBind;
98
99	BBufferGroup*					fBufferGroup;
100
101	bool							fConnected;
102
103	bigtime_t						fMinLatency;
104	bigtime_t						fMaxLatency;
105
106	virtual	void					_ReservedMediaConnection0();
107	virtual	void					_ReservedMediaConnection1();
108	virtual	void					_ReservedMediaConnection2();
109	virtual	void					_ReservedMediaConnection3();
110	virtual	void					_ReservedMediaConnection4();
111	virtual	void					_ReservedMediaConnection5();
112	virtual	void					_ReservedMediaConnection6();
113	virtual	void					_ReservedMediaConnection7();
114	virtual	void					_ReservedMediaConnection8();
115	virtual	void					_ReservedMediaConnection9();
116	virtual	void					_ReservedMediaConnection10();
117	uint32							fPadding[64];
118
119	friend class BMediaClient;
120	friend class BMediaClientNode;
121
122	friend class BMediaInput;
123	friend class BMediaOutput;
124};
125
126
127class BMediaInput : public virtual BMediaConnection {
128public:
129									BMediaInput();
130
131protected:
132	virtual							~BMediaInput();
133
134	// Callbacks
135	virtual status_t				FormatChanged(const media_format& format);
136
137	virtual void					HandleBuffer(BBuffer* buffer);
138
139private:
140	media_input						_MediaInput() const;
141
142	virtual	void					_ReservedMediaInput0();
143	virtual	void					_ReservedMediaInput1();
144	virtual	void					_ReservedMediaInput2();
145	virtual	void					_ReservedMediaInput3();
146	virtual	void					_ReservedMediaInput4();
147	virtual	void					_ReservedMediaInput5();
148	virtual	void					_ReservedMediaInput6();
149	virtual	void					_ReservedMediaInput7();
150	virtual	void					_ReservedMediaInput8();
151	virtual	void					_ReservedMediaInput9();
152	virtual	void					_ReservedMediaInput10();
153	uint32							fPadding[32];
154
155	friend class BMediaClientNode;
156};
157
158
159class BMediaOutput : public virtual BMediaConnection {
160public:
161									BMediaOutput();
162
163	void							SetEnabled(bool enabled);
164	bool							IsEnabled() const;
165
166protected:
167	virtual							~BMediaOutput();
168
169	// Callbacks
170	virtual status_t				PrepareToConnect(media_format* format);
171
172	virtual status_t				FormatProposal(media_format* format);
173	virtual status_t				FormatChangeRequested(media_format* format);
174
175	// When a connection is not binded with another, and you really don't want
176	// to use BMediaGraph it's your job to send the buffer to the connection
177	// you want. You might want to ovverride it so that you can track something,
178	// in this case be sure to call the base version. Be sure to know what
179	// you are doing.
180	virtual	status_t				SendBuffer(BBuffer* buffer);
181
182private:
183	media_output					_MediaOutput() const;
184
185	bool							fEnabled;
186	size_t							fFramesSent;
187
188	virtual	void					_ReservedMediaOutput0();
189	virtual	void					_ReservedMediaOutput1();
190	virtual	void					_ReservedMediaOutput2();
191	virtual	void					_ReservedMediaOutput3();
192	virtual	void					_ReservedMediaOutput4();
193	virtual	void					_ReservedMediaOutput5();
194	virtual	void					_ReservedMediaOutput6();
195	virtual	void					_ReservedMediaOutput7();
196	virtual	void					_ReservedMediaOutput8();
197	virtual	void					_ReservedMediaOutput9();
198	virtual	void					_ReservedMediaOutput10();
199	uint32							fPadding[32];
200
201	friend class BMediaClientNode;
202};
203
204
205}
206
207}
208
209using namespace BPrivate::media;
210
211#endif
212