void SettingsMenu::doSave() { auto settings = Game::getInstance()->settings(); settings->setCombatDifficulty(((UI::MultistateImageButton*)getUI("combat_difficulty"))->state()); settings->setGameDifficulty(((UI::MultistateImageButton*)getUI("game_difficulty"))->state()); settings->setViolenceLevel(((UI::MultistateImageButton*)getUI("violence_level"))->state()); settings->setTargetHighlight(((UI::MultistateImageButton*)getUI("target_highlight"))->state()); settings->setCombatLooks(((UI::MultistateImageButton*)getUI("combat_looks"))->state()); settings->setCombatMessages(((UI::MultistateImageButton*)getUI("combat_messages"))->state()); settings->setCombatTaunts(((UI::MultistateImageButton*)getUI("combat_taunts"))->state()); settings->setLanguageFilter(((UI::MultistateImageButton*)getUI("language_filter"))->state()); settings->setRunning(((UI::MultistateImageButton*)getUI("running"))->state()); settings->setSubtitles(((UI::MultistateImageButton*)getUI("subtitles"))->state()); settings->setItemHighlight(((UI::MultistateImageButton*)getUI("item_highlight"))->state()); settings->setMasterVolume(((UI::Slider*)getUI("master_volume"))->value()); settings->setMusicVolume(((UI::Slider*)getUI("music_volume"))->value()); settings->setVoiceVolume(((UI::Slider*)getUI("voice_volume"))->value()); settings->setSfxVolume(((UI::Slider*)getUI("sfx_volume"))->value()); settings->setTextDelay(((UI::Slider*)getUI("text_delay"))->value()); settings->setCombatSpeed(((UI::Slider*)getUI("combat_speed"))->value()); settings->setBrightness(((UI::Slider*)getUI("brightness"))->value()); settings->setMouseSensitivity(((UI::Slider*)getUI("mouse_sensitivity"))->value()); settings->setPlayerSpeedup(((UI::ImageButton*)getUI("player_speedup"))->checked()); settings->save(); Game::getInstance()->popState(); }
int Soloud::play(AudioSource &aSound, float aVolume, float aPan, int aPaused, int aBus) { if (aSound.mFlags & AudioSource::SINGLE_INSTANCE) { // Only one instance allowed, stop others stopSound(aSound); } if (mLockMutexFunc) mLockMutexFunc(mMutex); int ch = findFreeVoice(); if (ch < 0) { if (mUnlockMutexFunc) mUnlockMutexFunc(mMutex); return -1; } if (!aSound.mAudioSourceID) { aSound.mAudioSourceID = mAudioSourceID; mAudioSourceID++; aSound.mSoloud = this; } mVoice[ch] = aSound.createInstance(); mVoice[ch]->mAudioSourceID = aSound.mAudioSourceID; mVoice[ch]->mBusHandle = aBus; mVoice[ch]->init(mPlayIndex, aSound.mBaseSamplerate, aSound.mChannels, aSound.mFlags); mPlayIndex++; if (aPaused) { mVoice[ch]->mFlags |= AudioSourceInstance::PAUSED; } setVoicePan(ch, aPan); setVoiceVolume(ch, aVolume); setVoiceRelativePlaySpeed(ch, 1); int i; for (i = 0; i < FILTERS_PER_STREAM; i++) { if (aSound.mFilter[i]) { mVoice[ch]->mFilter[i] = aSound.mFilter[i]->createInstance(); } } int scratchneeded = SAMPLE_GRANULARITY * mVoice[ch]->mChannels; mVoice[ch]->mResampleData[0]->mBuffer = new float[scratchneeded]; mVoice[ch]->mResampleData[1]->mBuffer = new float[scratchneeded]; // First buffer will be overwritten anyway; the second may be referenced by resampler memset(mVoice[ch]->mResampleData[0]->mBuffer, 0, sizeof(float) * scratchneeded); memset(mVoice[ch]->mResampleData[1]->mBuffer, 0, sizeof(float) * scratchneeded); if (mUnlockMutexFunc) mUnlockMutexFunc(mMutex); int handle = getHandleFromVoice(ch); return handle; }
void ADLPlayer::rewind() { // Reset song data _playPos = _songData; // Set melody/percussion mode setPercussionMode(_soundMode != 0); // Reset instruments for (Common::Array<Timbre>::iterator t = _timbres.begin(); t != _timbres.end(); ++t) memcpy(t->params, t->startParams, kOperatorsPerVoice * kParamCount * sizeof(uint16)); for (int i = 0; i < kMaxVoiceCount; i++) _currentInstruments[i] = 0; // Reset voices int numVoice = MIN<int>(_timbres.size(), _soundMode ? (int)kMaxVoiceCount : (int)kMelodyVoiceCount); for (int i = 0; i < numVoice; i++) { setInstrument(i, _currentInstruments[i]); setVoiceVolume(i, kMaxVolume); } _modifyInstrument = 0xFF; }
uint32 ADLPlayer::pollMusic(bool first) { if (_timbres.empty() || !_songData || !_playPos || (_playPos >= (_songData + _songDataSize))) { end(); return 0; } // We'll ignore the first delay if (first) _playPos += (*_playPos & 0x80) ? 2 : 1; byte cmd = *_playPos++; // Song end marker if (cmd == 0xFF) { end(); return 0; } // Set the instrument that should be modified if (cmd == 0xFE) _modifyInstrument = *_playPos++; if (cmd >= 0xD0) { // Modify an instrument if (_modifyInstrument == 0xFF) warning("ADLPlayer: No instrument to modify"); else if (_modifyInstrument >= _timbres.size()) warning("ADLPlayer: Can't modify invalid instrument %d (%d)", _modifyInstrument, _timbres.size()); else _timbres[_modifyInstrument].params[_playPos[0]] = _playPos[1]; _playPos += 2; // If we currently have that instrument loaded, reload it for (int i = 0; i < kMaxVoiceCount; i++) if (_currentInstruments[i] == _modifyInstrument) setInstrument(i, _modifyInstrument); } else { // Voice command uint8 voice = cmd & 0x0F; uint8 note, volume; switch (cmd & 0xF0) { case 0x00: // Note on with volume note = *_playPos++; volume = *_playPos++; setVoiceVolume(voice, volume); noteOn(voice, note); break; case 0xA0: // Pitch bend bendVoicePitch(voice, ((uint16)*_playPos++) << 7); break; case 0xB0: // Set volume setVoiceVolume(voice, *_playPos++); break; case 0xC0: // Set instrument setInstrument(voice, *_playPos++); break; case 0x90: // Note on noteOn(voice, *_playPos++); break; case 0x80: // Note off noteOff(voice); break; default: warning("ADLPlayer: Unsupported command: 0x%02X. Stopping playback.", cmd); end(true); return 0; } } uint16 delay = *_playPos++; if (delay & 0x80) delay = ((delay & 3) << 8) | *_playPos++; return getSampleDelay(delay); }