/* * Copyright 2002, Marcus Overhagen. All rights reserved. * Distributed under the terms of the MIT License. */ #include "TList.h" #include "TMap.h" #include "TStack.h" #include "DataExchange.h" struct registered_node { media_node_id nodeid; media_addon_id addon_id; int32 addon_flavor_id; char name[B_MEDIA_NAME_LENGTH]; uint64 kinds; port_id port; team_id creator; // team that created the node team_id team; // team that contains the node object int32 globalrefcount; Map teamrefcount; List inputlist; List outputlist; }; struct dormant_addon_flavor_info { media_addon_id AddonID; int32 AddonFlavorID; int32 MaxInstancesCount; int32 GlobalInstancesCount; Map TeamInstancesCount; bool InfoValid; dormant_flavor_info Info; }; class DefaultManager; class BufferManager; class NodeManager { public: NodeManager(); ~NodeManager(); status_t LoadState(); status_t SaveState(); void Dump(); /* Management of system wide default nodes */ status_t SetDefaultNode(node_type type, const media_node *node, const dormant_node_info *info, const media_input *input); status_t GetDefaultNode(media_node_id *nodeid, char *input_name, int32 *input_id, node_type type); status_t RescanDefaultNodes(); /* Management of live nodes */ status_t RegisterNode(media_node_id *nodeid, media_addon_id addon_id, int32 addon_flavor_id, const char *name, uint64 kinds, port_id port, team_id team); status_t UnregisterNode(media_addon_id *addonid, int32 *flavorid, media_node_id nodeid, team_id team); status_t GetCloneForId(media_node *node, media_node_id nodeid, team_id team); status_t GetClone(media_node *node, char *input_name, int32 *input_id, node_type type, team_id team); status_t ReleaseNode(const media_node &node, team_id team); status_t PublishInputs(const media_node &node, const media_input *inputs, int32 count); status_t PublishOutputs(const media_node &node, const media_output *outputs, int32 count); status_t FindNodeId(media_node_id *nodeid, port_id port); status_t GetLiveNodeInfo(live_node_info *live_info, const media_node &node); status_t GetInstances(media_node_id *node_ids, int32* count, int32 maxcount, media_addon_id addon_id, int32 addon_flavor_id); status_t GetLiveNodes(Stack *livenodes, int32 maxcount, const media_format *inputformat = NULL, const media_format *outputformat = NULL, const char* name = NULL, uint64 require_kinds = 0); status_t GetDormantNodeInfo(dormant_node_info *node_info, const media_node &node); status_t IncrementGlobalRefCount(media_node_id nodeid, team_id team); status_t DecrementGlobalRefCount(media_node_id nodeid, team_id team); status_t SetNodeCreator(media_node_id nodeid, team_id creator); void FinalReleaseNode(media_node_id nodeid); /* Add media_node_id of all live nodes to the message * int32 "media_node_id" (multiple items) */ status_t GetLiveNodes(BMessage *msg); void RegisterAddon(const entry_ref &ref, media_addon_id *newid); void UnregisterAddon(media_addon_id id); void AddDormantFlavorInfo(const dormant_flavor_info &dfi); void InvalidateDormantFlavorInfo(media_addon_id id); void RemoveDormantFlavorInfo(media_addon_id id); void CleanupDormantFlavorInfos(); status_t IncrementAddonFlavorInstancesCount(media_addon_id addonid, int32 flavorid, team_id team); status_t DecrementAddonFlavorInstancesCount(media_addon_id addonid, int32 flavorid, team_id team); status_t GetAddonRef(entry_ref *ref, media_addon_id id); status_t GetDormantNodes(dormant_node_info * out_info, int32 * io_count, const media_format * has_input /* = NULL */, const media_format * has_output /* = NULL */, const char * name /* = NULL */, uint64 require_kinds /* = NULL */, uint64 deny_kinds /* = NULL */); status_t GetDormantFlavorInfoFor(media_addon_id addon, int32 flavor_id, dormant_flavor_info *outFlavor); void CleanupTeam(team_id team); private: media_addon_id fNextAddOnID; media_node_id fNextNodeID; BLocker *fLocker; List *fDormantAddonFlavorList; Map *fAddonPathMap; Map *fRegisteredNodeMap; DefaultManager *fDefaultManager; };