Ticket #8860: midicfg.patch

File midicfg.patch, 26.6 KB (added by athrxx, 12 years ago)

launcher patch

  • backends/midi/windows.cpp

     
    2929#include <mmsystem.h>
    3030#include "sound/mpu401.h"
    3131#include "common/util.h"
     32#include "common/config-manager.h"
    3233
    3334////////////////////////////////////////
    3435//
     
    4344        HANDLE _streamEvent;
    4445        HMIDIOUT _mo;
    4546        bool _isOpen;
     47       
     48        struct MidiCps {
     49                Common::String name;
     50                MidiDeviceFeatures features;
     51        } *_devs;
    4652
     53        int _numDevs;
     54        int _activeDev;
     55        int _volLeft;
     56        int _volRight;
     57
    4758        void check_error(MMRESULT result);
     59        MMRESULT updateActiveDeviceVolume();
    4860
    4961public:
    50         MidiDriver_WIN() : _isOpen(false) { }
     62        MidiDriver_WIN();
     63        ~MidiDriver_WIN();
    5164        int open();
    5265        void close();
    5366        void send(uint32 b);
    5467        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);     
    5575};
    5676
     77MidiDriver_WIN::MidiDriver_WIN() : _isOpen(false), _devs(0), _numDevs(0), _activeDev(0), _volLeft(0xffff), _volRight(0xffff) {
     78        detectDevices();
     79}
     80
     81MidiDriver_WIN::~MidiDriver_WIN() {
     82        if (_devs)
     83                delete [] _devs;
     84}
     85
    5786int MidiDriver_WIN::open() {
    5887        if (_isOpen)
    5988                return MERR_ALREADY_OPEN;
    6089
    6190        _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);
    6392        if (res != MMSYSERR_NOERROR) {
    6493                check_error(res);
    6594                CloseHandle(_streamEvent);
    6695                return MERR_DEVICE_NOT_AVAILABLE;
    67         }
     96        }       
    6897
    6998        _isOpen = true;
     99        updateActiveDeviceVolume();
     100
    70101        return 0;
    71102}
    72103
     
    141172        }
    142173}
    143174
     175int 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
     196int 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
     208int MidiDriver_WIN::getActiveDevice() {
     209        _activeDev = _activeDev ? _activeDev :         
     210                (ConfMan.hasKey("midi_device") ? getDeviceId(ConfMan.get("midi_device")) : 0);
     211        return _activeDev;
     212}
     213
     214MidiDriver::MidiDeviceFeatures MidiDriver_WIN::getDeviceFeatures(int id) {
     215        if (id > -1 && id < _numDevs)
     216                return _devs[id].features;
     217
     218        return kMidiFeatsNone;
     219}
     220
     221Common::String MidiDriver_WIN::getDeviceName(int id) {
     222        if (id > -1 && id < _numDevs)
     223                return _devs[id].name;
     224
     225        return Common::String("");
     226}
     227
     228int 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
     237MMRESULT 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
    144255MidiDriver *MidiDriver_WIN_create() {
    145256        return new MidiDriver_WIN();
    146257}
  • gui/launcher.cpp

     
    7070        kCmdGlobalMIDIOverride = 'OMID',
    7171        kCmdGlobalVolumeOverride = 'OVOL',
    7272
     73        kCmdChooseMidiDriverCmd = 'chmd',
     74        kCmdChooseMidiDeviceCmd = 'chmp',
    7375        kCmdChooseSoundFontCmd = 'chsf',
    7476
    7577        kCmdExtraBrowser = 'PEXT',
     
    291293        _globalGraphicsOverride->setState(e);
    292294
    293295        e = ConfMan.hasKey("music_driver", _domain) ||
     296                ConfMan.hasKey("midi_device", _domain) ||
    294297                ConfMan.hasKey("output_rate", _domain) ||
    295298                ConfMan.hasKey("subtitles", _domain) ||
    296299                ConfMan.hasKey("talkspeed", _domain);
     
    404407                break;
    405408        }
    406409
     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
    407440        // Change path for the game
    408441        case kCmdGameBrowser: {
    409442                BrowserDialog browser("Select directory with game data", true);
  • gui/options.cpp

     
    5050        kSubtitleToggle                 = 'sttg',
    5151        kSubtitleSpeedChanged   = 'stsc',
    5252        kSpeechVolumeChanged    = 'vcvc',
     53        kMidiDevLeftVolChanged  = 'mlvc',
     54        kMidiDevRightVolChanged = 'mrvc',
     55        kChooseMidiDriverCmd    = 'chmd',
     56        kChooseMidiDeviceCmd    = 'chmp',
    5357        kChooseSoundFontCmd             = 'chsf',
    5458        kClearSoundFontCmd      = 'clsf',
    5559        kChooseSaveDirCmd               = 'chos',
     
    9599        _aspectCheckbox = 0;
    96100        _enableAudioSettings = false;
    97101        _midiPopUp = 0;
     102        _midiDevPopUp = 0;
    98103        _outputRatePopUp = 0;
    99104        _enableMIDISettings = false;
    100105        _multiMidiCheckbox = 0;
     
    110115        _speechVolumeDesc = 0;
    111116        _speechVolumeSlider = 0;
    112117        _speechVolumeLabel = 0;
     118        _mididevLeftVolumeDesc = 0;
     119        _mididevLeftVolumeSlider = 0;
     120        _mididevLeftVolumeLabel = 0;
     121        _mididevRightVolumeDesc = 0;
     122        _mididevRightVolumeSlider = 0;
     123        _mididevRightVolumeLabel = 0;
    113124        _subToggleDesc = 0;
    114125        _subToggleButton = 0;
    115126        _subSpeedDesc = 0;
     
    179190                _midiPopUp->setSelected(md->name ? i : 0);
    180191        }
    181192
     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
    182216        if (_outputRatePopUp) {
    183217                _outputRatePopUp->setSelected(1);
    184218                int value = ConfMan.getInt("output_rate", _domain);
     
    231265                vol = ConfMan.getInt("speech_volume", _domain);
    232266                _speechVolumeSlider->setValue(vol);
    233267                _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);
    234276        }
    235277
    236278        // Subtitle options
     
    291333                                ConfMan.setInt("music_volume", _musicVolumeSlider->getValue(), _domain);
    292334                                ConfMan.setInt("sfx_volume", _sfxVolumeSlider->getValue(), _domain);
    293335                                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                                }
    294365                        } else {
    295366                                ConfMan.removeKey("music_volume", _domain);
    296367                                ConfMan.removeKey("sfx_volume", _domain);
    297368                                ConfMan.removeKey("speech_volume", _domain);
     369                                ConfMan.removeKey("mididevice_volume_left", _domain);
     370                                ConfMan.removeKey("mididevice_volume_right", _domain);
    298371                        }
    299372                }
    300373
     
    313386                        }
    314387                }
    315388
     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
    316418                if (_outputRatePopUp) {
    317419                        if (_enableAudioSettings) {
    318420                                if (_outputRatePopUp->getSelectedTag() != 0)
     
    410512                _speechVolumeLabel->setValue(_speechVolumeSlider->getValue());
    411513                _speechVolumeLabel->draw();
    412514                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;
    413523        case kSubtitleToggle:
    414524                if (_subMode < 2)
    415525                        _subMode++;
     
    450560        _enableAudioSettings = enabled;
    451561
    452562        _midiPopUp->setEnabled(enabled);
     563        _midiDevPopUp->setEnabled(enabled ? (_midiDevPopUp->getSelected() == -1 ? false : true) : false);
    453564        _outputRatePopUp->setEnabled(enabled);
    454565}
    455566
     
    484595        _speechVolumeDesc->setEnabled(enabled);
    485596        _speechVolumeSlider->setEnabled(enabled);
    486597        _speechVolumeLabel->setEnabled(enabled);
     598
     599        updateMidiDevVolumeCtrls(_midiPopUp->getSelected(), _midiDevPopUp->getSelectedString());       
    487600}
    488601
    489602void OptionsDialog::setSubtitleSettingsState(bool enabled) {
     
    539652        int labelWidth = g_gui.evaluator()->getVar("tabPopupsLabelW");
    540653
    541654        // 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);
    543656
    544657        // Populate it
    545658        const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers();
     
    548661                md++;
    549662        }
    550663
     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
    551685        // Sample rate settings
    552686        _outputRatePopUp = new PopUpWidget(boss, prefix + "auSampleRatePopup", "Output rate:", labelWidth);
    553687
     
    624758        _speechVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume);
    625759        _speechVolumeLabel->setFlags(WIDGET_CLEARBG);
    626760
     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
    627779        _enableVolumeSettings = true;
    628780}
    629781
     782       
     783void 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
    630851int OptionsDialog::getSubtitleMode(bool subtitles, bool speech_mute) {
    631852        if (!subtitles && !speech_mute) // Speech only
    632853                return 0;
     
    646867
    647868        if (_midiPopUp)
    648869                _midiPopUp->changeLabelWidth(labelWidth);
     870        if (_midiDevPopUp)
     871                _midiDevPopUp->changeLabelWidth(labelWidth);
    649872        if (_outputRatePopUp)
    650873                _outputRatePopUp->changeLabelWidth(labelWidth);
    651874        if (_gfxPopUp)
     
    8441067                }
    8451068                break;
    8461069        }
     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        }
    8471098        case kChooseSoundFontCmd: {
    8481099                BrowserDialog browser("Select SoundFont", false);
    8491100                if (browser.runModal() > 0) {
  • gui/options.h

     
    6666        ButtonWidget *_soundFontButton;
    6767        StaticTextWidget *_soundFont;
    6868        ButtonWidget *_soundFontClearButton;
     69       
     70        PopUpWidget *_midiPopUp;
     71        PopUpWidget *_midiDevPopUp;
    6972
     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
    7085        void addGraphicControls(GuiObject *boss, const String &prefix);
    7186        void addAudioControls(GuiObject *boss, const String &prefix);
    7287        void addMIDIControls(GuiObject *boss, const String &prefix);
     
    8196        void setVolumeSettingsState(bool enabled);
    8297        void setSubtitleSettingsState(bool enabled);
    8398
     99        void updateMidiDevVolumeCtrls(int drvId, Common::String deviceDesc);
     100
    84101private:
    85102        //
    86103        // Graphics controls
     
    95112        // Audio controls
    96113        //
    97114        bool _enableAudioSettings;
    98         PopUpWidget *_midiPopUp;
    99115        PopUpWidget *_outputRatePopUp;
    100116
    101117        //
     
    127143        //
    128144        bool _enableVolumeSettings;
    129145
    130         StaticTextWidget *_musicVolumeDesc;
    131         SliderWidget *_musicVolumeSlider;
    132         StaticTextWidget *_musicVolumeLabel;
    133 
    134146        StaticTextWidget *_sfxVolumeDesc;
    135147        SliderWidget *_sfxVolumeSlider;
    136148        StaticTextWidget *_sfxVolumeLabel;
  • gui/PopUpWidget.cpp

     
    355355// PopUpWidget
    356356//
    357357
    358 PopUpWidget::PopUpWidget(GuiObject *boss, const String &name, const String &label, uint labelWidth)
     358PopUpWidget::PopUpWidget(GuiObject *boss, const String &name, const String &label, uint labelWidth, int cmd)
    359359        : Widget(boss, name), CommandSender(boss), _label(label), _labelWidth(labelWidth) {
    360360        setFlags(WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS);
    361361        setHints(THEME_HINT_SAVE_BACKGROUND);
    362362        _type = kPopUpWidget;
    363363
     364        _cmd = cmd ? cmd : kPopUpItemSelectedCmd;
     365
    364366        _selectedItem = -1;
    365367
    366368        if (!_label.empty() && _labelWidth == 0)
     
    373375                int newSel = popupDialog.runModal();
    374376                if (newSel != -1 && _selectedItem != newSel) {
    375377                        _selectedItem = newSel;
    376                         sendCommand(kPopUpItemSelectedCmd, _entries[_selectedItem].tag);
     378                        sendCommand(_cmd, _entries[_selectedItem].tag);
    377379                }
    378380                g_gui.clearDragWidget();
    379381        }
  • gui/PopUpWidget.h

     
    5757
    5858        String                  _label;
    5959        uint                    _labelWidth;
     60        int                             _cmd;
    6061
    6162        int                             _leftPadding;
    6263        int                             _rightPadding;
    6364        int                             _labelSpacing;
    6465
    6566public:
    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);
    6768
    6869        void changeLabelWidth(uint newWidth) { _labelWidth = newWidth; }
    6970
  • gui/theme-config.cpp

     
    397397"auw=(parent.w - 2 * 10)\n"
    398398"auMidiPopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2)\n"
    399399"opYoffset=(opYoffset + buttonHeight + 4)\n"
     400"auMidiDevPopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2)\n"
     401"opYoffset=(opYoffset + buttonHeight + 4)\n"
    400402"auSampleRatePopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2)\n"
    401403"opYoffset=(opYoffset + buttonHeight + 4)\n"
    402404"\n"
     
    419421"vcSpeechSlider=vcxoff opYoffset sliderWidth sliderHeight\n"
    420422"vcSpeechLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight\n"
    421423"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"
    422434"\n"
    423435"[midiControls]\n"
    424436"mcx=10\n"
  • gui/themes/classic080.ini

     
    315315auw=(parent.w - 2 * 10)
    316316auMidiPopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2)
    317317opYoffset=(opYoffset + buttonHeight + 4)
     318auMidiDevPopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2)
     319opYoffset=(opYoffset + buttonHeight + 4)
    318320auSampleRatePopup=(aux - 5) (opYoffset - 1) (auw + 5) (kLineHeight + 2)
    319321opYoffset=(opYoffset + buttonHeight + 4)
    320322
     
    337339vcSpeechSlider=vcxoff opYoffset sliderWidth sliderHeight
    338340vcSpeechLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight
    339341opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing)
     342vcMidiDevLeftText=vcx (opYoffset + 2) vctextw kLineHeight
     343vcMidiDevLeftText.align=kTextAlignRight
     344vcMidiDevLeftSlider=vcxoff opYoffset sliderWidth sliderHeight
     345vcMidiDevLeftLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight
     346opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing)
     347vcMidiDevRightText=vcx (opYoffset + 2) vctextw kLineHeight
     348vcMidiDevRightText.align=kTextAlignRight
     349vcMidiDevRightSlider=vcxoff opYoffset sliderWidth sliderHeight
     350vcMidiDevRightLabel=(vcxoff + prev.w + 10) (opYoffset + 2) 24 kLineHeight
     351opYoffset=(opYoffset + sliderHeight + vcAudioTabSpacing)
    340352
    341353[midiControls]
    342354mcx=10
  • gui/themes/modern.ini

     
    492492aux=(opXoffset + xBorder)
    493493auMidiPopup=aux opYoffset (parent.w - self.x - xBorder) kPopUpHeight
    494494opYoffset=(opYoffset + prev.h + ySeparation)
     495auMidiDevPopup=aux opYoffset (parent.w - self.x - xBorder) kPopUpHeight
     496opYoffset=(opYoffset + prev.h + ySeparation)
    495497auSampleRatePopup=aux (opYoffset - 1) prev.w kPopUpHeight
    496498opYoffset=(opYoffset + prev.h + ySeparation)
    497499
     
    513515vcSpeechSlider=(prev.x2 + xSeparation) opYoffset sliderWidth sliderHeight
    514516vcSpeechLabel=(prev.x2 + xSeparation) (opYoffset + vcOff) 24 kLineHeight
    515517opYoffset=(opYoffset + sliderHeight + ySeparation)
     518vcMidiDevLeftText=vcx (opYoffset + vcOff) optionsLabelWidth kLineHeight
     519vcMidiDevLeftText.align=kTextAlignRight
     520vcMidiDevLeftSlider=(prev.x2 + xSeparation) opYoffset sliderWidth sliderHeight
     521vcMidiDevLeftLabel=(prev.x2 + xSeparation) (opYoffset + vcOff) 24 kLineHeight
     522opYoffset=(opYoffset + sliderHeight + ySeparation)
     523vcMidiDevRightText=vcx (opYoffset + vcOff) optionsLabelWidth kLineHeight
     524vcMidiDevRightText.align=kTextAlignRight
     525vcMidiDevRightSlider=(prev.x2 + xSeparation) opYoffset sliderWidth sliderHeight
     526vcMidiDevRightLabel=(prev.x2 + xSeparation) (opYoffset + vcOff) 24 kLineHeight
     527opYoffset=(opYoffset + sliderHeight + ySeparation)
    516528
    517529[midiControls]
    518530mcx=(opXoffset + xBorder)
     
    576588use=colors
    577589use=gradients
    578590use=extra
    579 shadow_right_width=1
    580591pix_checkbox_empty="checkbox_empty320.bmp"
    581592pix_checkbox_checked="checkbox_checked320.bmp"
    582593pix_cursor_image="cursor320.bmp"