DestroyInstantiatedFlavors

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5561 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2003-12-04 08:41:26 +00:00
parent fd54330a11
commit 1dbb61270b
+90 -6
View File
@@ -73,6 +73,7 @@ public:
MediaAddonServer(const char *sig); MediaAddonServer(const char *sig);
~MediaAddonServer(); ~MediaAddonServer();
void ReadyToRun(); void ReadyToRun();
bool QuitRequested();
void MessageReceived(BMessage *msg); void MessageReceived(BMessage *msg);
void WatchDir(BEntry *dir); void WatchDir(BEntry *dir);
@@ -82,7 +83,7 @@ public:
static int32 controlthread(void *arg); static int32 controlthread(void *arg);
void PutAddonIfPossible(AddOnInfo *info); void PutAddonIfPossible(AddOnInfo *info);
void InstantiatePhysialInputsAndOutputs(AddOnInfo *info); void InstantiatePhysicalInputsAndOutputs(AddOnInfo *info);
void InstantiateAutostartFlavors(AddOnInfo *info); void InstantiateAutostartFlavors(AddOnInfo *info);
void DestroyInstantiatedFlavors(AddOnInfo *info); void DestroyInstantiatedFlavors(AddOnInfo *info);
@@ -97,12 +98,15 @@ public:
port_id control_port; port_id control_port;
thread_id control_thread; thread_id control_thread;
bool fStartup; bool fStartup;
typedef BApplication inherited;
}; };
MediaAddonServer::MediaAddonServer(const char *sig) : MediaAddonServer::MediaAddonServer(const char *sig) :
BApplication(sig), BApplication(sig),
fStartup(true) fStartup(true)
{ {
CALLED();
mediaroster = BMediaRoster::Roster(); mediaroster = BMediaRoster::Roster();
filemap = new Map<ino_t, media_addon_id>; filemap = new Map<ino_t, media_addon_id>;
infomap = new Map<media_addon_id, AddOnInfo>; infomap = new Map<media_addon_id, AddOnInfo>;
@@ -113,6 +117,8 @@ MediaAddonServer::MediaAddonServer(const char *sig) :
MediaAddonServer::~MediaAddonServer() MediaAddonServer::~MediaAddonServer()
{ {
CALLED();
delete_port(control_port); delete_port(control_port);
status_t err; status_t err;
wait_for_thread(control_thread,&err); wait_for_thread(control_thread,&err);
@@ -239,7 +245,7 @@ MediaAddonServer::ReadyToRun()
infomap->Rewind(); infomap->Rewind();
while (infomap->GetNext(&info)) while (infomap->GetNext(&info))
InstantiatePhysialInputsAndOutputs(info); InstantiatePhysicalInputsAndOutputs(info);
infomap->Rewind(); infomap->Rewind();
while (infomap->GetNext(&info)) while (infomap->GetNext(&info))
@@ -253,6 +259,23 @@ MediaAddonServer::ReadyToRun()
SendToServer(SERVER_RESCAN_DEFAULTS, &cmd, sizeof(cmd)); SendToServer(SERVER_RESCAN_DEFAULTS, &cmd, sizeof(cmd));
} }
bool
MediaAddonServer::QuitRequested()
{
CALLED();
AddOnInfo *info;
infomap->Rewind();
while(infomap->GetNext(&info)) {
DestroyInstantiatedFlavors(info);
PutAddonIfPossible(info);
}
return true;
}
void void
MediaAddonServer::ScanAddOnFlavors(BMediaAddOn *addon) MediaAddonServer::ScanAddOnFlavors(BMediaAddOn *addon)
{ {
@@ -399,7 +422,7 @@ MediaAddonServer::AddOnAdded(const char *path, ino_t file_node)
// After startup is done, we simply do it for each new // After startup is done, we simply do it for each new
// loaded add-on, too. // loaded add-on, too.
if (!fStartup) { if (!fStartup) {
InstantiatePhysialInputsAndOutputs(info); InstantiatePhysicalInputsAndOutputs(info);
InstantiateAutostartFlavors(info); InstantiateAutostartFlavors(info);
PutAddonIfPossible(info); PutAddonIfPossible(info);
@@ -415,7 +438,66 @@ MediaAddonServer::AddOnAdded(const char *path, ino_t file_node)
void void
MediaAddonServer::DestroyInstantiatedFlavors(AddOnInfo *info) MediaAddonServer::DestroyInstantiatedFlavors(AddOnInfo *info)
{ {
printf("MediaAddonServer::DestroyInstantiatedFlavors"); printf("MediaAddonServer::DestroyInstantiatedFlavors\n");
media_node *node;
while (info->active_flavors.GetNext(&node)) {
if ((node->kind & B_TIME_SOURCE)
&& (mediaroster->StopTimeSource(*node, 0, true)!=B_OK)) {
printf("MediaAddonServer::DestroyInstantiatedFlavors couldn't stop timesource\n");
continue;
}
if(mediaroster->StopNode(*node, 0, true)!=B_OK) {
printf("MediaAddonServer::DestroyInstantiatedFlavors couldn't stop node\n");
continue;
}
if (node->kind & B_BUFFER_CONSUMER) {
media_input inputs[16];
int32 count = 0;
if(mediaroster->GetConnectedInputsFor(*node, inputs, 16, &count)!=B_OK) {
printf("MediaAddonServer::DestroyInstantiatedFlavors couldn't get connected inputs\n");
continue;
}
for(int32 i=0; i<count; i++) {
media_node_id sourceNode;
if((sourceNode = mediaroster->NodeIDFor(inputs[i].source.port)) < 0) {
printf("MediaAddonServer::DestroyInstantiatedFlavors couldn't get source node id\n");
continue;
}
if(mediaroster->Disconnect(sourceNode, inputs[i].source, node->node, inputs[i].destination)!=B_OK) {
printf("MediaAddonServer::DestroyInstantiatedFlavors couldn't disconnect input\n");
continue;
}
}
}
if (node->kind & B_BUFFER_PRODUCER) {
media_output outputs[16];
int32 count = 0;
if(mediaroster->GetConnectedOutputsFor(*node, outputs, 16, &count)!=B_OK) {
printf("MediaAddonServer::DestroyInstantiatedFlavors couldn't get connected outputs\n");
continue;
}
for(int32 i=0; i<count; i++) {
media_node_id destNode;
if((destNode = mediaroster->NodeIDFor(outputs[i].destination.port)) < 0) {
printf("MediaAddonServer::DestroyInstantiatedFlavors couldn't get destination node id\n");
continue;
}
if(mediaroster->Disconnect(node->node, outputs[i].source, destNode, outputs[i].destination)!=B_OK) {
printf("MediaAddonServer::DestroyInstantiatedFlavors couldn't disconnect output\n");
continue;
}
}
}
info->active_flavors.RemoveCurrent();
}
} }
void void
@@ -428,8 +510,9 @@ MediaAddonServer::PutAddonIfPossible(AddOnInfo *info)
} }
void void
MediaAddonServer::InstantiatePhysialInputsAndOutputs(AddOnInfo *info) MediaAddonServer::InstantiatePhysicalInputsAndOutputs(AddOnInfo *info)
{ {
CALLED();
int count = info->addon->CountFlavors(); int count = info->addon->CountFlavors();
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
const flavor_info *flavorinfo; const flavor_info *flavorinfo;
@@ -620,6 +703,7 @@ MediaAddonServer::MessageReceived(BMessage *msg)
} }
break; break;
} }
default: inherited::MessageReceived(msg); break;
} }
printf("MediaAddonServer: Unhandled message:\n"); printf("MediaAddonServer: Unhandled message:\n");
msg->PrintToStream(); msg->PrintToStream();
@@ -627,7 +711,7 @@ MediaAddonServer::MessageReceived(BMessage *msg)
int main() int main()
{ {
new MediaAddonServer("application/x-vnd.OpenBeOS-media-addon-server"); new MediaAddonServer("application/x-vnd.OpenBeOS-addon-host");
be_app->Run(); be_app->Run();
return 0; return 0;
} }