Ticket #8860: midicfg_V3.patch
File midicfg_V3.patch, 26.1 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 driverConfString); 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 delete [] _devs; 83 } 84 57 85 int MidiDriver_WIN::open() { 58 86 if (_isOpen) 59 87 return MERR_ALREADY_OPEN; 60 88 61 89 _streamEvent = CreateEvent(NULL, true, true, NULL); 62 MMRESULT res = midiOutOpen((HMIDIOUT *)&_mo, MIDI_MAPPER, (unsigned long)_streamEvent, 0, CALLBACK_EVENT);90 MMRESULT res = midiOutOpen((HMIDIOUT *)&_mo, getActiveDevice(), (unsigned long)_streamEvent, 0, CALLBACK_EVENT); 63 91 if (res != MMSYSERR_NOERROR) { 64 92 check_error(res); 65 93 CloseHandle(_streamEvent); 66 94 return MERR_DEVICE_NOT_AVAILABLE; 67 } 95 } 68 96 69 97 _isOpen = true; 98 updateActiveDeviceVolume(); 99 70 100 return 0; 71 101 } 72 102 … … 141 171 } 142 172 } 143 173 174 int MidiDriver_WIN::detectDevices() { 175 delete [] _devs; 176 177 _numDevs = midiOutGetNumDevs(); 178 if (!_numDevs) 179 return -1; 180 181 _devs = new MidiCps[_numDevs]; 182 MIDIOUTCAPS tmp; 183 184 for (int i = 0; i < _numDevs; i++) { 185 if (midiOutGetDevCaps(i, &tmp, sizeof(MIDIOUTCAPS)) != MMSYSERR_NOERROR) 186 break; 187 _devs[i].name = tmp.szPname; 188 _devs[i].features = (MidiDeviceFeatures) (tmp.dwSupport & (MIDICAPS_VOLUME | MIDICAPS_LRVOLUME)); 189 } 190 191 return _numDevs; 192 } 193 194 int MidiDriver_WIN::setActiveDevice(int id) { 195 if (_isOpen) 196 return 1; 197 198 if (id > -1 && id < _numDevs) { 199 _activeDev = id; 200 return 0; 201 } 202 203 return -1; 204 } 205 206 int MidiDriver_WIN::getActiveDevice() { 207 _activeDev = _activeDev ? _activeDev : 208 (ConfMan.hasKey("music_driver") ? getDeviceId(ConfMan.get("music_driver")) : 0); 209 return _activeDev; 210 } 211 212 MidiDriver::MidiDeviceFeatures MidiDriver_WIN::getDeviceFeatures(int id) { 213 if (id > -1 && id < _numDevs) 214 return _devs[id].features; 215 216 return kMidiFeatsNone; 217 } 218 219 Common::String MidiDriver_WIN::getDeviceName(int id) { 220 if (id > -1 && id < _numDevs) 221 return _devs[id].name; 222 223 return Common::String(""); 224 } 225 226 int MidiDriver_WIN::getDeviceId(Common::String driverConfString) { 227 for (int i = 0; i < _numDevs; i++) { 228 if (driverConfString.hasPrefix(_devs[i].name.c_str())) 229 return i; 230 } 231 232 return -1; 233 } 234 235 MMRESULT MidiDriver_WIN::updateActiveDeviceVolume() { 236 int left = ConfMan.hasKey("mididevice_volume_left") ? ConfMan.getInt("mididevice_volume_left") << 8 : -1; 237 int right = ConfMan.hasKey("mididevice_volume_right") ? ConfMan.getInt("mididevice_volume_right") << 8 : 0; 238 MidiDeviceFeatures s = _devs[getActiveDevice()].features; 239 240 if (_isOpen && (s & kMidiFeatsVolume) && left != -1) { 241 if (left == 0x10000) 242 left--; 243 if (right == 0x10000) 244 right--; 245 if (!(_devs[getActiveDevice()].features & kMidiFeatsVolumeLR)) 246 right = left; 247 return midiOutSetVolume(_mo, (right << 16) | (left & 0xffff)); 248 } 249 250 return MMSYSERR_NOTSUPPORTED; 251 } 252 144 253 MidiDriver *MidiDriver_WIN_create() { 145 254 return new MidiDriver_WIN(); 146 255 } -
gui/launcher.cpp
70 70 kCmdGlobalMIDIOverride = 'OMID', 71 71 kCmdGlobalVolumeOverride = 'OVOL', 72 72 73 kCmdChooseMidiDriverCmd = 'chmd', 73 74 kCmdChooseSoundFontCmd = 'chsf', 74 75 75 76 kCmdExtraBrowser = 'PEXT', … … 404 405 break; 405 406 } 406 407 408 case kCmdChooseMidiDriverCmd: { 409 updateMidiDevVolumeCtrls(_midiPopUp->getSelectedTag()); 410 break; 411 } 412 407 413 // Change path for the game 408 414 case kCmdGameBrowser: { 409 415 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', 53 56 kChooseSoundFontCmd = 'chsf', 54 57 kClearSoundFontCmd = 'clsf', 55 58 kChooseSaveDirCmd = 'chos', … … 111 114 _speechVolumeDesc = 0; 112 115 _speechVolumeSlider = 0; 113 116 _speechVolumeLabel = 0; 117 _mididevLeftVolumeDesc = 0; 118 _mididevLeftVolumeSlider = 0; 119 _mididevLeftVolumeLabel = 0; 120 _mididevRightVolumeDesc = 0; 121 _mididevRightVolumeSlider = 0; 122 _mididevRightVolumeLabel = 0; 114 123 _subToggleDesc = 0; 115 124 _subToggleButton = 0; 116 125 _subSpeedDesc = 0; … … 167 176 // Audio options 168 177 if (_midiPopUp) { 169 178 // Music driver 170 const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); 171 int i = 0; 172 const int midiDriver = 173 ConfMan.hasKey("music_driver", _domain) 174 ? MidiDriver::parseMusicDriver(ConfMan.get("music_driver", _domain)) 175 : MD_AUTO; 176 while (md->name && md->id != midiDriver) { 177 i++; 178 md++; 179 } 180 _midiPopUp->setSelected(md->name ? i : 0); 179 int midiDriver = ConfMan.hasKey("music_driver", _domain)? 180 MidiDriver::parseMusicDriverEx(ConfMan.get("music_driver", _domain)) : MD_AUTO; 181 182 _midiPopUp->setSelectedTag(midiDriver); 183 if (_midiPopUp->getSelectedString().empty()) // midi device turned off or whatever 184 _midiPopUp->setSelected(0); 181 185 } 182 186 183 187 if (_outputRatePopUp) { … … 232 236 vol = ConfMan.getInt("speech_volume", _domain); 233 237 _speechVolumeSlider->setValue(vol); 234 238 _speechVolumeLabel->setValue(vol); 239 240 vol = ConfMan.hasKey("mididevice_volume_left", _domain) ? ConfMan.getInt("mididevice_volume_left", _domain) : 192; 241 _mididevLeftVolumeSlider->setValue(vol); 242 _mididevLeftVolumeLabel->setValue(vol); 243 244 vol = ConfMan.hasKey("mididevice_volume_right", _domain) ? ConfMan.getInt("mididevice_volume_right", _domain) : 192; 245 _mididevRightVolumeSlider->setValue(vol); 246 _mididevRightVolumeLabel->setValue(vol); 235 247 } 236 248 237 249 // Subtitle options … … 292 304 ConfMan.setInt("music_volume", _musicVolumeSlider->getValue(), _domain); 293 305 ConfMan.setInt("sfx_volume", _sfxVolumeSlider->getValue(), _domain); 294 306 ConfMan.setInt("speech_volume", _speechVolumeSlider->getValue(), _domain); 307 308 int drv = _midiPopUp->isEnabled() ? _midiPopUp->getSelectedTag() : -1; 309 int dev = -1; 310 MidiDriver::MidiDeviceFeatures ftr = MidiDriver::kMidiFeatsNone; 311 312 if (drv != -1) { 313 dev = ((drv >> 8) & 0xff) - 1; 314 ftr = (MidiDriver::MidiDeviceFeatures) (drv >> 16); 315 drv &= 0xff; 316 } 317 318 if (drv > 0 && dev > -1) { 319 if (ftr & MidiDriver::kMidiFeatsVolumeLR) { 320 ConfMan.setInt("mididevice_volume_left", _mididevLeftVolumeSlider->getValue(), _domain); 321 ConfMan.setInt("mididevice_volume_right", _mididevRightVolumeSlider->getValue(), _domain); 322 } else if (ftr & MidiDriver::kMidiFeatsVolume) { 323 ConfMan.setInt("mididevice_volume_left", _mididevLeftVolumeSlider->getValue(), _domain); 324 ConfMan.removeKey("mididevice_volume_right", _domain); 325 } else { 326 ConfMan.removeKey("mididevice_volume_left", _domain); 327 ConfMan.removeKey("mididevice_volume_right", _domain); 328 } 329 } else { 330 ConfMan.removeKey("mididevice_volume_left", _domain); 331 ConfMan.removeKey("mididevice_volume_right", _domain); 332 } 295 333 } else { 296 334 ConfMan.removeKey("music_volume", _domain); 297 335 ConfMan.removeKey("sfx_volume", _domain); 298 336 ConfMan.removeKey("speech_volume", _domain); 337 ConfMan.removeKey("mididevice_volume_left", _domain); 338 ConfMan.removeKey("mididevice_volume_right", _domain); 299 339 } 300 340 } 301 341 … … 303 343 if (_midiPopUp) { 304 344 if (_enableAudioSettings) { 305 345 const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); 306 while (md->name && md->id != (int)_midiPopUp->getSelectedTag()) 346 int drv = (int) _midiPopUp->getSelectedTag() & 0xff; 347 int dev = (int) ((_midiPopUp->getSelectedTag() >> 8) & 0xff) - 1; 348 while (md->name && md->id != drv) 307 349 md++; 308 if (md->name) 309 ConfMan.set("music_driver", md->name, _domain); 350 351 Common::String confStr; 352 if (dev > -1) { 353 MidiDriver *m = MidiDriver::createMidi(md->id); 354 if (m) { 355 confStr = m->getDeviceName(dev) + " (" + Common::String(md->name) +")"; 356 delete m; 357 } 358 } else { 359 confStr = Common::String(md->name); 360 } 361 362 if (!confStr.empty()) 363 ConfMan.set("music_driver", confStr, _domain); 310 364 else 311 365 ConfMan.removeKey("music_driver", _domain); 312 366 } else { … … 411 465 _speechVolumeLabel->setValue(_speechVolumeSlider->getValue()); 412 466 _speechVolumeLabel->draw(); 413 467 break; 468 case kMidiDevLeftVolChanged: 469 _mididevLeftVolumeLabel->setValue(_mididevLeftVolumeSlider->getValue()); 470 _mididevLeftVolumeLabel->draw(); 471 break; 472 case kMidiDevRightVolChanged: 473 _mididevRightVolumeLabel->setValue(_mididevRightVolumeSlider->getValue()); 474 _mididevRightVolumeLabel->draw(); 475 break; 414 476 case kSubtitleToggle: 415 477 if (_subMode < 2) 416 478 _subMode++; … … 485 547 _speechVolumeDesc->setEnabled(enabled); 486 548 _speechVolumeSlider->setEnabled(enabled); 487 549 _speechVolumeLabel->setEnabled(enabled); 550 551 updateMidiDevVolumeCtrls(_midiPopUp->getSelectedTag()); 488 552 } 489 553 490 554 void OptionsDialog::setSubtitleSettingsState(bool enabled) { … … 540 604 int labelWidth = g_gui.evaluator()->getVar("tabPopupsLabelW"); 541 605 542 606 // The MIDI mode popup & a label 543 _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", "Music driver:", labelWidth );607 _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", "Music driver:", labelWidth, kChooseMidiDriverCmd); 544 608 545 609 // Populate it 546 610 const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); 547 611 while (md->name) { 548 _midiPopUp->appendEntry(md->description, md->id); 612 if (md->id > 0) { 613 MidiDriver *m = MidiDriver::createMidi(md->id); 614 if (m) { 615 if (m->detectDevices() != -1) { 616 for (int i = 0; !m->getDeviceName(i).empty(); i++) 617 _midiPopUp->appendEntry(m->getDeviceName(i) + " (" + Common::String(md->description) 618 +")", (((int) m->getDeviceFeatures(i)) << 16 | (i + 1) << 8) | (md->id)); 619 } else { 620 _midiPopUp->appendEntry(md->description, md->id); 621 } 622 delete m; 623 } 624 } else { 625 _midiPopUp->appendEntry(md->description, md->id); 626 } 549 627 md++; 550 628 } 551 629 … … 625 703 _speechVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); 626 704 _speechVolumeLabel->setFlags(WIDGET_CLEARBG); 627 705 706 _mididevLeftVolumeDesc = new StaticTextWidget(boss, prefix + "vcMidiDevLeftText" , "Midi dev. vol. L:"); 707 _mididevLeftVolumeSlider = new SliderWidget(boss, prefix + "vcMidiDevLeftSlider", kMidiDevLeftVolChanged); 708 _mididevLeftVolumeLabel = new StaticTextWidget(boss, prefix + "vcMidiDevLeftLabel", "100%"); 709 _mididevLeftVolumeSlider->setMinValue(0); 710 _mididevLeftVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); 711 _mididevLeftVolumeLabel->setFlags(WIDGET_CLEARBG); 712 713 _mididevRightVolumeDesc = new StaticTextWidget(boss, prefix + "vcMidiDevRightText" , "Midi dev. vol. R:"); 714 _mididevRightVolumeSlider = new SliderWidget(boss, prefix + "vcMidiDevRightSlider", kMidiDevRightVolChanged); 715 _mididevRightVolumeLabel = new StaticTextWidget(boss, prefix + "vcMidiDevRightLabel", "100%"); 716 _mididevRightVolumeSlider->setMinValue(0); 717 _mididevRightVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); 718 _mididevRightVolumeLabel->setFlags(WIDGET_CLEARBG); 719 720 updateMidiDevVolumeCtrls(ConfMan.hasKey("music_driver", _domain) ? 721 MidiDriver::parseMusicDriverEx(ConfMan.get("music_driver", _domain)) : -1); 628 722 _enableVolumeSettings = true; 629 723 } 630 724 725 726 void OptionsDialog::updateMidiDevVolumeCtrls(int drvTag) { 727 bool disableAll = false; 728 729 MidiDriver::MidiDeviceFeatures f = (MidiDriver::MidiDeviceFeatures) (drvTag >> 16); 730 731 if (_midiPopUp) { 732 bool volst = _musicVolumeDesc->isEnabled(); 733 if (drvTag > -1) { 734 if (f & MidiDriver::kMidiFeatsVolumeLR) { 735 _mididevLeftVolumeDesc->setLabel("Midi dev. vol. L:"); 736 _mididevLeftVolumeDesc->setEnabled(volst); 737 _mididevLeftVolumeSlider->setEnabled(volst); 738 _mididevLeftVolumeLabel->setEnabled(volst); 739 _mididevRightVolumeDesc->setEnabled(volst); 740 _mididevRightVolumeSlider->setEnabled(volst); 741 _mididevRightVolumeLabel->setEnabled(volst); 742 _mididevLeftVolumeDesc->clearFlags(WIDGET_INVISIBLE); 743 _mididevLeftVolumeSlider->clearFlags(WIDGET_INVISIBLE); 744 _mididevLeftVolumeLabel->clearFlags(WIDGET_INVISIBLE); 745 _mididevRightVolumeDesc->clearFlags(WIDGET_INVISIBLE); 746 _mididevRightVolumeSlider->clearFlags(WIDGET_INVISIBLE); 747 _mididevRightVolumeLabel->clearFlags(WIDGET_INVISIBLE); 748 } else if (f & MidiDriver::kMidiFeatsVolume) { 749 _mididevLeftVolumeDesc->setLabel("Midi dev. volume:"); 750 _mididevLeftVolumeDesc->setEnabled(volst); 751 _mididevLeftVolumeSlider->setEnabled(volst); 752 _mididevLeftVolumeLabel->setEnabled(volst); 753 _mididevLeftVolumeDesc->clearFlags(WIDGET_INVISIBLE); 754 _mididevLeftVolumeSlider->clearFlags(WIDGET_INVISIBLE); 755 _mididevLeftVolumeLabel->clearFlags(WIDGET_INVISIBLE); 756 _mididevRightVolumeDesc->setEnabled(false); 757 _mididevRightVolumeSlider->setEnabled(false); 758 _mididevRightVolumeLabel->setEnabled(false); 759 _mididevRightVolumeDesc->setFlags(WIDGET_INVISIBLE); 760 _mididevRightVolumeSlider->setFlags(WIDGET_INVISIBLE); 761 _mididevRightVolumeLabel->setFlags(WIDGET_INVISIBLE); 762 } else { 763 disableAll = true; 764 } 765 } else { 766 disableAll = true; 767 } 768 } else { 769 disableAll = true; 770 } 771 772 if (disableAll) { 773 _mididevLeftVolumeDesc->setEnabled(false); 774 _mididevLeftVolumeSlider->setEnabled(false); 775 _mididevLeftVolumeLabel->setEnabled(false); 776 _mididevLeftVolumeDesc->setFlags(WIDGET_INVISIBLE); 777 _mididevLeftVolumeSlider->setFlags(WIDGET_INVISIBLE); 778 _mididevLeftVolumeLabel->setFlags(WIDGET_INVISIBLE); 779 _mididevRightVolumeDesc->setEnabled(false); 780 _mididevRightVolumeSlider->setEnabled(false); 781 _mididevRightVolumeLabel->setEnabled(false); 782 _mididevRightVolumeDesc->setFlags(WIDGET_INVISIBLE); 783 _mididevRightVolumeSlider->setFlags(WIDGET_INVISIBLE); 784 _mididevRightVolumeLabel->setFlags(WIDGET_INVISIBLE); 785 } 786 } 787 631 788 int OptionsDialog::getSubtitleMode(bool subtitles, bool speech_mute) { 632 789 if (!subtitles && !speech_mute) // Speech only 633 790 return 0; … … 867 1024 } 868 1025 break; 869 1026 } 1027 // update midi device list when a new midi driver is selected 1028 case kChooseMidiDriverCmd: { 1029 updateMidiDevVolumeCtrls(_midiPopUp->getSelectedTag()); 1030 break; 1031 } 1032 870 1033 #ifdef DYNAMIC_MODULES 871 1034 case kChoosePluginsDirCmd: { 872 1035 BrowserDialog browser("Select directory for plugins", true); … … 879 1042 break; 880 1043 } 881 1044 #endif 1045 882 1046 case kChooseSoundFontCmd: { 883 1047 BrowserDialog browser("Select SoundFont", false); 884 1048 if (browser.runModal() > 0) { -
gui/options.h
66 66 ButtonWidget *_soundFontButton; 67 67 StaticTextWidget *_soundFont; 68 68 ButtonWidget *_soundFontClearButton; 69 70 PopUpWidget *_midiPopUp; 69 71 72 StaticTextWidget *_musicVolumeDesc; 73 SliderWidget *_musicVolumeSlider; 74 StaticTextWidget *_musicVolumeLabel; 75 76 StaticTextWidget *_mididevLeftVolumeDesc; 77 SliderWidget *_mididevLeftVolumeSlider; 78 StaticTextWidget *_mididevLeftVolumeLabel; 79 80 StaticTextWidget *_mididevRightVolumeDesc; 81 SliderWidget *_mididevRightVolumeSlider; 82 StaticTextWidget *_mididevRightVolumeLabel; 83 70 84 void addGraphicControls(GuiObject *boss, const String &prefix); 71 85 void addAudioControls(GuiObject *boss, const String &prefix); 72 86 void addMIDIControls(GuiObject *boss, const String &prefix); … … 81 95 void setVolumeSettingsState(bool enabled); 82 96 void setSubtitleSettingsState(bool enabled); 83 97 98 void updateMidiDevVolumeCtrls(int drvTag); 99 84 100 private: 85 101 // 86 102 // Graphics controls … … 95 111 // Audio controls 96 112 // 97 113 bool _enableAudioSettings; 98 PopUpWidget *_midiPopUp;99 114 PopUpWidget *_outputRatePopUp; 100 115 101 116 // … … 127 142 // 128 143 bool _enableVolumeSettings; 129 144 130 StaticTextWidget *_musicVolumeDesc;131 SliderWidget *_musicVolumeSlider;132 StaticTextWidget *_musicVolumeLabel;133 134 145 StaticTextWidget *_sfxVolumeDesc; 135 146 SliderWidget *_sfxVolumeSlider; 136 147 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
422 422 "vcSpeechSlider=vcxoff opYoffset sliderWidth sliderHeight\n" 423 423 "vcSpeechLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight\n" 424 424 "opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing)\n" 425 "vcMidiDevLeftText=vcx (opYoffset + 2) vctextw kLineHeight\n" 426 "vcMidiDevLeftText.align=kTextAlignRight\n" 427 "vcMidiDevLeftSlider=vcxoff opYoffset sliderWidth sliderHeight\n" 428 "vcMidiDevLeftLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight\n" 429 "opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing)\n" 430 "vcMidiDevRightText=vcx (opYoffset + 2) vctextw kLineHeight\n" 431 "vcMidiDevRightText.align=kTextAlignRight\n" 432 "vcMidiDevRightSlider=vcxoff opYoffset sliderWidth sliderHeight\n" 433 "vcMidiDevRightLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight\n" 434 "opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing)\n" 425 435 "\n" 426 436 "[midiControls]\n" 427 437 "mcx=10\n" -
gui/themes/classic080.ini
340 340 vcSpeechSlider=vcxoff opYoffset sliderWidth sliderHeight 341 341 vcSpeechLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight 342 342 opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing) 343 vcMidiDevLeftText=vcx (opYoffset + 2) vctextw kLineHeight 344 vcMidiDevLeftText.align=kTextAlignRight 345 vcMidiDevLeftSlider=vcxoff opYoffset sliderWidth sliderHeight 346 vcMidiDevLeftLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight 347 opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing) 348 vcMidiDevRightText=vcx (opYoffset + 2) vctextw kLineHeight 349 vcMidiDevRightText.align=kTextAlignRight 350 vcMidiDevRightSlider=vcxoff opYoffset sliderWidth sliderHeight 351 vcMidiDevRightLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight 352 opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing) 343 353 344 354 [midiControls] 345 355 mcx=10 -
gui/themes/modern.ini
516 516 vcSpeechSlider=(prev.x2 + xSeparation) opYoffset sliderWidth sliderHeight 517 517 vcSpeechLabel=(prev.x2 + xSeparation) (opYoffset + vcOff) 24 kLineHeight 518 518 opYoffset=(opYoffset + sliderHeight + ySeparation) 519 vcMidiDevLeftText=vcx (opYoffset + vcOff) optionsLabelWidth kLineHeight 520 vcMidiDevLeftText.align=kTextAlignRight 521 vcMidiDevLeftSlider=(prev.x2 + xSeparation) opYoffset sliderWidth sliderHeight 522 vcMidiDevLeftLabel=(prev.x2 + xSeparation) (opYoffset + vcOff) 24 kLineHeight 523 opYoffset=(opYoffset + sliderHeight + ySeparation) 524 vcMidiDevRightText=vcx (opYoffset + vcOff) optionsLabelWidth kLineHeight 525 vcMidiDevRightText.align=kTextAlignRight 526 vcMidiDevRightSlider=(prev.x2 + xSeparation) opYoffset sliderWidth sliderHeight 527 vcMidiDevRightLabel=(prev.x2 + xSeparation) (opYoffset + vcOff) 24 kLineHeight 528 opYoffset=(opYoffset + sliderHeight + ySeparation) 519 529 520 530 [midiControls] 521 531 mcx=(opXoffset + xBorder) … … 579 589 use=colors 580 590 use=gradients 581 591 use=extra 582 shadow_right_width=1583 592 pix_checkbox_empty="checkbox_empty320.bmp" 584 593 pix_checkbox_checked="checkbox_checked320.bmp" 585 594 pix_cursor_image="cursor320.bmp" -
sound/mididrv.cpp
138 138 // contained in str. 139 139 if (!scumm_strnicmp(md->name, s, len)) { 140 140 return *md; 141 } else if (md->id > 0) { 142 Common::String tmp = str; 143 // check if we have a driver name in brackets at the end of 144 // our string equal to md->name and cut it off 145 uint32 dnLen = strlen(md->name); 146 uint32 suffixS = len - 1 - dnLen; 147 if (!scumm_strnicmp(md->name, s + suffixS, dnLen)) { 148 tmp.setChar(0, suffixS - 2); 149 } else { 150 md++; 151 continue; 152 } 153 154 // If the strings don't match we also check the names 155 // of the devices detected through the current driver. 156 MidiDriver *m = MidiDriver::createMidi(md->id); 157 if (m) { 158 if (m->detectDevices() != -1) { 159 for (int i = 0; !m->getDeviceName(i).empty(); i++) { 160 if (tmp.equals(m->getDeviceName(i))) { 161 delete m; 162 return *md; 163 } 164 } 165 } 166 delete m; 167 } 141 168 } 142 169 md++; 143 170 } … … 146 173 } 147 174 148 175 int MidiDriver::parseMusicDriver(const Common::String &str) { 149 return findMusicDriver(str).id; 176 return findMusicDriver(str).id; 150 177 } 151 178 179 int MidiDriver::parseMusicDriverEx(const Common::String &str) { 180 int id = parseMusicDriver(str); 181 182 if (id > 0) { 183 MidiDriver *m = MidiDriver::createMidi(id); 184 if (m) { 185 if (m->detectDevices() != -1) { 186 for (int i = 0; !m->getDeviceName(i).empty(); i++) { 187 if (str.hasPrefix(m->getDeviceName(i).c_str())) { 188 int t = (int) m->getDeviceFeatures(i); 189 delete m; 190 return ((t << 16) | ((i + 1) << 8) | (id)); 191 } 192 } 193 } 194 delete m; 195 } 196 } 197 198 return id; 199 } 200 152 201 static int getDefaultMIDIDriver() { 153 202 #if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) 154 203 return MD_WINDOWS; -
sound/mididrv.h
28 28 29 29 #include "common/scummsys.h" 30 30 #include "common/timer.h" 31 #include "common/str.h" 31 32 32 33 class MidiChannel; 33 34 namespace Audio { … … 131 132 /** Convert a string containing a music driver name into MIDI Driver type. */ 132 133 static int parseMusicDriver(const Common::String &str); 133 134 135 /** Convert a string containing a scummvm music driver name or a external 136 midi device name into MIDI Driver type (byte 0), device id (byte 1) and 137 device features (byte 2). A device id of zero indicates that the scummvm 138 music driver doesn't support external devices (so the first actual device 139 gets an id of 1). */ 140 static int parseMusicDriverEx(const Common::String &str); 141 134 142 /** 135 143 * Get a list of all available MidiDriver types. 136 144 * @return list of all available midi drivers, terminated by a zero entry … … 234 242 // Channel allocation functions 235 243 virtual MidiChannel *allocateChannel() = 0; 236 244 virtual MidiChannel *getPercussionChannel() = 0; 245 246 // device config 247 enum MidiDeviceFeatures { 248 kMidiFeatsNone = 0, 249 kMidiFeatsVolume = 1, 250 kMidiFeatsVolumeLR = 2 251 }; 252 253 /** Return values: 254 * Success: number of detected devices 255 * Failure: -1 (no devices detected) 256 */ 257 virtual int detectDevices() { return -1; } 258 259 /** Return values: 260 * Success: 0 261 * Failure / invalid id: -1 262 * Failure / device already open: 1 263 */ 264 virtual int setActiveDevice(int id) { return -1; } 265 266 /** Return values: 267 * If a device has been set using setActiveDevice() the return value will be the id of that device. 268 * In all other cases the return value will be the id of the device from the current ConfMan domain. 269 */ 270 virtual int getActiveDevice() { return 0; } 271 272 /** Return values: 273 * kMidiFeatsNone : no features 274 * kMidiFeatsVolume : device supports volume control 275 * kMidiFeatsVolumeLR : device supports separate volume control for left and right channel 276 */ 277 virtual MidiDeviceFeatures getDeviceFeatures(int id) { return kMidiFeatsNone; } 278 279 /** Return values: 280 * Success: driver internal name (string) for the device 281 * Failure: 0 282 */ 283 virtual Common::String getDeviceName(int id) { return Common::String(""); } 284 285 /** Return values: 286 * Success: device id 287 * Failure: -1 (invalid deviceName) 288 */ 289 virtual int getDeviceId(Common::String driverConfString) { return -1; } 237 290 }; 238 291 239 292 class MidiChannel {