void C4MusicFileMID::Stop(int fadeout_ms) { // stop song StopMidi(); // delete temp file RemTempFile(); }
/** * Remove keyboard, mouse and joystick drivers. */ void TinselEngine::ChopDrivers(void) { // remove sound driver StopMidi(); _sound->stopAllSamples(); DeleteMidiBuffer(); // remove event drivers _scheduler->killProcess(pMouseProcess); _scheduler->killProcess(pKeyboardProcess); }
void RestoreMidiFacts(SCNHANDLE Midi, bool Loop) { StopMidi(); g_currentMidi = Midi; g_currentLoop = Loop; bool mute = false; if (ConfMan.hasKey("mute")) mute = ConfMan.getBool("mute"); PlayMidiSequence(g_currentMidi, true); SetMidiVolume(mute ? 0 : _vm->_config->_musicVolume); }
// // Response function MM_MCINOTIFY message when MCI_PLAY is complete. // LRESULT TPlayWindow::MciNotify(WPARAM, LPARAM) { if (!FlushNotify) // Internal STOP/CLOSE, from thumb re-pos? { StopMidi(); // Make sure the thumb is at the end. There could be some WM_TIMER // messages on the queue when we kill it, thereby flushing WM_TIMER's // from the message queue. // int loVal, hiVal; SoundBar->GetRange(loVal, hiVal); SoundBar->SetPosition(hiVal); Parent->PostMessage(WM_COMMAND, CM_MIDISTOP); /// Parent->PostMessage(WM_COMMAND, WM_CLOSE); } else FlushNotify = FALSE; // Yes, so ignore the close. return 0; }
/** * Sets the volume of the MIDI music. * @param vol New volume - 0..MAXMIDIVOL */ void SetMidiVolume(int vol) { assert(vol >= 0 && vol <= Audio::Mixer::kMaxChannelVolume); static int priorVolMusic = 0; // FIXME: Avoid non-const global vars if (vol == 0 && priorVolMusic == 0) { // Nothing to do } else if (vol == 0 && priorVolMusic != 0) { // Stop current midi sequence StopMidi(); _vm->_midiMusic->setVolume(vol); } else if (vol != 0 && priorVolMusic == 0) { // Perhaps restart last midi sequence if (currentLoop) PlayMidiSequence(currentMidi, true); _vm->_midiMusic->setVolume(vol); } else if (vol != 0 && priorVolMusic != 0) { // Alter current volume _vm->_midiMusic->setVolume(vol); } priorVolMusic = vol; }
bool TPlayWindow::CanClose() { StopMidi(); return true; }
void TPlayWindow::CmStopMidi() { StopMidi(); }
/** * Plays the specified MIDI sequence through the sound driver. * @param dwFileOffset File offset of MIDI sequence data * @param bLoop Whether to loop the sequence */ bool PlayMidiSequence(uint32 dwFileOffset, bool bLoop) { currentMidi = dwFileOffset; currentLoop = bLoop; // Tinsel V1 PSX uses a different music format, so i // disable it here. // TODO: Maybe this should be moved to a better place... if (TinselV1PSX) return false; if (_vm->_config->_musicVolume != 0) { bool mute = false; if (ConfMan.hasKey("mute")) mute = ConfMan.getBool("mute"); SetMidiVolume(mute ? 0 : _vm->_config->_musicVolume); } // the index and length of the last tune loaded static uint32 dwLastMidiIndex = 0; // FIXME: Avoid non-const global vars //static uint32 dwLastSeqLen; uint32 dwSeqLen = 0; // length of the sequence // Support for external music from the music enhancement project if (_vm->getFeatures() & GF_ENHANCED_AUDIO_SUPPORT) { int trackNumber = GetTrackNumber(dwFileOffset); int track = 0; if (trackNumber >= 0) { if (_vm->getFeatures() & GF_ALT_MIDI) track = enhancedAudioSCNVersionALT[trackNumber]; else if (_vm->getFeatures() & GF_SCNFILES) track = enhancedAudioSCNVersion[trackNumber]; else track = enhancedAudioGRAVersion[trackNumber]; if (track > 0) { StopMidi(); // StopMidi resets these fields, so set them again currentMidi = dwFileOffset; currentLoop = bLoop; // try to play track, but don't fall back to a true CD g_system->getAudioCDManager()->play(track, bLoop ? -1 : 1, 0, 0, true); // Check if an enhanced audio track is being played. // If it is, stop here and don't load a MIDI track if (g_system->getAudioCDManager()->isPlaying()) { return true; } } } else { warning("Unknown MIDI offset %d", dwFileOffset); } } if (dwFileOffset == 0) return true; if (dwFileOffset != dwLastMidiIndex) { Common::File midiStream; // open MIDI sequence file in binary mode if (!midiStream.open(MIDI_FILE)) error(CANNOT_FIND_FILE, MIDI_FILE); // update index of last tune loaded dwLastMidiIndex = dwFileOffset; // move to correct position in the file midiStream.seek(dwFileOffset, SEEK_SET); // read the length of the sequence dwSeqLen = midiStream.readUint32LE(); // make sure buffer is large enough for this sequence assert(dwSeqLen > 0 && dwSeqLen <= midiBuffer.size); // stop any currently playing tune _vm->_midiMusic->stop(); // read the sequence if (midiStream.read(midiBuffer.pDat, dwSeqLen) != dwSeqLen) error(FILE_IS_CORRUPT, MIDI_FILE); midiStream.close(); // WORKAROUND for bug #2820054 "DW1: No intro music at first start on Wii", // which actually affects all ports, since it's specific to the GRA version. // // The GRA version does not seem to set the channel volume at all for the first // intro track, thus we need to do that here. We only initialize the channels // used in that sequence. And we are using 127 as default channel volume. // // Only in the GRA version dwFileOffset can be "38888", just to be sure, we // check for the SCN files feature flag not being set though. if (_vm->getGameID() == GID_DW1 && dwFileOffset == 38888 && !(_vm->getFeatures() & GF_SCNFILES)) { _vm->_midiMusic->send(0x7F07B0 | 3); _vm->_midiMusic->send(0x7F07B0 | 5); _vm->_midiMusic->send(0x7F07B0 | 8); _vm->_midiMusic->send(0x7F07B0 | 10); _vm->_midiMusic->send(0x7F07B0 | 13); } _vm->_midiMusic->playXMIDI(midiBuffer.pDat, dwSeqLen, bLoop); // Store the length //dwLastSeqLen = dwSeqLen; } else { // dwFileOffset == dwLastMidiIndex _vm->_midiMusic->stop(); _vm->_midiMusic->playXMIDI(midiBuffer.pDat, dwSeqLen, bLoop); } return true; }
/** * Plays the specified MIDI sequence through the sound driver. * @param dwFileOffset File offset of MIDI sequence data * @param bLoop Whether to loop the sequence */ bool PlayMidiSequence(uint32 dwFileOffset, bool bLoop) { g_currentMidi = dwFileOffset; g_currentLoop = bLoop; bool mute = false; if (ConfMan.hasKey("mute")) mute = ConfMan.getBool("mute"); SetMidiVolume(mute ? 0 : _vm->_config->_musicVolume); // the index and length of the last tune loaded uint32 dwSeqLen = 0; // length of the sequence // Support for external music from the music enhancement project if (_vm->getFeatures() & GF_ENHANCED_AUDIO_SUPPORT) { int trackNumber = GetTrackNumber(dwFileOffset); // Track 8 has been removed in the German CD re-release "Neon Edition" if ((_vm->getFeatures() & GF_ALT_MIDI) && trackNumber >= 8) trackNumber++; int track = 0; if (trackNumber >= 0) { if (_vm->getFeatures() & GF_SCNFILES) track = enhancedAudioSCNVersion[trackNumber]; else track = enhancedAudioGRAVersion[trackNumber]; if (track > 0) { StopMidi(); // StopMidi resets these fields, so set them again g_currentMidi = dwFileOffset; g_currentLoop = bLoop; // try to play track, but don't fall back to a true CD g_system->getAudioCDManager()->play(track, bLoop ? -1 : 1, 0, 0, true); // Check if an enhanced audio track is being played. // If it is, stop here and don't load a MIDI track if (g_system->getAudioCDManager()->isPlaying()) { return true; } } } else { warning("Unknown MIDI offset %d", dwFileOffset); } } if (dwFileOffset == 0) return true; Common::File midiStream; // open MIDI sequence file in binary mode if (!midiStream.open(MIDI_FILE)) error(CANNOT_FIND_FILE, MIDI_FILE); // move to correct position in the file midiStream.seek(dwFileOffset, SEEK_SET); if (TinselV1Mac) { // The Macintosh version of DW1 uses raw PCM for music dwSeqLen = midiStream.readUint32BE(); _vm->_sound->playDW1MacMusic(midiStream, dwSeqLen); } else { dwSeqLen = midiStream.readUint32LE(); // make sure buffer is large enough for this sequence assert(dwSeqLen > 0 && dwSeqLen <= g_midiBuffer.size); // stop any currently playing tune _vm->_midiMusic->stop(); // read the sequence. This needs to be read again before playSEQ() is // called even if the music is restarting, as playSEQ() reads the file // name off the buffer itself. However, that function adds SMF headers // to the buffer, thus if it's read again, the SMF headers will be read // and the filename will always be 'MThd'. if (midiStream.read(g_midiBuffer.pDat, dwSeqLen) != dwSeqLen) error(FILE_IS_CORRUPT, MIDI_FILE); // WORKAROUND for bug #2820054 "DW1: No intro music at first start on Wii", // which actually affects all ports, since it's specific to the GRA version. // // The GRA version does not seem to set the channel volume at all for the first // intro track, thus we need to do that here. We only initialize the channels // used in that sequence. And we are using 127 as default channel volume. // // Only in the GRA version dwFileOffset can be "38888", just to be sure, we // check for the SCN files feature flag not being set though. if (_vm->getGameID() == GID_DW1 && dwFileOffset == 38888 && !(_vm->getFeatures() & GF_SCNFILES)) { _vm->_midiMusic->send(0x7F07B0 | 3); _vm->_midiMusic->send(0x7F07B0 | 5); _vm->_midiMusic->send(0x7F07B0 | 8); _vm->_midiMusic->send(0x7F07B0 | 10); _vm->_midiMusic->send(0x7F07B0 | 13); } _vm->_midiMusic->playMIDI(dwSeqLen, bLoop); } midiStream.close(); return true; }