1a10cf76eSAxel Dörfler // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 2a10cf76eSAxel Dörfler // 3a10cf76eSAxel Dörfler // Copyright (c) 2003, OpenBeOS 4a10cf76eSAxel Dörfler // 5a10cf76eSAxel Dörfler // This software is part of the OpenBeOS distribution and is covered 6a10cf76eSAxel Dörfler // by the OpenBeOS license. 7a10cf76eSAxel Dörfler // 8a10cf76eSAxel Dörfler // 9a10cf76eSAxel Dörfler // File: MediaViews.cpp 10a10cf76eSAxel Dörfler // Author: Sikosis, Jérôme Duval 11a10cf76eSAxel Dörfler // Description: Media Preferences 12a10cf76eSAxel Dörfler // Created : June 25, 2003 13a10cf76eSAxel Dörfler // 14a10cf76eSAxel Dörfler // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 15a10cf76eSAxel Dörfler 16a10cf76eSAxel Dörfler 17a10cf76eSAxel Dörfler // Includes -------------------------------------------------------------------------------------------------- // 18a10cf76eSAxel Dörfler #include <Box.h> 19a10cf76eSAxel Dörfler #include <Button.h> 20a10cf76eSAxel Dörfler #include <MenuField.h> 21a10cf76eSAxel Dörfler #include <PopUpMenu.h> 22a10cf76eSAxel Dörfler #include <MediaRoster.h> 23a10cf76eSAxel Dörfler #include <Deskbar.h> 24a10cf76eSAxel Dörfler #include <Entry.h> 25a10cf76eSAxel Dörfler #include <stdio.h> 26a10cf76eSAxel Dörfler #include <MediaAddOn.h> 27a10cf76eSAxel Dörfler #include <String.h> 28b4a12470SJérôme Duval #include <TextView.h> 29a10cf76eSAxel Dörfler #include "MediaViews.h" 30a10cf76eSAxel Dörfler 31a10cf76eSAxel Dörfler BarView::BarView(BRect frame) 32a10cf76eSAxel Dörfler : BView (frame, "barView", B_FOLLOW_LEFT_RIGHT, B_WILL_DRAW ), 33b4a12470SJérôme Duval fDisplay(true) 34a10cf76eSAxel Dörfler { 35a10cf76eSAxel Dörfler } 36a10cf76eSAxel Dörfler 37a10cf76eSAxel Dörfler void 38a10cf76eSAxel Dörfler BarView::Draw(BRect updateRect) 39a10cf76eSAxel Dörfler { 40a10cf76eSAxel Dörfler BRect r = Bounds(); 41a10cf76eSAxel Dörfler 42b4a12470SJérôme Duval if(fDisplay) { 43a10cf76eSAxel Dörfler // Display the 3D Look Divider Bar 44a10cf76eSAxel Dörfler SetHighColor(140,140,140,0); 45a10cf76eSAxel Dörfler StrokeLine(BPoint(r.left,r.top),BPoint(r.right,r.top)); 46a10cf76eSAxel Dörfler SetHighColor(255,255,255,0); 47a10cf76eSAxel Dörfler StrokeLine(BPoint(r.left,r.bottom),BPoint(r.right,r.bottom)); 48a10cf76eSAxel Dörfler } else { 49a10cf76eSAxel Dörfler SetHighColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 50a10cf76eSAxel Dörfler StrokeLine(BPoint(r.left,r.top),BPoint(r.right,r.top)); 51a10cf76eSAxel Dörfler StrokeLine(BPoint(r.left,r.bottom),BPoint(r.right,r.bottom)); 52a10cf76eSAxel Dörfler } 53a10cf76eSAxel Dörfler } 54a10cf76eSAxel Dörfler 55a10cf76eSAxel Dörfler 56a10cf76eSAxel Dörfler SettingsView::SettingsView (BRect frame, bool isVideo) 57a10cf76eSAxel Dörfler : BView (frame, "SettingsView", B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW ), 58b4a12470SJérôme Duval fIsVideo(isVideo) 59a10cf76eSAxel Dörfler { 60a10cf76eSAxel Dörfler SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 61a10cf76eSAxel Dörfler BRect rect(frame); 62a10cf76eSAxel Dörfler rect.left += 10; 63a10cf76eSAxel Dörfler rect.top += 12; 64a10cf76eSAxel Dörfler rect.right -=21; 65a10cf76eSAxel Dörfler rect.bottom = rect.top + 104; 66a10cf76eSAxel Dörfler BBox *defaultsBox = new BBox(rect, "defaults"); 67b4a12470SJérôme Duval defaultsBox->SetLabel(fIsVideo ? "Default Nodes" : "Defaults"); 68a10cf76eSAxel Dörfler AddChild(defaultsBox); 69a10cf76eSAxel Dörfler 70a10cf76eSAxel Dörfler BRect defaultRect(20, 22, 250, 40); 71b4a12470SJérôme Duval float divider = StringWidth(fIsVideo ? "Video Output:" : "Audio Output:") + 5; 72b4a12470SJérôme Duval fMenu1 = new BPopUpMenu("<none>"); 73b4a12470SJérôme Duval fMenu1->SetLabelFromMarked(true); 74a10cf76eSAxel Dörfler BMenuField *menuField1 = new BMenuField(defaultRect, "menuField1", 75b4a12470SJérôme Duval fIsVideo ? "Video Input:" : "Audio Input:", fMenu1); 76a10cf76eSAxel Dörfler defaultsBox->AddChild(menuField1); 77aaa9b739SJérôme Duval menuField1->SetDivider(divider); 78a10cf76eSAxel Dörfler 79a10cf76eSAxel Dörfler defaultRect.OffsetBy(0, 26); 80b4a12470SJérôme Duval fMenu2 = new BPopUpMenu("<none>"); 81b4a12470SJérôme Duval fMenu2->SetLabelFromMarked(true); 82a10cf76eSAxel Dörfler BMenuField *menuField2 = new BMenuField(defaultRect, "menuField2", 83b4a12470SJérôme Duval fIsVideo ? "Video Output:" : "Audio Output:", fMenu2); 84a10cf76eSAxel Dörfler defaultsBox->AddChild(menuField2); 85aaa9b739SJérôme Duval menuField2->SetDivider(divider); 86a10cf76eSAxel Dörfler 87b4a12470SJérôme Duval if(!fIsVideo) { 88a10cf76eSAxel Dörfler defaultRect.OffsetBy(186, 0); 89b4a12470SJérôme Duval defaultRect.right -= 30; 90b4a12470SJérôme Duval fMenu3 = new BPopUpMenu("<none>"); 91b4a12470SJérôme Duval fMenu3->SetLabelFromMarked(true); 92b4a12470SJérôme Duval BMenuField *menuField3 = new BMenuField(defaultRect, "menuField3", 93b4a12470SJérôme Duval "Channel:", fMenu3); 94b4a12470SJérôme Duval defaultsBox->AddChild(menuField3); 95b4a12470SJérôme Duval menuField3->SetDivider(StringWidth("Channel:")+5); 96b4a12470SJérôme Duval defaultRect.right += 30; 97a10cf76eSAxel Dörfler defaultRect.OffsetBy(-186, 0); 98a10cf76eSAxel Dörfler } 99a10cf76eSAxel Dörfler 100a10cf76eSAxel Dörfler defaultRect.OffsetBy(0, 32); 101b4a12470SJérôme Duval defaultRect.right += 100; 102a10cf76eSAxel Dörfler rgb_color red_color = {222, 32, 33}; 103b4a12470SJérôme Duval fRestartView = new BStringView(defaultRect, "restartStringView", "Restart the Media Server to apply changes.", 104b4a12470SJérôme Duval B_FOLLOW_ALL, B_WILL_DRAW); 105b4a12470SJérôme Duval fRestartView->SetHighColor(red_color); 106b4a12470SJérôme Duval defaultsBox->AddChild(fRestartView); 107b4a12470SJérôme Duval fRestartView->Hide(); 108a10cf76eSAxel Dörfler 109a10cf76eSAxel Dörfler rect.top = rect.bottom + 10; 110a10cf76eSAxel Dörfler rect.bottom = rect.top + 162; 111a10cf76eSAxel Dörfler BBox *realtimeBox = new BBox(rect, "realtime"); 112a10cf76eSAxel Dörfler realtimeBox->SetLabel("Real-Time"); 113a10cf76eSAxel Dörfler AddChild(realtimeBox); 114a10cf76eSAxel Dörfler 115a10cf76eSAxel Dörfler BMessage *message = new BMessage(ML_ENABLE_REAL_TIME); 116b4a12470SJérôme Duval message->AddBool("isVideo", fIsVideo); 117a10cf76eSAxel Dörfler BRect rect2(22,20, 190, 40); 118b4a12470SJérôme Duval fRealtimeCheckBox = new BCheckBox(rect2, "realtimeCheckBox", 119b4a12470SJérôme Duval fIsVideo ? "Enable Real-Time Video" : "Enable Real-Time Audio", message); 120b4a12470SJérôme Duval realtimeBox->AddChild(fRealtimeCheckBox); 121a10cf76eSAxel Dörfler 122a10cf76eSAxel Dörfler uint32 flags; 123a10cf76eSAxel Dörfler BMediaRoster::Roster()->GetRealtimeFlags(&flags); 124b4a12470SJérôme Duval if(flags & (fIsVideo ? B_MEDIA_REALTIME_VIDEO : B_MEDIA_REALTIME_AUDIO)) 125b4a12470SJérôme Duval fRealtimeCheckBox->SetValue(B_CONTROL_ON); 126a10cf76eSAxel Dörfler 127a10cf76eSAxel Dörfler rect2.top += 26; 1285ffd43dcSJérôme Duval rect2.bottom = rect.Height() - 5; 129a10cf76eSAxel Dörfler rect2.right = rect.right - 15; 130a10cf76eSAxel Dörfler BRect textRect(3, 3, rect2.Width() - 3, rect2.Height() - 3); 131b4a12470SJérôme Duval BTextView *textView = new BTextView(rect2, "stringView", textRect, B_FOLLOW_ALL, B_WILL_DRAW); 132b4a12470SJérôme Duval textView->Insert(fIsVideo ? "Enabling Real-Time Video allows the BeOS to perform video operations as fast and smoothly as possible. It achieves optimum performance by using more RAM." 133b4a12470SJérôme Duval "\n\nOnly enable this feature if you need the lowest latency possible." 134b4a12470SJérôme Duval : "Enabling Real-time Audio allows BeOS to record and play audio as fast as possible. It achieves this performance by using more CPU and RAM." 135b4a12470SJérôme Duval "\n\nOnly enable this feature if you need the lowest latency possible."); 136b4a12470SJérôme Duval textView->MakeEditable(false); 137b4a12470SJérôme Duval textView->MakeSelectable(false); 138a10cf76eSAxel Dörfler textView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 139a10cf76eSAxel Dörfler realtimeBox->AddChild(textView); 140a10cf76eSAxel Dörfler 141a10cf76eSAxel Dörfler rect.top = rect.bottom + 11; 142a10cf76eSAxel Dörfler rect.bottom = rect.top + 20; 143aaa9b739SJérôme Duval rect.left = rect.right - StringWidth("Restart Media Services") - 20; 144a10cf76eSAxel Dörfler BButton *restartButton = new BButton(rect, "restartButton", 145a10cf76eSAxel Dörfler "Restart Media Services", new BMessage(ML_RESTART_MEDIA_SERVER)); 146a10cf76eSAxel Dörfler AddChild(restartButton); 147a10cf76eSAxel Dörfler 148b4a12470SJérôme Duval if(!fIsVideo) { 149b4a12470SJérôme Duval rect.right = rect.left - 10; 150a10cf76eSAxel Dörfler rect.top += 4; 151a10cf76eSAxel Dörfler rect.left = frame.left + 33; 152b4a12470SJérôme Duval if (StringWidth("Show Volume Control on Deskbar") > rect.Width() - 30) 153b4a12470SJérôme Duval rect.left -= 10; 154a10cf76eSAxel Dörfler 155b4a12470SJérôme Duval fVolumeCheckBox = new BCheckBox(rect, "volumeCheckBox", 156a10cf76eSAxel Dörfler "Show Volume Control on Deskbar", new BMessage(ML_SHOW_VOLUME_CONTROL)); 157b4a12470SJérôme Duval AddChild(fVolumeCheckBox); 158a10cf76eSAxel Dörfler 159a10cf76eSAxel Dörfler if(BDeskbar().HasItem("MediaReplicant")) 160b4a12470SJérôme Duval fVolumeCheckBox->SetValue(B_CONTROL_ON); 161a10cf76eSAxel Dörfler } 162a10cf76eSAxel Dörfler } 163a10cf76eSAxel Dörfler 164a10cf76eSAxel Dörfler void 165a10cf76eSAxel Dörfler SettingsView::AddNodes(BList &list, bool isInput) 166a10cf76eSAxel Dörfler { 167b4a12470SJérôme Duval BMenu *menu = isInput ? fMenu1 : fMenu2; 168a10cf76eSAxel Dörfler void *item; 169a10cf76eSAxel Dörfler while ((item = menu->RemoveItem((int32)0)) != NULL) 170a10cf76eSAxel Dörfler delete static_cast<dormant_node_info *>(item); 171a10cf76eSAxel Dörfler 172a10cf76eSAxel Dörfler BMessage message(ML_DEFAULT_CHANGE); 173b4a12470SJérôme Duval message.AddBool("isVideo", fIsVideo); 174a10cf76eSAxel Dörfler message.AddBool("isInput", isInput); 175a10cf76eSAxel Dörfler 176a10cf76eSAxel Dörfler for (int32 i = 0; i < list.CountItems(); i++) { 177a10cf76eSAxel Dörfler dormant_node_info *info = static_cast<dormant_node_info *>(list.ItemAt(i)); 178a10cf76eSAxel Dörfler menu->AddItem(new SettingsItem(info, new BMessage(message))); 179a10cf76eSAxel Dörfler } 180a10cf76eSAxel Dörfler } 181a10cf76eSAxel Dörfler 182a10cf76eSAxel Dörfler void 183a10cf76eSAxel Dörfler SettingsView::SetDefault(dormant_node_info &info, bool isInput, int32 outputID) 184a10cf76eSAxel Dörfler { 185b4a12470SJérôme Duval BMenu *menu = isInput ? fMenu1 : fMenu2; 186a10cf76eSAxel Dörfler 187a10cf76eSAxel Dörfler for (int32 i = 0; i < menu->CountItems(); i++) { 188a10cf76eSAxel Dörfler SettingsItem *item = static_cast<SettingsItem *>(menu->ItemAt(i)); 189b4a12470SJérôme Duval if(item->fInfo && item->fInfo->addon == info.addon && item->fInfo->flavor_id == info.flavor_id) { 190a10cf76eSAxel Dörfler item->SetMarked(true); 191a10cf76eSAxel Dörfler break; 192a10cf76eSAxel Dörfler } 193a10cf76eSAxel Dörfler } 194a10cf76eSAxel Dörfler 195b4a12470SJérôme Duval if (!fIsVideo&&!isInput&&outputID>-1) { 196a10cf76eSAxel Dörfler BMenuItem *item; 197b4a12470SJérôme Duval while ((item = fMenu3->RemoveItem((int32)0)) != NULL) 198a10cf76eSAxel Dörfler delete item; 199a10cf76eSAxel Dörfler BMediaRoster *roster = BMediaRoster::Roster(); 200a10cf76eSAxel Dörfler media_node node; 201a10cf76eSAxel Dörfler media_node_id node_id; 202a10cf76eSAxel Dörfler status_t err; 203a10cf76eSAxel Dörfler if (roster->GetInstancesFor(info.addon, info.flavor_id, &node_id)!=B_OK) 204a10cf76eSAxel Dörfler err = roster->InstantiateDormantNode(info, &node, B_FLAVOR_IS_GLOBAL); 205a10cf76eSAxel Dörfler else 206a10cf76eSAxel Dörfler err = roster->GetNodeFor(node_id, &node); 207a10cf76eSAxel Dörfler 208a10cf76eSAxel Dörfler if (err == B_OK) { 209a10cf76eSAxel Dörfler media_input inputs[16]; 210a10cf76eSAxel Dörfler int32 inputCount = 16; 211a10cf76eSAxel Dörfler if (roster->GetAllInputsFor(node, inputs, 16, &inputCount)==B_OK) { 212a10cf76eSAxel Dörfler BMessage message(ML_DEFAULTOUTPUT_CHANGE); 213a10cf76eSAxel Dörfler 214a10cf76eSAxel Dörfler for (int32 i = 0; i < inputCount; i++) { 215a10cf76eSAxel Dörfler media_input *input = new media_input(); 216a10cf76eSAxel Dörfler memcpy(input, &inputs[i], sizeof(*input)); 217b4a12470SJérôme Duval fMenu3->AddItem(item = new Settings2Item(&info, input, new BMessage(message))); 218a10cf76eSAxel Dörfler if(inputs[i].destination.id == outputID) 219a10cf76eSAxel Dörfler item->SetMarked(true); 220a10cf76eSAxel Dörfler } 221a10cf76eSAxel Dörfler } 222a10cf76eSAxel Dörfler } 223a10cf76eSAxel Dörfler } 224a10cf76eSAxel Dörfler } 225a10cf76eSAxel Dörfler 226a10cf76eSAxel Dörfler SettingsItem::SettingsItem(dormant_node_info *info, BMessage *message, 227a10cf76eSAxel Dörfler char shortcut, uint32 modifiers) 228a10cf76eSAxel Dörfler : BMenuItem(info->name, message, shortcut, modifiers), 229b4a12470SJérôme Duval fInfo(info) 230a10cf76eSAxel Dörfler { 231a10cf76eSAxel Dörfler 232a10cf76eSAxel Dörfler } 233a10cf76eSAxel Dörfler 234*6df0b2d5SJérôme Duval 235*6df0b2d5SJérôme Duval status_t 236*6df0b2d5SJérôme Duval SettingsItem::Invoke(BMessage *message) 237*6df0b2d5SJérôme Duval { 238*6df0b2d5SJérôme Duval if (IsMarked()) 239*6df0b2d5SJérôme Duval return B_OK; 240*6df0b2d5SJérôme Duval return BMenuItem::Invoke(message); 241*6df0b2d5SJérôme Duval } 242*6df0b2d5SJérôme Duval 243*6df0b2d5SJérôme Duval 244a10cf76eSAxel Dörfler Settings2Item::Settings2Item(dormant_node_info *info, media_input *input, BMessage *message, 245a10cf76eSAxel Dörfler char shortcut, uint32 modifiers) 246a10cf76eSAxel Dörfler : BMenuItem(input->name, message, shortcut, modifiers), 247b4a12470SJérôme Duval fInfo(info), 248b4a12470SJérôme Duval fInput(input) 249a10cf76eSAxel Dörfler { 250a10cf76eSAxel Dörfler 251a10cf76eSAxel Dörfler } 252a10cf76eSAxel Dörfler 253*6df0b2d5SJérôme Duval 254a10cf76eSAxel Dörfler Settings2Item::~Settings2Item() 255a10cf76eSAxel Dörfler { 256b4a12470SJérôme Duval delete fInput; 257a10cf76eSAxel Dörfler } 258a10cf76eSAxel Dörfler 259*6df0b2d5SJérôme Duval 260*6df0b2d5SJérôme Duval status_t 261*6df0b2d5SJérôme Duval Settings2Item::Invoke(BMessage *message) 262*6df0b2d5SJérôme Duval { 263*6df0b2d5SJérôme Duval if (IsMarked()) 264*6df0b2d5SJérôme Duval return B_OK; 265*6df0b2d5SJérôme Duval return BMenuItem::Invoke(message); 266*6df0b2d5SJérôme Duval } 267*6df0b2d5SJérôme Duval 268