void DormantNodeView::_populateList() { D_INTERNAL(("DormantNodeView::_populateList()\n")); // init the resizable node-info buffer BMediaRoster *roster = BMediaRoster::CurrentRoster(); const int32 bufferInc = 64; int32 bufferSize = bufferInc; dormant_node_info *infoBuffer = new dormant_node_info[bufferSize]; int32 numNodes; // fill the buffer while (true) { numNodes = bufferSize; status_t error = roster->GetDormantNodes(infoBuffer, &numNodes); if (error) { return; } if (numNodes < bufferSize) { break; } // reallocate buffer & try again delete [] infoBuffer; bufferSize += bufferInc; infoBuffer = new dormant_node_info[bufferSize]; } // populate the list for (int32 i = 0; i < numNodes; i++) { DormantNodeListItem *item = new DormantNodeListItem(infoBuffer[i]); AddItem(item); } SortItems(compareName); }
void DormantNodeView::_updateList( int32 addOnID) { D_INTERNAL(("DormantNodeView::_updateList(%ld)\n", addOnID)); // init the resizable node-info buffer BMediaRoster *roster = BMediaRoster::CurrentRoster(); const int32 bufferInc = 64; int32 bufferSize = bufferInc; dormant_node_info *infoBuffer = new dormant_node_info[bufferSize]; int32 numNodes; // fill the buffer while (true) { numNodes = bufferSize; status_t error = roster->GetDormantNodes(infoBuffer, &numNodes); if (error) { return; } if (numNodes < bufferSize) { break; } // reallocate buffer & try again delete [] infoBuffer; bufferSize += bufferInc; infoBuffer = new dormant_node_info[bufferSize]; } // sort the list by add-on id to avoid multiple searches through // the list SortItems(compareAddOnID); // Remove all nodes managed by this add-on int32 start; for (start = 0; start < CountItems(); start++) { DormantNodeListItem *item = dynamic_cast<DormantNodeListItem *>(ItemAt(start)); if (item && (item->info().addon == addOnID)) { break; } } int32 count = 0; for (int32 i = start; start < CountItems(); i++) { DormantNodeListItem *item = dynamic_cast<DormantNodeListItem *>(ItemAt(i)); if (!item || (item->info().addon != addOnID)) { break; } count++; } RemoveItems(start, count); // add the items for (int32 i = 0; i < numNodes; i++) { if (infoBuffer[i].addon != addOnID) { continue; } AddItem(new DormantNodeListItem(infoBuffer[i])); } SortItems(compareName); }
void MediaWindow::_FindNodes(media_type type, uint64 kind, NodeList& into) { dormant_node_info nodeInfo[64]; int32 nodeInfoCount = 64; media_format format; media_format* nodeInputFormat = NULL; media_format* nodeOutputFormat = NULL; format.type = type; // output nodes must be BBufferConsumers => they have an input format // input nodes must be BBufferProducers => they have an output format if ((kind & B_PHYSICAL_OUTPUT) != 0) nodeInputFormat = &format; else if ((kind & B_PHYSICAL_INPUT) != 0) nodeOutputFormat = &format; else return; BMediaRoster* roster = BMediaRoster::Roster(); if (roster->GetDormantNodes(nodeInfo, &nodeInfoCount, nodeInputFormat, nodeOutputFormat, NULL, kind) != B_OK) { // TODO: better error reporting! fprintf(stderr, "error\n"); return; } for (int32 i = 0; i < nodeInfoCount; i++) { PRINT(("node : %s, media_addon %i, flavor_id %i\n", nodeInfo[i].name, (int)nodeInfo[i].addon, (int)nodeInfo[i].flavor_id)); dormant_node_info* info = new dormant_node_info(); strncpy(info->name, nodeInfo[i].name, B_MEDIA_NAME_LENGTH); info->flavor_id = nodeInfo[i].flavor_id; info->addon = nodeInfo[i].addon; into.AddItem(info); } }