void AudioSettingsView::_FillChannelMenu(const dormant_node_info* nodeInfo) { _EmptyMenu(fChannelMenu); BMediaRoster* roster = BMediaRoster::Roster(); media_node node; media_node_id node_id; status_t err = roster->GetInstancesFor(nodeInfo->addon, nodeInfo->flavor_id, &node_id); if (err != B_OK) { err = roster->InstantiateDormantNode(*nodeInfo, &node, B_FLAVOR_IS_GLOBAL); } else { err = roster->GetNodeFor(node_id, &node); } if (err == B_OK) { int32 inputCount = 4; media_input* inputs = new media_input[inputCount]; BPrivate::ArrayDeleter<media_input> inputDeleter(inputs); while (true) { int32 realInputCount = 0; err = roster->GetAllInputsFor(node, inputs, inputCount, &realInputCount); if (realInputCount > inputCount) { inputCount *= 2; inputs = new media_input[inputCount]; inputDeleter.SetTo(inputs); } else { inputCount = realInputCount; break; } } if (err == B_OK) { BMessage message(ML_DEFAULT_CHANNEL_CHANGED); for (int32 i = 0; i < inputCount; i++) { media_input* input = new media_input(); memcpy(input, &inputs[i], sizeof(*input)); ChannelMenuItem* channelItem = new ChannelMenuItem(input, new BMessage(message)); fChannelMenu->AddItem(channelItem); if (channelItem->DestinationID() == 0) channelItem->SetMarked(true); } } } if (Window()) fChannelMenu->SetTargetForItems(BMessenger(this)); }