xref: /haiku/src/kits/media/experimental/MediaConnection.cpp (revision 0cc5ecb8ca33fbf36595076935537c05e2c48736)
17561d9acSDario Casalinuovo /*
27561d9acSDario Casalinuovo  * Copyright 2015, Dario Casalinuovo. All rights reserved.
37561d9acSDario Casalinuovo  * Distributed under the terms of the MIT License.
47561d9acSDario Casalinuovo  */
57561d9acSDario Casalinuovo 
67561d9acSDario Casalinuovo #include <MediaConnection.h>
77561d9acSDario Casalinuovo 
87561d9acSDario Casalinuovo #include "MediaClientNode.h"
97561d9acSDario Casalinuovo 
107561d9acSDario Casalinuovo #include "debug.h"
117561d9acSDario Casalinuovo 
127561d9acSDario Casalinuovo 
137561d9acSDario Casalinuovo BMediaConnection::BMediaConnection(media_connection_kinds kinds)
147561d9acSDario Casalinuovo 	:
157561d9acSDario Casalinuovo 	fOwner(NULL),
167561d9acSDario Casalinuovo 	fBind(NULL),
177561d9acSDario Casalinuovo 	fBufferGroup(NULL),
187561d9acSDario Casalinuovo 	fMinLatency(0),
197561d9acSDario Casalinuovo 	fMaxLatency(0)
207561d9acSDario Casalinuovo {
217561d9acSDario Casalinuovo 	CALLED();
227561d9acSDario Casalinuovo 
237561d9acSDario Casalinuovo 	fConnection.kinds = kinds;
24*0cc5ecb8SDario Casalinuovo 	fConnection.id = -1;
257561d9acSDario Casalinuovo 	//fConnection.client = media_client::null;
267561d9acSDario Casalinuovo }
277561d9acSDario Casalinuovo 
287561d9acSDario Casalinuovo 
297561d9acSDario Casalinuovo BMediaConnection::~BMediaConnection()
307561d9acSDario Casalinuovo {
317561d9acSDario Casalinuovo 	CALLED();
327561d9acSDario Casalinuovo 
337561d9acSDario Casalinuovo }
347561d9acSDario Casalinuovo 
357561d9acSDario Casalinuovo 
367561d9acSDario Casalinuovo const media_connection&
377561d9acSDario Casalinuovo BMediaConnection::Connection() const
387561d9acSDario Casalinuovo {
397561d9acSDario Casalinuovo 	return fConnection;
407561d9acSDario Casalinuovo }
417561d9acSDario Casalinuovo 
427561d9acSDario Casalinuovo 
43991d9dbfSDario Casalinuovo BMediaClient*
44991d9dbfSDario Casalinuovo BMediaConnection::Client() const
45991d9dbfSDario Casalinuovo {
46991d9dbfSDario Casalinuovo 	return fOwner;
47991d9dbfSDario Casalinuovo }
48991d9dbfSDario Casalinuovo 
49991d9dbfSDario Casalinuovo 
507561d9acSDario Casalinuovo bool
517561d9acSDario Casalinuovo BMediaConnection::HasBinding() const
527561d9acSDario Casalinuovo {
537561d9acSDario Casalinuovo 	CALLED();
547561d9acSDario Casalinuovo 
557561d9acSDario Casalinuovo 	return fBind != NULL;
567561d9acSDario Casalinuovo }
577561d9acSDario Casalinuovo 
587561d9acSDario Casalinuovo 
597561d9acSDario Casalinuovo BMediaConnection*
607561d9acSDario Casalinuovo BMediaConnection::Binding() const
617561d9acSDario Casalinuovo {
627561d9acSDario Casalinuovo 	CALLED();
637561d9acSDario Casalinuovo 
647561d9acSDario Casalinuovo 	return fBind;
657561d9acSDario Casalinuovo }
667561d9acSDario Casalinuovo 
677561d9acSDario Casalinuovo 
687561d9acSDario Casalinuovo void
697561d9acSDario Casalinuovo BMediaConnection::SetAcceptedFormat(const media_format& format)
707561d9acSDario Casalinuovo {
717561d9acSDario Casalinuovo 	CALLED();
727561d9acSDario Casalinuovo 
737561d9acSDario Casalinuovo 	fConnection.format = format;
747561d9acSDario Casalinuovo }
757561d9acSDario Casalinuovo 
767561d9acSDario Casalinuovo 
777561d9acSDario Casalinuovo const media_format&
787561d9acSDario Casalinuovo BMediaConnection::AcceptedFormat() const
797561d9acSDario Casalinuovo {
807561d9acSDario Casalinuovo 	CALLED();
817561d9acSDario Casalinuovo 
827561d9acSDario Casalinuovo 	return fConnection.format;
837561d9acSDario Casalinuovo }
847561d9acSDario Casalinuovo 
857561d9acSDario Casalinuovo 
867561d9acSDario Casalinuovo bool
877561d9acSDario Casalinuovo BMediaConnection::IsConnected() const
887561d9acSDario Casalinuovo {
897561d9acSDario Casalinuovo 	CALLED();
907561d9acSDario Casalinuovo 
917561d9acSDario Casalinuovo 	return fConnected;
927561d9acSDario Casalinuovo }
937561d9acSDario Casalinuovo 
947561d9acSDario Casalinuovo 
957561d9acSDario Casalinuovo status_t
967561d9acSDario Casalinuovo BMediaConnection::Disconnect()
977561d9acSDario Casalinuovo {
987561d9acSDario Casalinuovo 	CALLED();
997561d9acSDario Casalinuovo 
100991d9dbfSDario Casalinuovo 	status_t ret = fOwner->_DisconnectConnection(this);
101991d9dbfSDario Casalinuovo 	if (ret != B_OK)
102991d9dbfSDario Casalinuovo 		return ret;
103991d9dbfSDario Casalinuovo 
1047561d9acSDario Casalinuovo 	delete fBufferGroup;
1057561d9acSDario Casalinuovo 	fBufferGroup = NULL;
1067561d9acSDario Casalinuovo 
107991d9dbfSDario Casalinuovo 	return ret;
1087561d9acSDario Casalinuovo }
1097561d9acSDario Casalinuovo 
1107561d9acSDario Casalinuovo 
1117561d9acSDario Casalinuovo status_t
1127561d9acSDario Casalinuovo BMediaConnection::Release()
1137561d9acSDario Casalinuovo {
1147561d9acSDario Casalinuovo 	CALLED();
1157561d9acSDario Casalinuovo 
116991d9dbfSDario Casalinuovo 	status_t ret = fOwner->_ReleaseConnection(this);
117991d9dbfSDario Casalinuovo 	if (ret != B_OK)
118991d9dbfSDario Casalinuovo 		return ret;
119991d9dbfSDario Casalinuovo 
120991d9dbfSDario Casalinuovo 	delete this;
121991d9dbfSDario Casalinuovo 	return ret;
1227561d9acSDario Casalinuovo }
1237561d9acSDario Casalinuovo 
1247561d9acSDario Casalinuovo 
1257561d9acSDario Casalinuovo size_t
1267561d9acSDario Casalinuovo BMediaConnection::BufferSize() const
1277561d9acSDario Casalinuovo {
1287561d9acSDario Casalinuovo 	CALLED();
1297561d9acSDario Casalinuovo 
1305854fc4aSDario Casalinuovo 	switch (fConnection.format.type) {
1315854fc4aSDario Casalinuovo 		case B_MEDIA_RAW_AUDIO:
1325854fc4aSDario Casalinuovo 			return fConnection.format.u.raw_audio.buffer_size;
1335854fc4aSDario Casalinuovo 
1345854fc4aSDario Casalinuovo 		case B_MEDIA_RAW_VIDEO:
1355854fc4aSDario Casalinuovo 			return fConnection.format.u.raw_video.display.bytes_per_row *
1365854fc4aSDario Casalinuovo 				fConnection.format.u.raw_video.display.line_count;
1375854fc4aSDario Casalinuovo 
1385854fc4aSDario Casalinuovo 		default:
1395854fc4aSDario Casalinuovo 			return 0;
1407561d9acSDario Casalinuovo 	}
1417561d9acSDario Casalinuovo }
1427561d9acSDario Casalinuovo 
1437561d9acSDario Casalinuovo 
1447561d9acSDario Casalinuovo void
1457561d9acSDario Casalinuovo BMediaConnection::Connected(const media_format& format)
1467561d9acSDario Casalinuovo {
1477561d9acSDario Casalinuovo 	fConnected = true;
1487561d9acSDario Casalinuovo }
1497561d9acSDario Casalinuovo 
1507561d9acSDario Casalinuovo 
1517561d9acSDario Casalinuovo void
1527561d9acSDario Casalinuovo BMediaConnection::Disconnected()
1537561d9acSDario Casalinuovo {
1547561d9acSDario Casalinuovo 	fConnected = false;
1557561d9acSDario Casalinuovo }
1567561d9acSDario Casalinuovo 
1577561d9acSDario Casalinuovo 
1587561d9acSDario Casalinuovo void
1597561d9acSDario Casalinuovo BMediaConnection::GetLatencyRange(bigtime_t* min, bigtime_t* max) const
1607561d9acSDario Casalinuovo {
1617561d9acSDario Casalinuovo 	CALLED();
1627561d9acSDario Casalinuovo 
1637561d9acSDario Casalinuovo 	*min = fMinLatency;
1647561d9acSDario Casalinuovo 	*max = fMaxLatency;
1657561d9acSDario Casalinuovo }
1667561d9acSDario Casalinuovo 
1677561d9acSDario Casalinuovo 
1687561d9acSDario Casalinuovo void
1697561d9acSDario Casalinuovo BMediaConnection::SetLatencyRange(bigtime_t min, bigtime_t max)
1707561d9acSDario Casalinuovo {
1717561d9acSDario Casalinuovo 	CALLED();
1727561d9acSDario Casalinuovo 
1737561d9acSDario Casalinuovo 	fMinLatency = min;
1747561d9acSDario Casalinuovo 	fMaxLatency = max;
1757561d9acSDario Casalinuovo }
1767561d9acSDario Casalinuovo 
1777561d9acSDario Casalinuovo 
1787561d9acSDario Casalinuovo void
179d64dd7beSDario Casalinuovo BMediaConnection::_ConnectionRegistered(BMediaClient* owner,
1807561d9acSDario Casalinuovo 	media_connection_id id)
1817561d9acSDario Casalinuovo {
1827561d9acSDario Casalinuovo 	fOwner = owner;
1837561d9acSDario Casalinuovo 	fConnection.id = id;
1847561d9acSDario Casalinuovo 	fConnection.client = fOwner->Client();
1857561d9acSDario Casalinuovo 
1867561d9acSDario Casalinuovo 	if (fConnection.IsOutput()) {
1877561d9acSDario Casalinuovo 		fConnection.source.port = fOwner->fNode->ControlPort();
1887561d9acSDario Casalinuovo 		fConnection.source.id = fConnection.id;
1897561d9acSDario Casalinuovo 
1907561d9acSDario Casalinuovo 		fConnection.destination = media_destination::null;
1917561d9acSDario Casalinuovo 	} else {
1927561d9acSDario Casalinuovo 		fConnection.destination.port = fOwner->fNode->ControlPort();
1937561d9acSDario Casalinuovo 		fConnection.destination.id = fConnection.id;
1947561d9acSDario Casalinuovo 
1957561d9acSDario Casalinuovo 		fConnection.source = media_source::null;
1967561d9acSDario Casalinuovo 	}
1977561d9acSDario Casalinuovo }
1987561d9acSDario Casalinuovo 
1997561d9acSDario Casalinuovo 
2007561d9acSDario Casalinuovo const media_source&
201d64dd7beSDario Casalinuovo BMediaConnection::_Source() const
2027561d9acSDario Casalinuovo {
203d64dd7beSDario Casalinuovo 	return fConnection._Source();
2047561d9acSDario Casalinuovo }
2057561d9acSDario Casalinuovo 
2067561d9acSDario Casalinuovo 
2077561d9acSDario Casalinuovo const media_destination&
208d64dd7beSDario Casalinuovo BMediaConnection::_Destination() const
2097561d9acSDario Casalinuovo {
210d64dd7beSDario Casalinuovo 	return fConnection._Destination();
2117561d9acSDario Casalinuovo }
2127561d9acSDario Casalinuovo 
2137561d9acSDario Casalinuovo 
2147561d9acSDario Casalinuovo void BMediaConnection::_ReservedMediaConnection0() {}
2157561d9acSDario Casalinuovo void BMediaConnection::_ReservedMediaConnection1() {}
2167561d9acSDario Casalinuovo void BMediaConnection::_ReservedMediaConnection2() {}
2177561d9acSDario Casalinuovo void BMediaConnection::_ReservedMediaConnection3() {}
2187561d9acSDario Casalinuovo void BMediaConnection::_ReservedMediaConnection4() {}
2197561d9acSDario Casalinuovo void BMediaConnection::_ReservedMediaConnection5() {}
2207561d9acSDario Casalinuovo void BMediaConnection::_ReservedMediaConnection6() {}
2217561d9acSDario Casalinuovo void BMediaConnection::_ReservedMediaConnection7() {}
2227561d9acSDario Casalinuovo void BMediaConnection::_ReservedMediaConnection8() {}
2237561d9acSDario Casalinuovo void BMediaConnection::_ReservedMediaConnection9() {}
2247561d9acSDario Casalinuovo void BMediaConnection::_ReservedMediaConnection10() {}
2257561d9acSDario Casalinuovo 
2267561d9acSDario Casalinuovo 
2277561d9acSDario Casalinuovo BMediaInput::BMediaInput()
2287561d9acSDario Casalinuovo 	:
2297561d9acSDario Casalinuovo 	BMediaConnection(B_MEDIA_INPUT)
2307561d9acSDario Casalinuovo {
2317561d9acSDario Casalinuovo }
2327561d9acSDario Casalinuovo 
2337561d9acSDario Casalinuovo 
2340844ddf4SDario Casalinuovo BMediaInput::~BMediaInput()
2350844ddf4SDario Casalinuovo {
2360844ddf4SDario Casalinuovo 	CALLED();
2370844ddf4SDario Casalinuovo }
2380844ddf4SDario Casalinuovo 
2390844ddf4SDario Casalinuovo 
2407561d9acSDario Casalinuovo status_t
2417561d9acSDario Casalinuovo BMediaInput::FormatChanged(const media_format& format)
2427561d9acSDario Casalinuovo {
2437561d9acSDario Casalinuovo 	if (!format_is_compatible(format, AcceptedFormat()))
2447561d9acSDario Casalinuovo 		return B_MEDIA_BAD_FORMAT;
2457561d9acSDario Casalinuovo 
2467561d9acSDario Casalinuovo 	SetAcceptedFormat(format);
2477561d9acSDario Casalinuovo 
2487561d9acSDario Casalinuovo 	return B_OK;
2497561d9acSDario Casalinuovo }
2507561d9acSDario Casalinuovo 
2517561d9acSDario Casalinuovo 
2527561d9acSDario Casalinuovo void
2535854fc4aSDario Casalinuovo BMediaInput::HandleBuffer(BBuffer* buffer)
2547561d9acSDario Casalinuovo {
2557561d9acSDario Casalinuovo 	CALLED();
2567561d9acSDario Casalinuovo 
2577561d9acSDario Casalinuovo }
2587561d9acSDario Casalinuovo 
2597561d9acSDario Casalinuovo 
260d64dd7beSDario Casalinuovo media_input
261d64dd7beSDario Casalinuovo BMediaInput::_MediaInput() const
262d64dd7beSDario Casalinuovo {
263d64dd7beSDario Casalinuovo 	return Connection()._MediaInput();
264d64dd7beSDario Casalinuovo }
265d64dd7beSDario Casalinuovo 
266d64dd7beSDario Casalinuovo 
2677561d9acSDario Casalinuovo void BMediaInput::_ReservedMediaInput0() {}
2687561d9acSDario Casalinuovo void BMediaInput::_ReservedMediaInput1() {}
2697561d9acSDario Casalinuovo void BMediaInput::_ReservedMediaInput2() {}
2707561d9acSDario Casalinuovo void BMediaInput::_ReservedMediaInput3() {}
2717561d9acSDario Casalinuovo void BMediaInput::_ReservedMediaInput4() {}
2727561d9acSDario Casalinuovo void BMediaInput::_ReservedMediaInput5() {}
2737561d9acSDario Casalinuovo void BMediaInput::_ReservedMediaInput6() {}
2747561d9acSDario Casalinuovo void BMediaInput::_ReservedMediaInput7() {}
2757561d9acSDario Casalinuovo void BMediaInput::_ReservedMediaInput8() {}
2767561d9acSDario Casalinuovo void BMediaInput::_ReservedMediaInput9() {}
2777561d9acSDario Casalinuovo void BMediaInput::_ReservedMediaInput10() {}
2787561d9acSDario Casalinuovo 
2797561d9acSDario Casalinuovo 
2807561d9acSDario Casalinuovo BMediaOutput::BMediaOutput()
2817561d9acSDario Casalinuovo 	:
2827561d9acSDario Casalinuovo 	BMediaConnection(B_MEDIA_OUTPUT)
2837561d9acSDario Casalinuovo {
2847561d9acSDario Casalinuovo }
2857561d9acSDario Casalinuovo 
2867561d9acSDario Casalinuovo 
2870844ddf4SDario Casalinuovo BMediaOutput::~BMediaOutput()
2880844ddf4SDario Casalinuovo {
2890844ddf4SDario Casalinuovo 	CALLED();
2900844ddf4SDario Casalinuovo }
2910844ddf4SDario Casalinuovo 
2920844ddf4SDario Casalinuovo 
2937561d9acSDario Casalinuovo bool
2947561d9acSDario Casalinuovo BMediaOutput::IsEnabled() const
2957561d9acSDario Casalinuovo {
2967561d9acSDario Casalinuovo 	CALLED();
2977561d9acSDario Casalinuovo 
2987561d9acSDario Casalinuovo 	return fEnabled;
2997561d9acSDario Casalinuovo }
3007561d9acSDario Casalinuovo 
3017561d9acSDario Casalinuovo 
3027561d9acSDario Casalinuovo void
3037561d9acSDario Casalinuovo BMediaOutput::SetEnabled(bool enabled)
3047561d9acSDario Casalinuovo {
3057561d9acSDario Casalinuovo 	fEnabled = enabled;
3067561d9acSDario Casalinuovo }
3077561d9acSDario Casalinuovo 
3087561d9acSDario Casalinuovo 
3097561d9acSDario Casalinuovo status_t
3107561d9acSDario Casalinuovo BMediaOutput::PrepareToConnect(media_format* format)
3117561d9acSDario Casalinuovo {
3125854fc4aSDario Casalinuovo 	if (!format_is_compatible(AcceptedFormat(), *format))
3135854fc4aSDario Casalinuovo 		return B_ERROR;
3145854fc4aSDario Casalinuovo 
3157561d9acSDario Casalinuovo 	SetAcceptedFormat(*format);
3167561d9acSDario Casalinuovo 
3177561d9acSDario Casalinuovo 	return B_OK;
3187561d9acSDario Casalinuovo }
3197561d9acSDario Casalinuovo 
3207561d9acSDario Casalinuovo 
3217561d9acSDario Casalinuovo status_t
3227561d9acSDario Casalinuovo BMediaOutput::FormatProposal(media_format* format)
3237561d9acSDario Casalinuovo {
3247561d9acSDario Casalinuovo 	*format = AcceptedFormat();
3257561d9acSDario Casalinuovo 	return B_OK;
3267561d9acSDario Casalinuovo }
3277561d9acSDario Casalinuovo 
3287561d9acSDario Casalinuovo 
3297561d9acSDario Casalinuovo status_t
3307561d9acSDario Casalinuovo BMediaOutput::FormatChangeRequested(media_format* format)
3317561d9acSDario Casalinuovo {
3327561d9acSDario Casalinuovo 	return B_ERROR;
3337561d9acSDario Casalinuovo }
3347561d9acSDario Casalinuovo 
3357561d9acSDario Casalinuovo 
3367561d9acSDario Casalinuovo status_t
3377561d9acSDario Casalinuovo BMediaOutput::SendBuffer(BBuffer* buffer)
3387561d9acSDario Casalinuovo {
3397561d9acSDario Casalinuovo 	CALLED();
3407561d9acSDario Casalinuovo 
3415854fc4aSDario Casalinuovo 	if (!IsConnected())
3425854fc4aSDario Casalinuovo 		return B_ERROR;
3435854fc4aSDario Casalinuovo 
3447561d9acSDario Casalinuovo 	return fOwner->fNode->SendBuffer(buffer, this);
3457561d9acSDario Casalinuovo }
3467561d9acSDario Casalinuovo 
3477561d9acSDario Casalinuovo 
3487561d9acSDario Casalinuovo media_output
349d64dd7beSDario Casalinuovo BMediaOutput::_MediaOutput() const
3507561d9acSDario Casalinuovo {
351d64dd7beSDario Casalinuovo 	return Connection()._MediaOutput();
3527561d9acSDario Casalinuovo }
3537561d9acSDario Casalinuovo 
3547561d9acSDario Casalinuovo 
3557561d9acSDario Casalinuovo void BMediaOutput::_ReservedMediaOutput0() {}
3567561d9acSDario Casalinuovo void BMediaOutput::_ReservedMediaOutput1() {}
3577561d9acSDario Casalinuovo void BMediaOutput::_ReservedMediaOutput2() {}
3587561d9acSDario Casalinuovo void BMediaOutput::_ReservedMediaOutput3() {}
3597561d9acSDario Casalinuovo void BMediaOutput::_ReservedMediaOutput4() {}
3607561d9acSDario Casalinuovo void BMediaOutput::_ReservedMediaOutput5() {}
3617561d9acSDario Casalinuovo void BMediaOutput::_ReservedMediaOutput6() {}
3627561d9acSDario Casalinuovo void BMediaOutput::_ReservedMediaOutput7() {}
3637561d9acSDario Casalinuovo void BMediaOutput::_ReservedMediaOutput8() {}
3647561d9acSDario Casalinuovo void BMediaOutput::_ReservedMediaOutput9() {}
3657561d9acSDario Casalinuovo void BMediaOutput::_ReservedMediaOutput10() {}
366