Ticket #8860: midicfg.patch
File midicfg.patch, 26.6 KB (added by , 16 years ago) |
---|
-
backends/midi/windows.cpp
29 29 #include <mmsystem.h> 30 30 #include "sound/mpu401.h" 31 31 #include "common/util.h" 32 #include "common/config-manager.h" 32 33 33 34 //////////////////////////////////////// 34 35 // … … 43 44 HANDLE _streamEvent; 44 45 HMIDIOUT _mo; 45 46 bool _isOpen; 47 48 struct MidiCps { 49 Common::String name; 50 MidiDeviceFeatures features; 51 } *_devs; 46 52 53 int _numDevs; 54 int _activeDev; 55 int _volLeft; 56 int _volRight; 57 47 58 void check_error(MMRESULT result); 59 MMRESULT updateActiveDeviceVolume(); 48 60 49 61 public: 50 MidiDriver_WIN() : _isOpen(false) { } 62 MidiDriver_WIN(); 63 ~MidiDriver_WIN(); 51 64 int open(); 52 65 void close(); 53 66 void send(uint32 b); 54 67 void sysEx(const byte *msg, uint16 length); 68 69 int detectDevices(); 70 int setActiveDevice(int id); 71 int getActiveDevice(); 72 MidiDeviceFeatures getDeviceFeatures(int id); 73 Common::String getDeviceName(int id); 74 int getDeviceId(Common::String deviceName); 55 75 }; 56 76 77 MidiDriver_WIN::MidiDriver_WIN() : _isOpen(false), _devs(0), _numDevs(0), _activeDev(0), _volLeft(0xffff), _volRight(0xffff) { 78 detectDevices(); 79 } 80 81 MidiDriver_WIN::~MidiDriver_WIN() { 82 if (_devs) 83 delete [] _devs; 84 } 85 57 86 int MidiDriver_WIN::open() { 58 87 if (_isOpen) 59 88 return MERR_ALREADY_OPEN; 60 89 61 90 _streamEvent = CreateEvent(NULL, true, true, NULL); 62 MMRESULT res = midiOutOpen((HMIDIOUT *)&_mo, MIDI_MAPPER, (unsigned long)_streamEvent, 0, CALLBACK_EVENT);91 MMRESULT res = midiOutOpen((HMIDIOUT *)&_mo, getActiveDevice(), (unsigned long)_streamEvent, 0, CALLBACK_EVENT); 63 92 if (res != MMSYSERR_NOERROR) { 64 93 check_error(res); 65 94 CloseHandle(_streamEvent); 66 95 return MERR_DEVICE_NOT_AVAILABLE; 67 } 96 } 68 97 69 98 _isOpen = true; 99 updateActiveDeviceVolume(); 100 70 101 return 0; 71 102 } 72 103 … … 141 172 } 142 173 } 143 174 175 int MidiDriver_WIN::detectDevices() { 176 if (_devs) 177 delete [] _devs; 178 179 _numDevs = midiOutGetNumDevs(); 180 if (!_numDevs) 181 return -1; 182 183 _devs = new MidiCps[_numDevs]; 184 MIDIOUTCAPS tmp; 185 186 for (int i = 0; i < _numDevs; i++) { 187 if (midiOutGetDevCaps(i, &tmp, sizeof(MIDIOUTCAPS)) != MMSYSERR_NOERROR) 188 break; 189 _devs[i].name = tmp.szPname; 190 _devs[i].features = (MidiDeviceFeatures) (tmp.dwSupport & (MIDICAPS_VOLUME | MIDICAPS_LRVOLUME)); 191 } 192 193 return _numDevs; 194 } 195 196 int MidiDriver_WIN::setActiveDevice(int id) { 197 if (_isOpen) 198 return 1; 199 200 if (id > -1 && id < _numDevs) { 201 _activeDev = id; 202 return 0; 203 } 204 205 return -1; 206 } 207 208 int MidiDriver_WIN::getActiveDevice() { 209 _activeDev = _activeDev ? _activeDev : 210 (ConfMan.hasKey("midi_device") ? getDeviceId(ConfMan.get("midi_device")) : 0); 211 return _activeDev; 212 } 213 214 MidiDriver::MidiDeviceFeatures MidiDriver_WIN::getDeviceFeatures(int id) { 215 if (id > -1 && id < _numDevs) 216 return _devs[id].features; 217 218 return kMidiFeatsNone; 219 } 220 221 Common::String MidiDriver_WIN::getDeviceName(int id) { 222 if (id > -1 && id < _numDevs) 223 return _devs[id].name; 224 225 return Common::String(""); 226 } 227 228 int MidiDriver_WIN::getDeviceId(Common::String deviceName) { 229 for (int i = 0; i < _numDevs; i++) { 230 if (deviceName.equals(_devs[i].name)) 231 return i; 232 } 233 234 return -1; 235 } 236 237 MMRESULT MidiDriver_WIN::updateActiveDeviceVolume() { 238 int left = ConfMan.hasKey("mididevice_volume_left") ? ConfMan.getInt("mididevice_volume_left") << 8 : -1; 239 int right = ConfMan.hasKey("mididevice_volume_right") ? ConfMan.getInt("mididevice_volume_right") << 8 : 0; 240 MidiDeviceFeatures s = _devs[getActiveDevice()].features; 241 242 if (_isOpen && (s & kMidiFeatsVolume) && left != -1) { 243 if (left == 0x10000) 244 left--; 245 if (right == 0x10000) 246 right--; 247 if (!(_devs[getActiveDevice()].features & kMidiFeatsVolumeLR)) 248 right = left; 249 return midiOutSetVolume(_mo, (right << 16) | (left & 0xffff)); 250 } 251 252 return MMSYSERR_NOTSUPPORTED; 253 } 254 144 255 MidiDriver *MidiDriver_WIN_create() { 145 256 return new MidiDriver_WIN(); 146 257 } -
gui/launcher.cpp
70 70 kCmdGlobalMIDIOverride = 'OMID', 71 71 kCmdGlobalVolumeOverride = 'OVOL', 72 72 73 kCmdChooseMidiDriverCmd = 'chmd', 74 kCmdChooseMidiDeviceCmd = 'chmp', 73 75 kCmdChooseSoundFontCmd = 'chsf', 74 76 75 77 kCmdExtraBrowser = 'PEXT', … … 291 293 _globalGraphicsOverride->setState(e); 292 294 293 295 e = ConfMan.hasKey("music_driver", _domain) || 296 ConfMan.hasKey("midi_device", _domain) || 294 297 ConfMan.hasKey("output_rate", _domain) || 295 298 ConfMan.hasKey("subtitles", _domain) || 296 299 ConfMan.hasKey("talkspeed", _domain); … … 404 407 break; 405 408 } 406 409 410 // update midi device list when a new midi driver is selected 411 case kCmdChooseMidiDriverCmd: { 412 if (_midiDevPopUp) { 413 _midiDevPopUp->clearEntries(); 414 if (data > 0) { 415 MidiDriver *m = MidiDriver::createMidi(data); 416 if (m) { 417 if (m->detectDevices() != -1) { 418 for (int i = 0; !m->getDeviceName(i).empty(); i++) 419 _midiDevPopUp->appendEntry(m->getDeviceName(i), i); 420 _midiDevPopUp->setSelected(0); 421 _midiDevPopUp->setEnabled(true); 422 } else { 423 _midiDevPopUp->setEnabled(false); 424 } 425 delete m; 426 } else { 427 _midiDevPopUp->setEnabled(false); 428 } 429 } else { 430 _midiDevPopUp->setEnabled(false); 431 } 432 } 433 } 434 435 case kCmdChooseMidiDeviceCmd: { 436 updateMidiDevVolumeCtrls(_midiPopUp->getSelected(), (cmd == kCmdChooseMidiDeviceCmd) ? _midiDevPopUp->getSelectedString() : ""); 437 break; 438 } 439 407 440 // Change path for the game 408 441 case kCmdGameBrowser: { 409 442 BrowserDialog browser("Select directory with game data", true); -
gui/options.cpp
50 50 kSubtitleToggle = 'sttg', 51 51 kSubtitleSpeedChanged = 'stsc', 52 52 kSpeechVolumeChanged = 'vcvc', 53 kMidiDevLeftVolChanged = 'mlvc', 54 kMidiDevRightVolChanged = 'mrvc', 55 kChooseMidiDriverCmd = 'chmd', 56 kChooseMidiDeviceCmd = 'chmp', 53 57 kChooseSoundFontCmd = 'chsf', 54 58 kClearSoundFontCmd = 'clsf', 55 59 kChooseSaveDirCmd = 'chos', … … 95 99 _aspectCheckbox = 0; 96 100 _enableAudioSettings = false; 97 101 _midiPopUp = 0; 102 _midiDevPopUp = 0; 98 103 _outputRatePopUp = 0; 99 104 _enableMIDISettings = false; 100 105 _multiMidiCheckbox = 0; … … 110 115 _speechVolumeDesc = 0; 111 116 _speechVolumeSlider = 0; 112 117 _speechVolumeLabel = 0; 118 _mididevLeftVolumeDesc = 0; 119 _mididevLeftVolumeSlider = 0; 120 _mididevLeftVolumeLabel = 0; 121 _mididevRightVolumeDesc = 0; 122 _mididevRightVolumeSlider = 0; 123 _mididevRightVolumeLabel = 0; 113 124 _subToggleDesc = 0; 114 125 _subToggleButton = 0; 115 126 _subSpeedDesc = 0; … … 179 190 _midiPopUp->setSelected(md->name ? i : 0); 180 191 } 181 192 193 if (_midiDevPopUp) { 194 // Midi device 195 const int drv = ConfMan.hasKey("music_driver", _domain) ? MidiDriver::parseMusicDriver(ConfMan.get("music_driver", _domain)) : -1; 196 if (drv > 0) { 197 MidiDriver *m = MidiDriver::createMidi(drv); 198 if (m) { 199 const int midiDev = ConfMan.hasKey("midi_device", _domain) ? 200 m->getDeviceId(ConfMan.get("midi_device", _domain)) : (m->detectDevices() != -1 ? 0 : -1); 201 if (midiDev != -1) { 202 _midiDevPopUp->setSelected(midiDev); 203 _midiDevPopUp->setEnabled(true); 204 } else { 205 _midiDevPopUp->setEnabled(false); 206 } 207 delete m; 208 } else { 209 _midiDevPopUp->setEnabled(false); 210 } 211 } else { 212 _midiDevPopUp->setEnabled(false); 213 } 214 } 215 182 216 if (_outputRatePopUp) { 183 217 _outputRatePopUp->setSelected(1); 184 218 int value = ConfMan.getInt("output_rate", _domain); … … 231 265 vol = ConfMan.getInt("speech_volume", _domain); 232 266 _speechVolumeSlider->setValue(vol); 233 267 _speechVolumeLabel->setValue(vol); 268 269 vol = ConfMan.hasKey("mididevice_volume_left", _domain) ? ConfMan.getInt("mididevice_volume_left", _domain) : 192; 270 _mididevLeftVolumeSlider->setValue(vol); 271 _mididevLeftVolumeLabel->setValue(vol); 272 273 vol = ConfMan.hasKey("mididevice_volume_right", _domain) ? ConfMan.getInt("mididevice_volume_right", _domain) : 192; 274 _mididevRightVolumeSlider->setValue(vol); 275 _mididevRightVolumeLabel->setValue(vol); 234 276 } 235 277 236 278 // Subtitle options … … 291 333 ConfMan.setInt("music_volume", _musicVolumeSlider->getValue(), _domain); 292 334 ConfMan.setInt("sfx_volume", _sfxVolumeSlider->getValue(), _domain); 293 335 ConfMan.setInt("speech_volume", _speechVolumeSlider->getValue(), _domain); 336 337 const int drv = ConfMan.hasKey("music_driver", _domain) ? 338 MidiDriver::parseMusicDriver(ConfMan.get("music_driver", _domain)) : -1; 339 Common::String dev = ConfMan.hasKey("midi_device", _domain) ? ConfMan.get("midi_device", _domain) : ""; 340 341 if (drv > 0) { 342 MidiDriver *m = MidiDriver::createMidi(drv); 343 if (m) { 344 MidiDriver::MidiDeviceFeatures f = m->getDeviceFeatures(dev.empty() ? 0 : m->getDeviceId(dev)); 345 346 if (f & MidiDriver::kMidiFeatsVolumeLR) { 347 ConfMan.setInt("mididevice_volume_left", _mididevLeftVolumeSlider->getValue(), _domain); 348 ConfMan.setInt("mididevice_volume_right", _mididevRightVolumeSlider->getValue(), _domain); 349 } else if (f & MidiDriver::kMidiFeatsVolume) { 350 ConfMan.setInt("mididevice_volume_left", _mididevLeftVolumeSlider->getValue(), _domain); 351 ConfMan.removeKey("mididevice_volume_right", _domain); 352 } else { 353 ConfMan.removeKey("mididevice_volume_left", _domain); 354 ConfMan.removeKey("mididevice_volume_right", _domain); 355 } 356 delete m; 357 } else { 358 ConfMan.removeKey("mididevice_volume_left", _domain); 359 ConfMan.removeKey("mididevice_volume_right", _domain); 360 } 361 } else { 362 ConfMan.removeKey("mididevice_volume_left", _domain); 363 ConfMan.removeKey("mididevice_volume_right", _domain); 364 } 294 365 } else { 295 366 ConfMan.removeKey("music_volume", _domain); 296 367 ConfMan.removeKey("sfx_volume", _domain); 297 368 ConfMan.removeKey("speech_volume", _domain); 369 ConfMan.removeKey("mididevice_volume_left", _domain); 370 ConfMan.removeKey("mididevice_volume_right", _domain); 298 371 } 299 372 } 300 373 … … 313 386 } 314 387 } 315 388 389 if (_midiDevPopUp) { 390 const int drv = ConfMan.hasKey("music_driver", _domain) ? MidiDriver::parseMusicDriver(ConfMan.get("music_driver", _domain)) : -1; 391 if (drv > 0 && _enableAudioSettings) { 392 MidiDriver *m = MidiDriver::createMidi(drv); 393 394 if (m && _enableAudioSettings) { 395 if (!m->setActiveDevice((int)_midiDevPopUp->getSelectedTag())) { 396 ConfMan.set("midi_device", m->getDeviceName((int)_midiDevPopUp->getSelectedTag()), _domain); 397 _midiDevPopUp->setEnabled(true); 398 } else { 399 ConfMan.removeKey("midi_device", _domain); 400 _midiDevPopUp->clearEntries(); 401 _midiDevPopUp->setEnabled(false); 402 } 403 delete m; 404 } else { 405 ConfMan.removeKey("midi_device", _domain); 406 _midiDevPopUp->clearEntries(); 407 _midiDevPopUp->setEnabled(false); 408 if (m) 409 delete m; 410 } 411 } else { 412 ConfMan.removeKey("midi_device", _domain); 413 _midiDevPopUp->clearEntries(); 414 _midiDevPopUp->setEnabled(false); 415 } 416 } 417 316 418 if (_outputRatePopUp) { 317 419 if (_enableAudioSettings) { 318 420 if (_outputRatePopUp->getSelectedTag() != 0) … … 410 512 _speechVolumeLabel->setValue(_speechVolumeSlider->getValue()); 411 513 _speechVolumeLabel->draw(); 412 514 break; 515 case kMidiDevLeftVolChanged: 516 _mididevLeftVolumeLabel->setValue(_mididevLeftVolumeSlider->getValue()); 517 _mididevLeftVolumeLabel->draw(); 518 break; 519 case kMidiDevRightVolChanged: 520 _mididevRightVolumeLabel->setValue(_mididevRightVolumeSlider->getValue()); 521 _mididevRightVolumeLabel->draw(); 522 break; 413 523 case kSubtitleToggle: 414 524 if (_subMode < 2) 415 525 _subMode++; … … 450 560 _enableAudioSettings = enabled; 451 561 452 562 _midiPopUp->setEnabled(enabled); 563 _midiDevPopUp->setEnabled(enabled ? (_midiDevPopUp->getSelected() == -1 ? false : true) : false); 453 564 _outputRatePopUp->setEnabled(enabled); 454 565 } 455 566 … … 484 595 _speechVolumeDesc->setEnabled(enabled); 485 596 _speechVolumeSlider->setEnabled(enabled); 486 597 _speechVolumeLabel->setEnabled(enabled); 598 599 updateMidiDevVolumeCtrls(_midiPopUp->getSelected(), _midiDevPopUp->getSelectedString()); 487 600 } 488 601 489 602 void OptionsDialog::setSubtitleSettingsState(bool enabled) { … … 539 652 int labelWidth = g_gui.evaluator()->getVar("tabPopupsLabelW"); 540 653 541 654 // The MIDI mode popup & a label 542 _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", "Music driver:", labelWidth );655 _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", "Music driver:", labelWidth, kChooseMidiDriverCmd); 543 656 544 657 // Populate it 545 658 const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); … … 548 661 md++; 549 662 } 550 663 664 // The MIDI device popup & a label 665 const int drv = ConfMan.hasKey("music_driver", _domain) ? 666 MidiDriver::parseMusicDriver(ConfMan.get("music_driver", _domain)) : -1; 667 _midiDevPopUp = new PopUpWidget(boss, prefix + "auMidiDevPopup", "MIDI device:", labelWidth, kChooseMidiDeviceCmd); 668 _midiDevPopUp->clearEntries(); 669 if (drv > 0) { 670 MidiDriver *m = MidiDriver::createMidi(drv); 671 if (m) { 672 if (m->detectDevices() != -1) { 673 for (int i = 0; !m->getDeviceName(i).empty(); i++) 674 _midiDevPopUp->appendEntry(m->getDeviceName(i), i); 675 _midiDevPopUp->setEnabled(true); 676 } else { 677 _midiDevPopUp->setEnabled(false); 678 } 679 delete m; 680 } else { 681 _midiDevPopUp->setEnabled(false); 682 } 683 } 684 551 685 // Sample rate settings 552 686 _outputRatePopUp = new PopUpWidget(boss, prefix + "auSampleRatePopup", "Output rate:", labelWidth); 553 687 … … 624 758 _speechVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); 625 759 _speechVolumeLabel->setFlags(WIDGET_CLEARBG); 626 760 761 _mididevLeftVolumeDesc = new StaticTextWidget(boss, prefix + "vcMidiDevLeftText" , "Midi dev. vol. L:"); 762 _mididevLeftVolumeSlider = new SliderWidget(boss, prefix + "vcMidiDevLeftSlider", kMidiDevLeftVolChanged); 763 _mididevLeftVolumeLabel = new StaticTextWidget(boss, prefix + "vcMidiDevLeftLabel", "100%"); 764 _mididevLeftVolumeSlider->setMinValue(0); 765 _mididevLeftVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); 766 _mididevLeftVolumeLabel->setFlags(WIDGET_CLEARBG); 767 768 _mididevRightVolumeDesc = new StaticTextWidget(boss, prefix + "vcMidiDevRightText" , "Midi dev. vol. R:"); 769 _mididevRightVolumeSlider = new SliderWidget(boss, prefix + "vcMidiDevRightSlider", kMidiDevRightVolChanged); 770 _mididevRightVolumeLabel = new StaticTextWidget(boss, prefix + "vcMidiDevRightLabel", "100%"); 771 _mididevRightVolumeSlider->setMinValue(0); 772 _mididevRightVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); 773 _mididevRightVolumeLabel->setFlags(WIDGET_CLEARBG); 774 775 updateMidiDevVolumeCtrls(ConfMan.hasKey("music_driver", _domain) ? 776 MidiDriver::parseMusicDriver(ConfMan.get("music_driver", _domain)) : -1, 777 ConfMan.hasKey("midi_device", _domain) ? ConfMan.get("midi_device", _domain) : ""); 778 627 779 _enableVolumeSettings = true; 628 780 } 629 781 782 783 void OptionsDialog::updateMidiDevVolumeCtrls(int drvId, Common::String deviceDesc) { 784 bool disableAll = false; 785 if (_midiDevPopUp) { 786 bool volst = _musicVolumeDesc->isEnabled(); 787 if (_midiDevPopUp->isEnabled()) { 788 if (drvId > 0) { 789 MidiDriver *m = MidiDriver::createMidi(drvId); 790 if (m) { 791 MidiDriver::MidiDeviceFeatures f = m->getDeviceFeatures(deviceDesc.empty() ? 0 : m->getDeviceId(deviceDesc)); 792 if (f & MidiDriver::kMidiFeatsVolumeLR) { 793 _mididevLeftVolumeDesc->setLabel("Midi dev. vol. L:"); 794 _mididevLeftVolumeDesc->setEnabled(volst); 795 _mididevLeftVolumeSlider->setEnabled(volst); 796 _mididevLeftVolumeLabel->setEnabled(volst); 797 _mididevRightVolumeDesc->setEnabled(volst); 798 _mididevRightVolumeSlider->setEnabled(volst); 799 _mididevRightVolumeLabel->setEnabled(volst); 800 _mididevLeftVolumeDesc->clearFlags(WIDGET_INVISIBLE); 801 _mididevLeftVolumeSlider->clearFlags(WIDGET_INVISIBLE); 802 _mididevLeftVolumeLabel->clearFlags(WIDGET_INVISIBLE); 803 _mididevRightVolumeDesc->clearFlags(WIDGET_INVISIBLE); 804 _mididevRightVolumeSlider->clearFlags(WIDGET_INVISIBLE); 805 _mididevRightVolumeLabel->clearFlags(WIDGET_INVISIBLE); 806 } else if (f & MidiDriver::kMidiFeatsVolume) { 807 _mididevLeftVolumeDesc->setLabel("Midi dev. volume:"); 808 _mididevLeftVolumeDesc->setEnabled(volst); 809 _mididevLeftVolumeSlider->setEnabled(volst); 810 _mididevLeftVolumeLabel->setEnabled(volst); 811 _mididevLeftVolumeDesc->clearFlags(WIDGET_INVISIBLE); 812 _mididevLeftVolumeSlider->clearFlags(WIDGET_INVISIBLE); 813 _mididevLeftVolumeLabel->clearFlags(WIDGET_INVISIBLE); 814 _mididevRightVolumeDesc->setEnabled(false); 815 _mididevRightVolumeSlider->setEnabled(false); 816 _mididevRightVolumeLabel->setEnabled(false); 817 _mididevRightVolumeDesc->setFlags(WIDGET_INVISIBLE); 818 _mididevRightVolumeSlider->setFlags(WIDGET_INVISIBLE); 819 _mididevRightVolumeLabel->setFlags(WIDGET_INVISIBLE); 820 } else { 821 disableAll = true; 822 } 823 delete m; 824 } else { 825 disableAll = true; 826 } 827 } else { 828 disableAll = true; 829 } 830 } else { 831 disableAll = true; 832 } 833 } 834 835 if (disableAll) { 836 _mididevLeftVolumeDesc->setEnabled(false); 837 _mididevLeftVolumeSlider->setEnabled(false); 838 _mididevLeftVolumeLabel->setEnabled(false); 839 _mididevLeftVolumeDesc->setFlags(WIDGET_INVISIBLE); 840 _mididevLeftVolumeSlider->setFlags(WIDGET_INVISIBLE); 841 _mididevLeftVolumeLabel->setFlags(WIDGET_INVISIBLE); 842 _mididevRightVolumeDesc->setEnabled(false); 843 _mididevRightVolumeSlider->setEnabled(false); 844 _mididevRightVolumeLabel->setEnabled(false); 845 _mididevRightVolumeDesc->setFlags(WIDGET_INVISIBLE); 846 _mididevRightVolumeSlider->setFlags(WIDGET_INVISIBLE); 847 _mididevRightVolumeLabel->setFlags(WIDGET_INVISIBLE); 848 } 849 } 850 630 851 int OptionsDialog::getSubtitleMode(bool subtitles, bool speech_mute) { 631 852 if (!subtitles && !speech_mute) // Speech only 632 853 return 0; … … 646 867 647 868 if (_midiPopUp) 648 869 _midiPopUp->changeLabelWidth(labelWidth); 870 if (_midiDevPopUp) 871 _midiDevPopUp->changeLabelWidth(labelWidth); 649 872 if (_outputRatePopUp) 650 873 _outputRatePopUp->changeLabelWidth(labelWidth); 651 874 if (_gfxPopUp) … … 844 1067 } 845 1068 break; 846 1069 } 1070 // update midi device list when a new midi driver is selected 1071 case kChooseMidiDriverCmd: { 1072 if (_midiDevPopUp) { 1073 _midiDevPopUp->clearEntries(); 1074 if (data > 0) { 1075 MidiDriver *m = MidiDriver::createMidi(data); 1076 if (m) { 1077 if (m->detectDevices() != -1) { 1078 for (int i = 0; !m->getDeviceName(i).empty(); i++) 1079 _midiDevPopUp->appendEntry(m->getDeviceName(i), i); 1080 _midiDevPopUp->setSelected(0); 1081 _midiDevPopUp->setEnabled(true); 1082 } else { 1083 _midiDevPopUp->setEnabled(false); 1084 } 1085 delete m; 1086 } else { 1087 _midiDevPopUp->setEnabled(false); 1088 } 1089 } else { 1090 _midiDevPopUp->setEnabled(false); 1091 } 1092 } 1093 } 1094 case kChooseMidiDeviceCmd: { 1095 updateMidiDevVolumeCtrls(_midiPopUp->getSelected(), (cmd == kChooseMidiDeviceCmd) ? _midiDevPopUp->getSelectedString() : ""); 1096 break; 1097 } 847 1098 case kChooseSoundFontCmd: { 848 1099 BrowserDialog browser("Select SoundFont", false); 849 1100 if (browser.runModal() > 0) { -
gui/options.h
66 66 ButtonWidget *_soundFontButton; 67 67 StaticTextWidget *_soundFont; 68 68 ButtonWidget *_soundFontClearButton; 69 70 PopUpWidget *_midiPopUp; 71 PopUpWidget *_midiDevPopUp; 69 72 73 StaticTextWidget *_musicVolumeDesc; 74 SliderWidget *_musicVolumeSlider; 75 StaticTextWidget *_musicVolumeLabel; 76 77 StaticTextWidget *_mididevLeftVolumeDesc; 78 SliderWidget *_mididevLeftVolumeSlider; 79 StaticTextWidget *_mididevLeftVolumeLabel; 80 81 StaticTextWidget *_mididevRightVolumeDesc; 82 SliderWidget *_mididevRightVolumeSlider; 83 StaticTextWidget *_mididevRightVolumeLabel; 84 70 85 void addGraphicControls(GuiObject *boss, const String &prefix); 71 86 void addAudioControls(GuiObject *boss, const String &prefix); 72 87 void addMIDIControls(GuiObject *boss, const String &prefix); … … 81 96 void setVolumeSettingsState(bool enabled); 82 97 void setSubtitleSettingsState(bool enabled); 83 98 99 void updateMidiDevVolumeCtrls(int drvId, Common::String deviceDesc); 100 84 101 private: 85 102 // 86 103 // Graphics controls … … 95 112 // Audio controls 96 113 // 97 114 bool _enableAudioSettings; 98 PopUpWidget *_midiPopUp;99 115 PopUpWidget *_outputRatePopUp; 100 116 101 117 // … … 127 143 // 128 144 bool _enableVolumeSettings; 129 145 130 StaticTextWidget *_musicVolumeDesc;131 SliderWidget *_musicVolumeSlider;132 StaticTextWidget *_musicVolumeLabel;133 134 146 StaticTextWidget *_sfxVolumeDesc; 135 147 SliderWidget *_sfxVolumeSlider; 136 148 StaticTextWidget *_sfxVolumeLabel; -
gui/PopUpWidget.cpp
355 355 // PopUpWidget 356 356 // 357 357 358 PopUpWidget::PopUpWidget(GuiObject *boss, const String &name, const String &label, uint labelWidth )358 PopUpWidget::PopUpWidget(GuiObject *boss, const String &name, const String &label, uint labelWidth, int cmd) 359 359 : Widget(boss, name), CommandSender(boss), _label(label), _labelWidth(labelWidth) { 360 360 setFlags(WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS); 361 361 setHints(THEME_HINT_SAVE_BACKGROUND); 362 362 _type = kPopUpWidget; 363 363 364 _cmd = cmd ? cmd : kPopUpItemSelectedCmd; 365 364 366 _selectedItem = -1; 365 367 366 368 if (!_label.empty() && _labelWidth == 0) … … 373 375 int newSel = popupDialog.runModal(); 374 376 if (newSel != -1 && _selectedItem != newSel) { 375 377 _selectedItem = newSel; 376 sendCommand( kPopUpItemSelectedCmd, _entries[_selectedItem].tag);378 sendCommand(_cmd, _entries[_selectedItem].tag); 377 379 } 378 380 g_gui.clearDragWidget(); 379 381 } -
gui/PopUpWidget.h
57 57 58 58 String _label; 59 59 uint _labelWidth; 60 int _cmd; 60 61 61 62 int _leftPadding; 62 63 int _rightPadding; 63 64 int _labelSpacing; 64 65 65 66 public: 66 PopUpWidget(GuiObject *boss, const String &name, const String &label, uint labelWidth = 0 );67 PopUpWidget(GuiObject *boss, const String &name, const String &label, uint labelWidth = 0, int cmd = 0); 67 68 68 69 void changeLabelWidth(uint newWidth) { _labelWidth = newWidth; } 69 70 -
gui/theme-config.cpp
397 397 "auw=(parent.w - 2 * 10)\n" 398 398 "auMidiPopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2)\n" 399 399 "opYoffset=(opYoffset + buttonHeight + 4)\n" 400 "auMidiDevPopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2)\n" 401 "opYoffset=(opYoffset + buttonHeight + 4)\n" 400 402 "auSampleRatePopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2)\n" 401 403 "opYoffset=(opYoffset + buttonHeight + 4)\n" 402 404 "\n" … … 419 421 "vcSpeechSlider=vcxoff opYoffset sliderWidth sliderHeight\n" 420 422 "vcSpeechLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight\n" 421 423 "opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing)\n" 424 "vcMidiDevLeftText=vcx (opYoffset + 2) vctextw kLineHeight\n" 425 "vcMidiDevLeftText.align=kTextAlignRight\n" 426 "vcMidiDevLeftSlider=vcxoff opYoffset sliderWidth sliderHeight\n" 427 "vcMidiDevLeftLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight\n" 428 "opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing)\n" 429 "vcMidiDevRightText=vcx (opYoffset + 2) vctextw kLineHeight\n" 430 "vcMidiDevRightText.align=kTextAlignRight\n" 431 "vcMidiDevRightSlider=vcxoff opYoffset sliderWidth sliderHeight\n" 432 "vcMidiDevRightLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight\n" 433 "opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing)\n" 422 434 "\n" 423 435 "[midiControls]\n" 424 436 "mcx=10\n" -
gui/themes/classic080.ini
315 315 auw=(parent.w - 2 * 10) 316 316 auMidiPopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2) 317 317 opYoffset=(opYoffset + buttonHeight + 4) 318 auMidiDevPopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2) 319 opYoffset=(opYoffset + buttonHeight + 4) 318 320 auSampleRatePopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2) 319 321 opYoffset=(opYoffset + buttonHeight + 4) 320 322 … … 337 339 vcSpeechSlider=vcxoff opYoffset sliderWidth sliderHeight 338 340 vcSpeechLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight 339 341 opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing) 342 vcMidiDevLeftText=vcx (opYoffset + 2) vctextw kLineHeight 343 vcMidiDevLeftText.align=kTextAlignRight 344 vcMidiDevLeftSlider=vcxoff opYoffset sliderWidth sliderHeight 345 vcMidiDevLeftLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight 346 opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing) 347 vcMidiDevRightText=vcx (opYoffset + 2) vctextw kLineHeight 348 vcMidiDevRightText.align=kTextAlignRight 349 vcMidiDevRightSlider=vcxoff opYoffset sliderWidth sliderHeight 350 vcMidiDevRightLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight 351 opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing) 340 352 341 353 [midiControls] 342 354 mcx=10 -
gui/themes/modern.ini
492 492 aux=(opXoffset + xBorder) 493 493 auMidiPopup=aux opYoffset (parent.w - self.x - xBorder) kPopUpHeight 494 494 opYoffset=(opYoffset + prev.h + ySeparation) 495 auMidiDevPopup=aux opYoffset (parent.w - self.x - xBorder) kPopUpHeight 496 opYoffset=(opYoffset + prev.h + ySeparation) 495 497 auSampleRatePopup=aux (opYoffset - 1) prev.w kPopUpHeight 496 498 opYoffset=(opYoffset + prev.h + ySeparation) 497 499 … … 513 515 vcSpeechSlider=(prev.x2 + xSeparation) opYoffset sliderWidth sliderHeight 514 516 vcSpeechLabel=(prev.x2 + xSeparation) (opYoffset + vcOff) 24 kLineHeight 515 517 opYoffset=(opYoffset + sliderHeight + ySeparation) 518 vcMidiDevLeftText=vcx (opYoffset + vcOff) optionsLabelWidth kLineHeight 519 vcMidiDevLeftText.align=kTextAlignRight 520 vcMidiDevLeftSlider=(prev.x2 + xSeparation) opYoffset sliderWidth sliderHeight 521 vcMidiDevLeftLabel=(prev.x2 + xSeparation) (opYoffset + vcOff) 24 kLineHeight 522 opYoffset=(opYoffset + sliderHeight + ySeparation) 523 vcMidiDevRightText=vcx (opYoffset + vcOff) optionsLabelWidth kLineHeight 524 vcMidiDevRightText.align=kTextAlignRight 525 vcMidiDevRightSlider=(prev.x2 + xSeparation) opYoffset sliderWidth sliderHeight 526 vcMidiDevRightLabel=(prev.x2 + xSeparation) (opYoffset + vcOff) 24 kLineHeight 527 opYoffset=(opYoffset + sliderHeight + ySeparation) 516 528 517 529 [midiControls] 518 530 mcx=(opXoffset + xBorder) … … 576 588 use=colors 577 589 use=gradients 578 590 use=extra 579 shadow_right_width=1580 591 pix_checkbox_empty="checkbox_empty320.bmp" 581 592 pix_checkbox_checked="checkbox_checked320.bmp" 582 593 pix_cursor_image="cursor320.bmp"