19b410c41SDario Casalinuovo/*
29b410c41SDario Casalinuovo * Copyright 2015, Dario Casalinuovo. All rights reserved.
39b410c41SDario Casalinuovo * Distributed under the terms of the MIT License.
49b410c41SDario Casalinuovo */
59b410c41SDario Casalinuovo
69b410c41SDario Casalinuovo#include "MediaClient.h"
79b410c41SDario Casalinuovo
8f506f305SDario Casalinuovo#include <MediaConnection.h>
9f506f305SDario Casalinuovo
109b410c41SDario Casalinuovo#include <MediaRoster.h>
119b410c41SDario Casalinuovo#include <TimeSource.h>
129b410c41SDario Casalinuovo
137561d9acSDario Casalinuovo#include "MediaClientNode.h"
147561d9acSDario Casalinuovo
15b84955d4SBarrett#include "MediaDebug.h"
169b410c41SDario Casalinuovo
179b410c41SDario Casalinuovo
180844ddf4SDario Casalinuovonamespace BPrivate { namespace media {
190844ddf4SDario Casalinuovo
200844ddf4SDario Casalinuovo
210844ddf4SDario Casalinuovoclass ConnReleaser {
220844ddf4SDario Casalinuovopublic:
230844ddf4SDario Casalinuovo	ConnReleaser(BMediaConnection* conn)
240844ddf4SDario Casalinuovo		:
250844ddf4SDario Casalinuovo		fConn(conn) {}
260844ddf4SDario Casalinuovo
270844ddf4SDario Casalinuovo	virtual ~ConnReleaser()
280844ddf4SDario Casalinuovo	{
290844ddf4SDario Casalinuovo		fConn->Release();
300844ddf4SDario Casalinuovo	}
310844ddf4SDario Casalinuovo
320844ddf4SDario Casalinuovo	bool operator== (const ConnReleaser &c1)
330844ddf4SDario Casalinuovo	{
340844ddf4SDario Casalinuovo		return c1.fConn == this->fConn;
350844ddf4SDario Casalinuovo	}
360844ddf4SDario Casalinuovo
370844ddf4SDario Casalinuovoprotected:
380844ddf4SDario Casalinuovo	BMediaConnection* Obj() const
390844ddf4SDario Casalinuovo	{
400844ddf4SDario Casalinuovo		return fConn;
410844ddf4SDario Casalinuovo	}
420844ddf4SDario Casalinuovo
430844ddf4SDario Casalinuovoprivate:
440844ddf4SDario Casalinuovo	BMediaConnection* fConn;
450844ddf4SDario Casalinuovo};
460844ddf4SDario Casalinuovo
470844ddf4SDario Casalinuovo
480844ddf4SDario Casalinuovoclass InputReleaser : public ConnReleaser {
490844ddf4SDario Casalinuovopublic:
500844ddf4SDario Casalinuovo	InputReleaser(BMediaInput* input)
510844ddf4SDario Casalinuovo		:
520844ddf4SDario Casalinuovo		ConnReleaser(input) {}
530844ddf4SDario Casalinuovo
540844ddf4SDario Casalinuovo	BMediaInput* Obj() const
550844ddf4SDario Casalinuovo	{
560844ddf4SDario Casalinuovo		return dynamic_cast<BMediaInput*>(ConnReleaser::Obj());
570844ddf4SDario Casalinuovo	}
580844ddf4SDario Casalinuovo};
590844ddf4SDario Casalinuovo
600844ddf4SDario Casalinuovo
610844ddf4SDario Casalinuovoclass OutputReleaser : public ConnReleaser {
620844ddf4SDario Casalinuovopublic:
630844ddf4SDario Casalinuovo	OutputReleaser(BMediaOutput* output)
640844ddf4SDario Casalinuovo		:
650844ddf4SDario Casalinuovo		ConnReleaser(output) {}
660844ddf4SDario Casalinuovo
670844ddf4SDario Casalinuovo	BMediaOutput* Obj() const
680844ddf4SDario Casalinuovo	{
690844ddf4SDario Casalinuovo		return dynamic_cast<BMediaOutput*>(ConnReleaser::Obj());
700844ddf4SDario Casalinuovo	}
710844ddf4SDario Casalinuovo};
720844ddf4SDario Casalinuovo
730844ddf4SDario Casalinuovo
740844ddf4SDario Casalinuovo}
750844ddf4SDario Casalinuovo}
760844ddf4SDario Casalinuovo
770844ddf4SDario Casalinuovo
789b410c41SDario CasalinuovoBMediaClient::BMediaClient(const char* name,
79f1f09565SDario Casalinuovo	media_type type, media_client_kinds kinds)
809b410c41SDario Casalinuovo	:
810cc5ecb8SDario Casalinuovo	fLastID(-1)
829b410c41SDario Casalinuovo{
839b410c41SDario Casalinuovo	CALLED();
849b410c41SDario Casalinuovo
859b410c41SDario Casalinuovo	fNode = new BMediaClientNode(name, this, type);
869b410c41SDario Casalinuovo	_Init();
87f506f305SDario Casalinuovo
88f506f305SDario Casalinuovo	fClient.node = fNode->Node();
89f1f09565SDario Casalinuovo	fClient.kinds = kinds;
909b410c41SDario Casalinuovo}
919b410c41SDario Casalinuovo
929b410c41SDario Casalinuovo
939b410c41SDario CasalinuovoBMediaClient::~BMediaClient()
949b410c41SDario Casalinuovo{
959b410c41SDario Casalinuovo	CALLED();
969b410c41SDario Casalinuovo
979b410c41SDario Casalinuovo	_Deinit();
989b410c41SDario Casalinuovo}
999b410c41SDario Casalinuovo
1009b410c41SDario Casalinuovo
101f506f305SDario Casalinuovoconst media_client&
102f506f305SDario CasalinuovoBMediaClient::Client() const
103f506f305SDario Casalinuovo{
104f506f305SDario Casalinuovo	return fClient;
105f506f305SDario Casalinuovo}
106f506f305SDario Casalinuovo
107f506f305SDario Casalinuovo
1089b410c41SDario Casalinuovostatus_t
1099b410c41SDario CasalinuovoBMediaClient::InitCheck() const
1109b410c41SDario Casalinuovo{
1119b410c41SDario Casalinuovo	CALLED();
1129b410c41SDario Casalinuovo
1139b410c41SDario Casalinuovo	return fInitErr;
1149b410c41SDario Casalinuovo}
1159b410c41SDario Casalinuovo
1169b410c41SDario Casalinuovo
117f1f09565SDario Casalinuovomedia_client_kinds
118f1f09565SDario CasalinuovoBMediaClient::Kinds() const
1199b410c41SDario Casalinuovo{
1209b410c41SDario Casalinuovo	CALLED();
1219b410c41SDario Casalinuovo
122f1f09565SDario Casalinuovo	return fClient.Kinds();
1239b410c41SDario Casalinuovo}
1249b410c41SDario Casalinuovo
1259b410c41SDario Casalinuovo
1269b410c41SDario Casalinuovomedia_type
127f506f305SDario CasalinuovoBMediaClient::MediaType() const
1289b410c41SDario Casalinuovo{
1299b410c41SDario Casalinuovo	CALLED();
1309b410c41SDario Casalinuovo
1319b410c41SDario Casalinuovo	// Right now ConsumerType() and ProducerType() are the same.
1329b410c41SDario Casalinuovo	return fNode->ConsumerType();
1339b410c41SDario Casalinuovo}
1349b410c41SDario Casalinuovo
1359b410c41SDario Casalinuovo
136ecb39585SDario Casalinuovostatus_t
137ecb39585SDario CasalinuovoBMediaClient::RegisterInput(BMediaInput* input)
1389b410c41SDario Casalinuovo{
139d64dd7beSDario Casalinuovo	input->_ConnectionRegistered(this, ++fLastID);
140d64dd7beSDario Casalinuovo	_AddInput(input);
141ecb39585SDario Casalinuovo	return B_OK;
1429b410c41SDario Casalinuovo}
1439b410c41SDario Casalinuovo
1449b410c41SDario Casalinuovo
145ecb39585SDario Casalinuovostatus_t
146ecb39585SDario CasalinuovoBMediaClient::RegisterOutput(BMediaOutput* output)
1479b410c41SDario Casalinuovo{
148d64dd7beSDario Casalinuovo	output->_ConnectionRegistered(this, ++fLastID);
149d64dd7beSDario Casalinuovo	_AddOutput(output);
150ecb39585SDario Casalinuovo	return B_OK;
1516d025521SDario Casalinuovo}
1526d025521SDario Casalinuovo
1536d025521SDario Casalinuovo
1546d025521SDario Casalinuovostatus_t
1556d025521SDario CasalinuovoBMediaClient::Bind(BMediaInput* input, BMediaOutput* output)
1566d025521SDario Casalinuovo{
1576d025521SDario Casalinuovo	CALLED();
1589b410c41SDario Casalinuovo
1599b410c41SDario Casalinuovo	if (input == NULL
160521f41ddSDario Casalinuovo		|| output == NULL)
1619b410c41SDario Casalinuovo		return B_ERROR;
1629b410c41SDario Casalinuovo
1636d025521SDario Casalinuovo	if (input->fOwner != this || output->fOwner != this)
1646d025521SDario Casalinuovo		return B_ERROR;
1656d025521SDario Casalinuovo
1669b410c41SDario Casalinuovo	// TODO: Implement binding one input to more outputs.
1679b410c41SDario Casalinuovo	if (input->fBind != NULL
1689b410c41SDario Casalinuovo		|| output->fBind != NULL)
1699b410c41SDario Casalinuovo		return B_ERROR;
1709b410c41SDario Casalinuovo
1719b410c41SDario Casalinuovo	input->fBind = output;
1729b410c41SDario Casalinuovo	output->fBind = input;
1739b410c41SDario Casalinuovo	return B_OK;
1749b410c41SDario Casalinuovo}
1759b410c41SDario Casalinuovo
1769b410c41SDario Casalinuovo
1779b410c41SDario Casalinuovostatus_t
1786d025521SDario CasalinuovoBMediaClient::Unbind(BMediaInput* input, BMediaOutput* output)
1799b410c41SDario Casalinuovo{
1809b410c41SDario Casalinuovo	CALLED();
1819b410c41SDario Casalinuovo
18216d463aeSAdrien Destugues	if (input == NULL || output == NULL)
1839b410c41SDario Casalinuovo		return B_ERROR;
1849b410c41SDario Casalinuovo
1856d025521SDario Casalinuovo	if (input->fOwner != this || output->fOwner != this)
1866d025521SDario Casalinuovo		return B_ERROR;
1876d025521SDario Casalinuovo
1889b410c41SDario Casalinuovo	input->fBind = NULL;
1899b410c41SDario Casalinuovo	output->fBind = NULL;
1909b410c41SDario Casalinuovo	return B_OK;
1919b410c41SDario Casalinuovo}
1929b410c41SDario Casalinuovo
1939b410c41SDario Casalinuovo
1949b410c41SDario Casalinuovostatus_t
1959b410c41SDario CasalinuovoBMediaClient::Connect(BMediaConnection* ourConnection,
1969b410c41SDario Casalinuovo	BMediaConnection* theirConnection)
1979b410c41SDario Casalinuovo{
1989b410c41SDario Casalinuovo	CALLED();
1999b410c41SDario Casalinuovo
200f506f305SDario Casalinuovo	return Connect(ourConnection, theirConnection->Connection());
2019b410c41SDario Casalinuovo}
2029b410c41SDario Casalinuovo
2039b410c41SDario Casalinuovo
2049b410c41SDario Casalinuovostatus_t
205f506f305SDario CasalinuovoBMediaClient::Connect(BMediaConnection* ourConnection,
206f506f305SDario Casalinuovo	const media_connection& theirConnection)
2079b410c41SDario Casalinuovo{
2089b410c41SDario Casalinuovo	CALLED();
2099b410c41SDario Casalinuovo
21051844723SDario Casalinuovo	BMediaOutput* output = dynamic_cast<BMediaOutput*>(ourConnection);
21151844723SDario Casalinuovo	if (output != NULL && theirConnection.IsInput())
21251844723SDario Casalinuovo		return _ConnectInput(output, theirConnection);
21351844723SDario Casalinuovo
21451844723SDario Casalinuovo	BMediaInput* input = dynamic_cast<BMediaInput*>(ourConnection);
21551844723SDario Casalinuovo	if (input != NULL && theirConnection.IsOutput())
21651844723SDario Casalinuovo		return _ConnectOutput(input, theirConnection);
2179b410c41SDario Casalinuovo
218f506f305SDario Casalinuovo	return B_ERROR;
2199b410c41SDario Casalinuovo}
2209b410c41SDario Casalinuovo
2219b410c41SDario Casalinuovo
2229b410c41SDario Casalinuovostatus_t
2239b410c41SDario CasalinuovoBMediaClient::Connect(BMediaConnection* connection,
224f506f305SDario Casalinuovo	const media_client& client)
2259b410c41SDario Casalinuovo{
2265854fc4aSDario Casalinuovo	UNIMPLEMENTED();
2279b410c41SDario Casalinuovo
2289b410c41SDario Casalinuovo	return B_ERROR;
2299b410c41SDario Casalinuovo}
2309b410c41SDario Casalinuovo
2319b410c41SDario Casalinuovo
2329b410c41SDario Casalinuovostatus_t
2339b410c41SDario CasalinuovoBMediaClient::Disconnect()
2349b410c41SDario Casalinuovo{
2359b410c41SDario Casalinuovo	CALLED();
2369b410c41SDario Casalinuovo
2379b410c41SDario Casalinuovo	for (int32 i = 0; i < CountInputs(); i++)
2389b410c41SDario Casalinuovo		InputAt(i)->Disconnect();
2399b410c41SDario Casalinuovo
2409b410c41SDario Casalinuovo	for (int32 i = 0; i < CountOutputs(); i++)
2419b410c41SDario Casalinuovo		OutputAt(i)->Disconnect();
2429b410c41SDario Casalinuovo
2439b410c41SDario Casalinuovo	return B_OK;
2449b410c41SDario Casalinuovo}
2459b410c41SDario Casalinuovo
2469b410c41SDario Casalinuovo
2479b410c41SDario Casalinuovoint32
2489b410c41SDario CasalinuovoBMediaClient::CountInputs() const
2499b410c41SDario Casalinuovo{
2509b410c41SDario Casalinuovo	CALLED();
2519b410c41SDario Casalinuovo
2529b410c41SDario Casalinuovo	return fInputs.CountItems();
2539b410c41SDario Casalinuovo}
2549b410c41SDario Casalinuovo
2559b410c41SDario Casalinuovo
2569b410c41SDario Casalinuovoint32
2579b410c41SDario CasalinuovoBMediaClient::CountOutputs() const
2589b410c41SDario Casalinuovo{
2599b410c41SDario Casalinuovo	CALLED();
2609b410c41SDario Casalinuovo
2619b410c41SDario Casalinuovo	return fOutputs.CountItems();
2629b410c41SDario Casalinuovo}
2639b410c41SDario Casalinuovo
2649b410c41SDario Casalinuovo
2656d025521SDario CasalinuovoBMediaInput*
2669b410c41SDario CasalinuovoBMediaClient::InputAt(int32 index) const
2679b410c41SDario Casalinuovo{
2689b410c41SDario Casalinuovo	CALLED();
2699b410c41SDario Casalinuovo
2700844ddf4SDario Casalinuovo	return fInputs.ItemAt(index)->Obj();
2719b410c41SDario Casalinuovo}
2729b410c41SDario Casalinuovo
2739b410c41SDario Casalinuovo
2746d025521SDario CasalinuovoBMediaOutput*
2759b410c41SDario CasalinuovoBMediaClient::OutputAt(int32 index) const
2769b410c41SDario Casalinuovo{
2779b410c41SDario Casalinuovo	CALLED();
2789b410c41SDario Casalinuovo
2790844ddf4SDario Casalinuovo	return fOutputs.ItemAt(index)->Obj();
2809b410c41SDario Casalinuovo}
2819b410c41SDario Casalinuovo
2829b410c41SDario Casalinuovo
2836d025521SDario CasalinuovoBMediaInput*
284902701e6SDario CasalinuovoBMediaClient::FindInput(const media_connection& input) const
285902701e6SDario Casalinuovo{
286902701e6SDario Casalinuovo	CALLED();
287902701e6SDario Casalinuovo
288902701e6SDario Casalinuovo	if (!input.IsInput())
289902701e6SDario Casalinuovo		return NULL;
290902701e6SDario Casalinuovo
29183bcc405SBarrett	return _FindInput(input.destination);
292902701e6SDario Casalinuovo}
293902701e6SDario Casalinuovo
294902701e6SDario Casalinuovo
2956d025521SDario CasalinuovoBMediaOutput*
296902701e6SDario CasalinuovoBMediaClient::FindOutput(const media_connection& output) const
297902701e6SDario Casalinuovo{
298902701e6SDario Casalinuovo	CALLED();
299902701e6SDario Casalinuovo
300902701e6SDario Casalinuovo	if (!output.IsOutput())
301902701e6SDario Casalinuovo		return NULL;
302902701e6SDario Casalinuovo
30383bcc405SBarrett	return _FindOutput(output.source);
3049b410c41SDario Casalinuovo}
3059b410c41SDario Casalinuovo
3069b410c41SDario Casalinuovo
3079b410c41SDario Casalinuovobool
308852b6295SBarrettBMediaClient::IsStarted() const
3099b410c41SDario Casalinuovo{
3109b410c41SDario Casalinuovo	CALLED();
3119b410c41SDario Casalinuovo
3129b410c41SDario Casalinuovo	return fRunning;
3139b410c41SDario Casalinuovo}
3149b410c41SDario Casalinuovo
3159b410c41SDario Casalinuovo
316a6ac14c7SBarrettvoid
317a6ac14c7SBarrettBMediaClient::ClientRegistered()
318a6ac14c7SBarrett{
319a6ac14c7SBarrett	CALLED();
320a6ac14c7SBarrett}
321a6ac14c7SBarrett
322a6ac14c7SBarrett
3239b410c41SDario Casalinuovostatus_t
324550e05afSDario CasalinuovoBMediaClient::Start()
3259b410c41SDario Casalinuovo{
3269b410c41SDario Casalinuovo	CALLED();
3279b410c41SDario Casalinuovo
3289b410c41SDario Casalinuovo	status_t err = B_OK;
3299b410c41SDario Casalinuovo	for (int32 i = 0; i < CountOutputs(); i++) {
33083bcc405SBarrett		media_node remoteNode = OutputAt(i)->Connection().remote_node;
3319b410c41SDario Casalinuovo		if (remoteNode.kind & B_TIME_SOURCE)
3329b410c41SDario Casalinuovo			err = BMediaRoster::CurrentRoster()->StartTimeSource(
3339b410c41SDario Casalinuovo				remoteNode, BTimeSource::RealTime());
3349b410c41SDario Casalinuovo		else
3359b410c41SDario Casalinuovo			err = BMediaRoster::CurrentRoster()->StartNode(
3369b410c41SDario Casalinuovo				remoteNode, fNode->TimeSource()->Now());
3379b410c41SDario Casalinuovo	}
3389b410c41SDario Casalinuovo
339e7aa210bSDario Casalinuovo	return BMediaRoster::CurrentRoster()->StartNode(
3409b410c41SDario Casalinuovo		fNode->Node(), fNode->TimeSource()->Now());
3419b410c41SDario Casalinuovo}
3429b410c41SDario Casalinuovo
3439b410c41SDario Casalinuovo
3449b410c41SDario Casalinuovostatus_t
345550e05afSDario CasalinuovoBMediaClient::Stop()
3469b410c41SDario Casalinuovo{
3479b410c41SDario Casalinuovo	CALLED();
3489b410c41SDario Casalinuovo
349e7aa210bSDario Casalinuovo	return BMediaRoster::CurrentRoster()->StopNode(
3509b410c41SDario Casalinuovo		fNode->Node(), fNode->TimeSource()->Now());
3519b410c41SDario Casalinuovo}
3529b410c41SDario Casalinuovo
3539b410c41SDario Casalinuovo
3549b410c41SDario Casalinuovostatus_t
3559b410c41SDario CasalinuovoBMediaClient::Seek(bigtime_t mediaTime,
3569b410c41SDario Casalinuovo	bigtime_t performanceTime)
3579b410c41SDario Casalinuovo{
3589b410c41SDario Casalinuovo	CALLED();
3599b410c41SDario Casalinuovo
3609b410c41SDario Casalinuovo	return BMediaRoster::CurrentRoster()->SeekNode(fNode->Node(),
3619b410c41SDario Casalinuovo		mediaTime, performanceTime);
3629b410c41SDario Casalinuovo}
3639b410c41SDario Casalinuovo
3649b410c41SDario Casalinuovo
3659b410c41SDario Casalinuovostatus_t
3669b410c41SDario CasalinuovoBMediaClient::Roll(bigtime_t start, bigtime_t stop, bigtime_t seek)
3679b410c41SDario Casalinuovo{
3689b410c41SDario Casalinuovo	CALLED();
3699b410c41SDario Casalinuovo
3709b410c41SDario Casalinuovo	return BMediaRoster::CurrentRoster()->RollNode(fNode->Node(),
3719b410c41SDario Casalinuovo		start, stop, seek);
3729b410c41SDario Casalinuovo}
3739b410c41SDario Casalinuovo
3749b410c41SDario Casalinuovo
3759b410c41SDario Casalinuovobigtime_t
3769e9655edSDario CasalinuovoBMediaClient::CurrentTime() const
3779b410c41SDario Casalinuovo{
3789b410c41SDario Casalinuovo	CALLED();
3799b410c41SDario Casalinuovo
3809e9655edSDario Casalinuovo	return fCurrentTime;
3819b410c41SDario Casalinuovo}
3829b410c41SDario Casalinuovo
3839b410c41SDario Casalinuovo
3849b410c41SDario CasalinuovoBMediaAddOn*
3859b410c41SDario CasalinuovoBMediaClient::AddOn(int32* id) const
3869b410c41SDario Casalinuovo{
3879b410c41SDario Casalinuovo	CALLED();
3889b410c41SDario Casalinuovo
3899b410c41SDario Casalinuovo	return NULL;
3909b410c41SDario Casalinuovo}
3919b410c41SDario Casalinuovo
3929b410c41SDario Casalinuovo
3939b410c41SDario Casalinuovovoid
394ecb39585SDario CasalinuovoBMediaClient::HandleStart(bigtime_t performanceTime)
3959b410c41SDario Casalinuovo{
396e7aa210bSDario Casalinuovo	fRunning = true;
397ecb39585SDario Casalinuovo}
398ecb39585SDario Casalinuovo
399ecb39585SDario Casalinuovo
400ecb39585SDario Casalinuovovoid
401ecb39585SDario CasalinuovoBMediaClient::HandleStop(bigtime_t performanceTime)
402ecb39585SDario Casalinuovo{
403e7aa210bSDario Casalinuovo	fRunning = false;
404ecb39585SDario Casalinuovo}
405ecb39585SDario Casalinuovo
406ecb39585SDario Casalinuovo
407ecb39585SDario Casalinuovovoid
408ecb39585SDario CasalinuovoBMediaClient::HandleSeek(bigtime_t mediaTime, bigtime_t performanceTime)
409ecb39585SDario Casalinuovo{
410ecb39585SDario Casalinuovo}
411ecb39585SDario Casalinuovo
412ecb39585SDario Casalinuovo
413ecb39585SDario Casalinuovostatus_t
414d64dd7beSDario CasalinuovoBMediaClient::FormatSuggestion(media_type type, int32 quality,
415ecb39585SDario Casalinuovo	media_format* format)
416ecb39585SDario Casalinuovo{
417ecb39585SDario Casalinuovo	return B_ERROR;
418ecb39585SDario Casalinuovo}
4199b410c41SDario Casalinuovo
420ecb39585SDario Casalinuovo
4219b410c41SDario Casalinuovovoid
4229b410c41SDario CasalinuovoBMediaClient::_Init()
4239b410c41SDario Casalinuovo{
4249b410c41SDario Casalinuovo	CALLED();
4259b410c41SDario Casalinuovo
4269b410c41SDario Casalinuovo	BMediaRoster* roster = BMediaRoster::Roster(&fInitErr);
4279b410c41SDario Casalinuovo	if (fInitErr == B_OK && roster != NULL)
4289b410c41SDario Casalinuovo		fInitErr = roster->RegisterNode(fNode);
4299b410c41SDario Casalinuovo}
4309b410c41SDario Casalinuovo
4319b410c41SDario Casalinuovo
4329b410c41SDario Casalinuovovoid
4339b410c41SDario CasalinuovoBMediaClient::_Deinit()
4349b410c41SDario Casalinuovo{
4359b410c41SDario Casalinuovo	CALLED();
4369b410c41SDario Casalinuovo
437852b6295SBarrett	if (IsStarted())
4389b410c41SDario Casalinuovo		Stop();
4399b410c41SDario Casalinuovo
4409b410c41SDario Casalinuovo	Disconnect();
4419b410c41SDario Casalinuovo
4420844ddf4SDario Casalinuovo	// This will release the connections too.
4430844ddf4SDario Casalinuovo	fInputs.MakeEmpty(true);
4440844ddf4SDario Casalinuovo	fOutputs.MakeEmpty(true);
4450844ddf4SDario Casalinuovo
4469b410c41SDario Casalinuovo	fNode->Release();
4479b410c41SDario Casalinuovo}
4489b410c41SDario Casalinuovo
4499b410c41SDario Casalinuovo
450d64dd7beSDario Casalinuovovoid
451d64dd7beSDario CasalinuovoBMediaClient::_AddInput(BMediaInput* input)
452d64dd7beSDario Casalinuovo{
453d64dd7beSDario Casalinuovo	CALLED();
454d64dd7beSDario Casalinuovo
4550844ddf4SDario Casalinuovo	fInputs.AddItem(new InputReleaser(input));
456d64dd7beSDario Casalinuovo}
457d64dd7beSDario Casalinuovo
458d64dd7beSDario Casalinuovo
459d64dd7beSDario Casalinuovovoid
460d64dd7beSDario CasalinuovoBMediaClient::_AddOutput(BMediaOutput* output)
461d64dd7beSDario Casalinuovo{
462d64dd7beSDario Casalinuovo	CALLED();
463d64dd7beSDario Casalinuovo
4640844ddf4SDario Casalinuovo	fOutputs.AddItem(new OutputReleaser(output));
465d64dd7beSDario Casalinuovo}
466d64dd7beSDario Casalinuovo
467d64dd7beSDario Casalinuovo
468d64dd7beSDario CasalinuovoBMediaInput*
469d64dd7beSDario CasalinuovoBMediaClient::_FindInput(const media_destination& dest) const
470d64dd7beSDario Casalinuovo{
471d64dd7beSDario Casalinuovo	CALLED();
472d64dd7beSDario Casalinuovo
473d64dd7beSDario Casalinuovo	for (int32 i = 0; i < CountInputs(); i++) {
474d64dd7beSDario Casalinuovo		if (dest.id == InputAt(i)->_Destination().id)
475d64dd7beSDario Casalinuovo			return InputAt(i);
476d64dd7beSDario Casalinuovo	}
477d64dd7beSDario Casalinuovo	return NULL;
478d64dd7beSDario Casalinuovo}
479d64dd7beSDario Casalinuovo
480d64dd7beSDario Casalinuovo
481d64dd7beSDario CasalinuovoBMediaOutput*
482d64dd7beSDario CasalinuovoBMediaClient::_FindOutput(const media_source& source) const
483d64dd7beSDario Casalinuovo{
484d64dd7beSDario Casalinuovo	CALLED();
485d64dd7beSDario Casalinuovo
486d64dd7beSDario Casalinuovo	for (int32 i = 0; i < CountOutputs(); i++) {
487d64dd7beSDario Casalinuovo		if (source.id == OutputAt(i)->_Source().id)
488d64dd7beSDario Casalinuovo			return OutputAt(i);
489d64dd7beSDario Casalinuovo	}
490d64dd7beSDario Casalinuovo	return NULL;
491d64dd7beSDario Casalinuovo}
492d64dd7beSDario Casalinuovo
493d64dd7beSDario Casalinuovo
4949b410c41SDario Casalinuovostatus_t
4956d025521SDario CasalinuovoBMediaClient::_ConnectInput(BMediaOutput* output,
496f506f305SDario Casalinuovo	const media_connection& input)
4979b410c41SDario Casalinuovo{
4989b410c41SDario Casalinuovo	CALLED();
4999b410c41SDario Casalinuovo
50083bcc405SBarrett	if (input.destination == media_destination::null)
501f506f305SDario Casalinuovo		return B_MEDIA_BAD_DESTINATION;
5029b410c41SDario Casalinuovo
5036dc7d854SBarrett	media_output ourOutput = output->Connection()._BuildMediaOutput();
5046dc7d854SBarrett	media_input theirInput = input._BuildMediaInput();
5056dc7d854SBarrett	media_format format;
5069b410c41SDario Casalinuovo
5076dc7d854SBarrett	// NOTE: We want to set this data in the callbacks if possible.
5086dc7d854SBarrett	// The correct format should have been set in BMediaConnection::Connected.
5096dc7d854SBarrett	// TODO: Perhaps add some check assert?
5106dc7d854SBarrett
5116dc7d854SBarrett	status_t ret = BMediaRoster::CurrentRoster()->Connect(ourOutput.source,
512f506f305SDario Casalinuovo		theirInput.destination, &format, &ourOutput, &theirInput,
513f506f305SDario Casalinuovo		BMediaRoster::B_CONNECT_MUTED);
5146dc7d854SBarrett
5156dc7d854SBarrett#if 0
5166dc7d854SBarrett	if (ret == B_OK)
5176dc7d854SBarrett		output->fConnection.format = format;
5186dc7d854SBarrett#endif
5196dc7d854SBarrett
5206dc7d854SBarrett	return ret;
5219b410c41SDario Casalinuovo}
5229b410c41SDario Casalinuovo
5239b410c41SDario Casalinuovo
5249b410c41SDario Casalinuovostatus_t
5256d025521SDario CasalinuovoBMediaClient::_ConnectOutput(BMediaInput* input,
526f506f305SDario Casalinuovo	const media_connection& output)
5279b410c41SDario Casalinuovo{
5289b410c41SDario Casalinuovo	CALLED();
5299b410c41SDario Casalinuovo
53083bcc405SBarrett	if (output.source == media_source::null)
5319b410c41SDario Casalinuovo		return B_MEDIA_BAD_SOURCE;
5329b410c41SDario Casalinuovo
5336dc7d854SBarrett	media_input ourInput = input->Connection()._BuildMediaInput();
5346dc7d854SBarrett	media_output theirOutput = output._BuildMediaOutput();
5356dc7d854SBarrett	media_format format;
5369b410c41SDario Casalinuovo
5376dc7d854SBarrett	// NOTE: We want to set this data in the callbacks if possible.
5386dc7d854SBarrett	// The correct format should have been set in BMediaConnection::Connected.
5396dc7d854SBarrett	// TODO: Perhaps add some check assert?
5406dc7d854SBarrett
5416dc7d854SBarrett	status_t ret = BMediaRoster::CurrentRoster()->Connect(theirOutput.source,
5429b410c41SDario Casalinuovo		ourInput.destination, &format, &theirOutput, &ourInput,
5439b410c41SDario Casalinuovo		BMediaRoster::B_CONNECT_MUTED);
5446dc7d854SBarrett
5456dc7d854SBarrett#if 0
5466dc7d854SBarrett	if (ret == B_OK)
5476dc7d854SBarrett		input->fConnection.format = format;
5486dc7d854SBarrett#endif
5496dc7d854SBarrett
5506dc7d854SBarrett	return ret;
5519b410c41SDario Casalinuovo}
5529b410c41SDario Casalinuovo
5539b410c41SDario Casalinuovo
554991d9dbfSDario Casalinuovostatus_t
555991d9dbfSDario CasalinuovoBMediaClient::_DisconnectConnection(BMediaConnection* conn)
556991d9dbfSDario Casalinuovo{
5576072c6f1SBarrett	CALLED();
5586072c6f1SBarrett
559991d9dbfSDario Casalinuovo	if (conn->Client() != this)
560991d9dbfSDario Casalinuovo		return B_ERROR;
561991d9dbfSDario Casalinuovo
562991d9dbfSDario Casalinuovo	const media_connection& handle = conn->Connection();
563991d9dbfSDario Casalinuovo	if (handle.IsInput()) {
564991d9dbfSDario Casalinuovo		return BMediaRoster::CurrentRoster()->Disconnect(
56583bcc405SBarrett			handle.remote_node.node, handle.source,
56683bcc405SBarrett			handle._Node().node, handle.destination);
567991d9dbfSDario Casalinuovo	} else {
568991d9dbfSDario Casalinuovo		return BMediaRoster::CurrentRoster()->Disconnect(
56983bcc405SBarrett			handle._Node().node, handle.source,
57083bcc405SBarrett			handle.remote_node.node, handle.destination);
571991d9dbfSDario Casalinuovo	}
572991d9dbfSDario Casalinuovo
573991d9dbfSDario Casalinuovo	return B_ERROR;
574991d9dbfSDario Casalinuovo}
575991d9dbfSDario Casalinuovo
576991d9dbfSDario Casalinuovo
577991d9dbfSDario Casalinuovostatus_t
578991d9dbfSDario CasalinuovoBMediaClient::_ReleaseConnection(BMediaConnection* conn)
579991d9dbfSDario Casalinuovo{
580991d9dbfSDario Casalinuovo	if (conn->Client() != this)
581991d9dbfSDario Casalinuovo		return B_ERROR;
582991d9dbfSDario Casalinuovo
583991d9dbfSDario Casalinuovo	if (conn->Connection().IsInput()) {
584991d9dbfSDario Casalinuovo		InputReleaser obj = InputReleaser(dynamic_cast<BMediaInput*>(conn));
585991d9dbfSDario Casalinuovo		fInputs.RemoveItem(&obj);
586991d9dbfSDario Casalinuovo		return B_OK;
587991d9dbfSDario Casalinuovo	} else {
588991d9dbfSDario Casalinuovo		OutputReleaser obj = OutputReleaser(dynamic_cast<BMediaOutput*>(conn));
589991d9dbfSDario Casalinuovo		fOutputs.RemoveItem(&obj);
590991d9dbfSDario Casalinuovo		return B_OK;
591991d9dbfSDario Casalinuovo	}
592991d9dbfSDario Casalinuovo
593991d9dbfSDario Casalinuovo	return B_ERROR;
594991d9dbfSDario Casalinuovo}
595991d9dbfSDario Casalinuovo
596991d9dbfSDario Casalinuovo
5979b410c41SDario Casalinuovovoid BMediaClient::_ReservedMediaClient0() {}
5989b410c41SDario Casalinuovovoid BMediaClient::_ReservedMediaClient1() {}
5999b410c41SDario Casalinuovovoid BMediaClient::_ReservedMediaClient2() {}
6009b410c41SDario Casalinuovovoid BMediaClient::_ReservedMediaClient3() {}
6019b410c41SDario Casalinuovovoid BMediaClient::_ReservedMediaClient4() {}
6029b410c41SDario Casalinuovovoid BMediaClient::_ReservedMediaClient5() {}
6039b410c41SDario Casalinuovovoid BMediaClient::_ReservedMediaClient6() {}
6049b410c41SDario Casalinuovovoid BMediaClient::_ReservedMediaClient7() {}
6059b410c41SDario Casalinuovovoid BMediaClient::_ReservedMediaClient8() {}
6069b410c41SDario Casalinuovovoid BMediaClient::_ReservedMediaClient9() {}
6079b410c41SDario Casalinuovovoid BMediaClient::_ReservedMediaClient10() {}
608