* 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
This commit is contained in:
Jérôme Duval 2010-01-17 16:51:06 +00:00
parent deed298ba4
commit 1952dab0df
1 changed files with 27 additions and 23 deletions

View File

@ -341,8 +341,8 @@ MediaAddonServer::QuitRequested()
{ {
CALLED(); CALLED();
InfoMap::iterator iterator = fInfoMap.begin(); InfoMap::reverse_iterator iterator = fInfoMap.rbegin();
for (; iterator != fInfoMap.end(); iterator++) { for (; iterator != fInfoMap.rend(); iterator++) {
AddOnInfo& info = iterator->second; AddOnInfo& info = iterator->second;
_DestroyInstantiatedFlavors(info); _DestroyInstantiatedFlavors(info);
@ -603,11 +603,14 @@ MediaAddonServer::_AddOnAdded(const char* path, ino_t fileNode)
void void
MediaAddonServer::_DestroyInstantiatedFlavors(AddOnInfo& info) MediaAddonServer::_DestroyInstantiatedFlavors(AddOnInfo& info)
{ {
printf("MediaAddonServer::_DestroyInstantiatedFlavors\n"); printf("MediaAddonServer::_DestroyInstantiatedFlavors addon %ld\n", info.id);
NodeVector::iterator iterator = info.active_flavors.begin(); NodeVector::reverse_iterator iterator = info.active_flavors.rbegin();
for (; iterator != info.active_flavors.end(); iterator++) { for (; iterator != info.active_flavors.rend(); iterator++) {
media_node& node = *iterator; media_node& node = *iterator;
printf("node %ld\n", node.node);
if ((node.kind & B_TIME_SOURCE) != 0 if ((node.kind & B_TIME_SOURCE) != 0
&& (fMediaRoster->StopTimeSource(node, 0, true) != B_OK)) { && (fMediaRoster->StopTimeSource(node, 0, true) != B_OK)) {
printf("MediaAddonServer::_DestroyInstantiatedFlavors couldn't stop " printf("MediaAddonServer::_DestroyInstantiatedFlavors couldn't stop "
@ -676,6 +679,8 @@ MediaAddonServer::_DestroyInstantiatedFlavors(AddOnInfo& info)
} }
} }
} }
fMediaRoster->ReleaseNode(node);
} }
info.active_flavors.clear(); info.active_flavors.clear();
@ -744,27 +749,26 @@ MediaAddonServer::_InstantiateAutostartFlavors(AddOnInfo& info)
bool hasMore; bool hasMore;
status_t status = info.addon->AutoStart(index, &node, &internalID, status_t status = info.addon->AutoStart(index, &node, &internalID,
&hasMore); &hasMore);
if (status == B_OK) { if (status == B_MEDIA_ADDON_FAILED && hasMore)
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) {
continue; continue;
} else { else if (status != B_OK)
break; 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;
} }
} }