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