From 1952dab0dfdf02a6d2be05a26f0fb593dda24bf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sun, 17 Jan 2010 16:51:06 +0000 Subject: [PATCH] * we release nodes which were instantiated or autostarted. * I had to reverse the addons iteration when quitting, the mixer wasn't releasing correctly if released last. * use IncrementAddonFlavorInstancesCount on autostarted flavors. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35121 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/media_addon/MediaAddonServer.cpp | 50 +++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/servers/media_addon/MediaAddonServer.cpp b/src/servers/media_addon/MediaAddonServer.cpp index daa762aad4..01a9056eb2 100644 --- a/src/servers/media_addon/MediaAddonServer.cpp +++ b/src/servers/media_addon/MediaAddonServer.cpp @@ -341,8 +341,8 @@ MediaAddonServer::QuitRequested() { CALLED(); - InfoMap::iterator iterator = fInfoMap.begin(); - for (; iterator != fInfoMap.end(); iterator++) { + InfoMap::reverse_iterator iterator = fInfoMap.rbegin(); + for (; iterator != fInfoMap.rend(); iterator++) { AddOnInfo& info = iterator->second; _DestroyInstantiatedFlavors(info); @@ -603,11 +603,14 @@ MediaAddonServer::_AddOnAdded(const char* path, ino_t fileNode) void MediaAddonServer::_DestroyInstantiatedFlavors(AddOnInfo& info) { - printf("MediaAddonServer::_DestroyInstantiatedFlavors\n"); + printf("MediaAddonServer::_DestroyInstantiatedFlavors addon %ld\n", info.id); - NodeVector::iterator iterator = info.active_flavors.begin(); - for (; iterator != info.active_flavors.end(); iterator++) { + NodeVector::reverse_iterator iterator = info.active_flavors.rbegin(); + for (; iterator != info.active_flavors.rend(); iterator++) { media_node& node = *iterator; + + printf("node %ld\n", node.node); + if ((node.kind & B_TIME_SOURCE) != 0 && (fMediaRoster->StopTimeSource(node, 0, true) != B_OK)) { printf("MediaAddonServer::_DestroyInstantiatedFlavors couldn't stop " @@ -676,6 +679,8 @@ MediaAddonServer::_DestroyInstantiatedFlavors(AddOnInfo& info) } } } + + fMediaRoster->ReleaseNode(node); } info.active_flavors.clear(); @@ -744,27 +749,26 @@ MediaAddonServer::_InstantiateAutostartFlavors(AddOnInfo& info) bool hasMore; status_t status = info.addon->AutoStart(index, &node, &internalID, &hasMore); - if (status == B_OK) { - printf("started node %ld\n", index); - - // TODO: IncrementAddonFlavorInstancesCount - - status = MediaRosterEx(fMediaRoster)->RegisterNode(node, info.id, - internalID); - if (status != B_OK) { - ERROR("failed to register node %ld\n", index); - // TODO: DecrementAddonFlavorInstancesCount - } - - info.active_flavors.push_back(node->Node()); - - if (!hasMore) - return; - } else if (status == B_MEDIA_ADDON_FAILED && hasMore) { + if (status == B_MEDIA_ADDON_FAILED && hasMore) continue; - } else { + else if (status != B_OK) break; + + printf("started node %ld\n", index); + + status = MediaRosterEx(fMediaRoster)->RegisterNode(node, info.id, + internalID); + if (status != B_OK) { + ERROR("failed to register node %ld\n", index); + node->Release(); + } else { + MediaRosterEx(fMediaRoster)->IncrementAddonFlavorInstancesCount( + info.id, internalID); + info.active_flavors.push_back(node->Node()); } + + if (!hasMore) + return; } }