void MainWnd::OnSizing(UINT fwSide, LPRECT pRect) { // the OnSizing event only occurs in windowed mode CWnd::OnSizing(fwSide, pRect); // pause sound to prevent low sound buffers if( emulating ) { soundPause(); } // maintain minimal window size RECT size = { 0, 0, theApp.sizeX, theApp.sizeY }; AdjustWindowRectEx( &size, WS_POPUP | WS_VISIBLE | WS_OVERLAPPEDWINDOW, FALSE, 0 ); MENUBARINFO mbi; mbi.cbSize = sizeof(MENUBARINFO); GetMenuBarInfo( this->GetSafeHwnd(), OBJID_MENU, 0, &mbi ); const LONG menuHeight = mbi.rcBar.bottom - mbi.rcBar.top + 1; // +1 because of that white line, wherever it comes from const LONG width = size.right - size.left; const LONG height = size.bottom - size.top + menuHeight; if( ( pRect->right - pRect->left ) < width ) { pRect->right = pRect->left + width; } if( ( pRect->bottom - pRect->top ) < height ) { pRect->bottom = pRect->top + height; } }
void MainWnd::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); if(!theApp.changingVideoSize) { if(this) { if(!IsIconic()) { if(theApp.iconic) { if(emulating) { soundResume(); theApp.paused = false; } } if(theApp.videoOption <= VIDEO_4X) { theApp.surfaceSizeX = cx; theApp.surfaceSizeY = cy; theApp.adjustDestRect(); if(theApp.display) theApp.display->resize(theApp.dest.right-theApp.dest.left, theApp.dest.bottom-theApp.dest.top); } } else { if(emulating) { if(!theApp.paused) { theApp.paused = true; soundPause(); } } theApp.iconic = true; } } } }
void Window::vOnMenuEnter() { if (emulating && !m_bPaused) { vStopEmu(); soundPause(); } }
void Window::vOnFileClose() { if (m_eCartridge != CartridgeNone) { soundPause(); vStopEmu(); vSetDefaultTitle(); vDrawDefaultScreen(); vSaveBattery(); vSaveCheats(); m_stEmulator.emuCleanUp(); m_eCartridge = CartridgeNone; emulating = 0; vUpdateGameSlots(); for (std::list<Gtk::Widget *>::iterator it = m_listSensitiveWhenPlaying.begin(); it != m_listSensitiveWhenPlaying.end(); it++) { (*it)->set_sensitive(false); } m_poFilePauseItem->set_active(false); } }
void MainWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CWnd::OnActivate(nState, pWndOther, bMinimized); bool a = (nState == WA_ACTIVE) || (nState == WA_CLICKACTIVE); if(a && theApp.input) { theApp.active = a; theApp.input->activate(); if(!theApp.paused && emulating) { soundResume(); } } else { theApp.wasPaused = true; if(theApp.pauseWhenInactive) { if(emulating) { soundPause(); } theApp.active = a; } memset(theApp.delta,255,sizeof(theApp.delta)); } if(theApp.paused && emulating) { theApp.painting = true; systemDrawScreen(); theApp.painting = false; theApp.renderedFrames--; } }
void MainWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CWnd::OnActivate(nState, pWndOther, bMinimized); bool a = (nState == WA_ACTIVE) || (nState == WA_CLICKACTIVE); if(a && theApp.input) { theApp.active = a; theApp.input->activate(); if(!theApp.paused) { if(emulating) { theApp.disablePowerManagement(); soundResume(); } } } else { theApp.wasPaused = true; if(theApp.pauseWhenInactive) { if(emulating) { theApp.enablePowerManagement(); soundPause(); } theApp.active = a; } memset(theApp.delta,255,sizeof(theApp.delta)); } if(theApp.paused && emulating) systemDrawScreen(); }
VBA::~VBA() { char winBuffer[2048]; GetModuleFileName(NULL, winBuffer, 2048); char *p = strrchr(winBuffer, '\\'); if(p) *p = 0; regInit(winBuffer); saveSettings(); soundPause(); soundShutdown(); if(rom != NULL) { ((MainWnd *)m_pMainWnd)->writeBatteryFile(); emulator.emuCleanUp(); } if(input) delete input; shutdownDisplay(); CoUninitialize(); }
void MainWnd::OnMoving(UINT fwSide, LPRECT pRect) { CWnd::OnMoving(fwSide, pRect); if( emulating ) { soundPause(); } }
void MainWnd::OnNcRButtonDown(UINT nHitTest, CPoint point) { // pause sound before process is halted if( emulating ) { soundPause(); } CWnd::OnNcRButtonDown(nHitTest, point); }
void MainWnd::OnWindowPosChanging(WINDOWPOS* lpwndpos) { CWnd::OnWindowPosChanging(lpwndpos); // pause sound before changing window position/size if( emulating ) { soundPause(); } }
//this function will be called by the timer. void timerCallBack() { if(play) soundPause(channel); else soundResume(channel); play = !play; }
bool Window::on_focus_out_event(GdkEventFocus* _pstEvent) { if (emulating && !m_bPaused && m_poCoreConfig->oGetKey<bool>("pause_when_inactive")) { vStopEmu(); soundPause(); } return false; }
void MainWnd::OnEnterSizeMove() { // The WM_ENTERSIZEMOVE message is sent one time to a window after it enters the moving or sizing modal loop. // Causes the emulator to stop when moving or resizing the window. if( emulating ) { // pause sound before entering DefWindowProc soundPause(); } CWnd::OnEnterSizeMove(); }
void Window::vOnFilePauseToggled(Gtk::CheckMenuItem* _poCMI) { m_bPaused = _poCMI->get_active(); if (emulating) { if (m_bPaused) { vStopEmu(); soundPause(); } else { vStartEmu(); soundResume(); } } }
void MainWnd::OnDropFiles(HDROP hDropInfo) { char szFile[1024]; if(DragQueryFile(hDropInfo, 0, szFile, 1024)) { theApp.szFile = szFile; if(FileRun()) { SetForegroundWindow(); emulating = TRUE; } else { emulating = FALSE; soundPause(); } } DragFinish(hDropInfo); }
void MainWnd::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); bool redraw = ( ( cx < theApp.surfaceSizeX ) || ( cy < theApp.surfaceSizeY ) ); if(!theApp.changingVideoSize) { if(this) { if(!IsIconic()) { if(theApp.iconic) { if(emulating) { soundResume(); theApp.paused = false; } } if(theApp.videoOption <= VIDEO_6X) { theApp.surfaceSizeX = cx; theApp.surfaceSizeY = cy; theApp.adjustDestRect(); if(theApp.display) theApp.display->resize(theApp.dest.right-theApp.dest.left, theApp.dest.bottom-theApp.dest.top); if( redraw && emulating ) { theApp.painting = true; systemDrawScreen(); theApp.painting = false; theApp.renderedFrames--; } } } else { if(emulating) { if(!theApp.paused) { theApp.paused = true; soundPause(); } } theApp.iconic = true; } } } }
void SciMusic::soundPlay(MusicEntry *pSnd) { _mutex.lock(); uint playListCount = _playList.size(); uint playListNo = playListCount; MusicEntry *alreadyPlaying = NULL; // searching if sound is already in _playList for (uint i = 0; i < playListCount; i++) { if (_playList[i] == pSnd) playListNo = i; if ((_playList[i]->status == kSoundPlaying) && (_playList[i]->pMidiParser)) alreadyPlaying = _playList[i]; } if (playListNo == playListCount) { // not found _playList.push_back(pSnd); sortPlayList(); } _mutex.unlock(); // unlock to perform mixer-related calls if (pSnd->pMidiParser) { if ((_soundVersion <= SCI_VERSION_0_LATE) && (alreadyPlaying)) { // Music already playing in SCI0? if (pSnd->priority > alreadyPlaying->priority) { // And new priority higher? pause previous music and play new one immediately. // Example of such case: lsl3, when getting points (jingle is played then) soundPause(alreadyPlaying); alreadyPlaying->isQueued = true; } else { // And new priority equal or lower? queue up music and play it afterwards done by // SoundCommandParser::updateSci0Cues() // Example of such case: iceman room 14 pSnd->isQueued = true; pSnd->status = kSoundPaused; return; } } } if (pSnd->pStreamAud) { if (!_pMixer->isSoundHandleActive(pSnd->hCurrentAud)) { // Sierra SCI ignores volume set when playing samples via kDoSound // At least freddy pharkas/CD has a script bug that sets volume to 0 // when playing the "score" sample if (pSnd->loop > 1) { pSnd->pLoopStream = new Audio::LoopingAudioStream(pSnd->pStreamAud, pSnd->loop, DisposeAfterUse::NO); _pMixer->playStream(pSnd->soundType, &pSnd->hCurrentAud, pSnd->pLoopStream, -1, _pMixer->kMaxChannelVolume, 0, DisposeAfterUse::NO); } else { // Rewind in case we play the same sample multiple times // (non-looped) like in pharkas right at the start pSnd->pStreamAud->rewind(); _pMixer->playStream(pSnd->soundType, &pSnd->hCurrentAud, pSnd->pStreamAud, -1, _pMixer->kMaxChannelVolume, 0, DisposeAfterUse::NO); } } } else { if (pSnd->pMidiParser) { _mutex.lock(); pSnd->pMidiParser->mainThreadBegin(); pSnd->pMidiParser->tryToOwnChannels(); if (pSnd->status != kSoundPaused) pSnd->pMidiParser->sendInitCommands(); pSnd->pMidiParser->setVolume(pSnd->volume); if (pSnd->status == kSoundStopped) { pSnd->pMidiParser->jumpToTick(0); } else { // Disable sound looping before fast forwarding to the last position, // when loading a saved game. Fixes bug #3083151. uint16 prevLoop = pSnd->loop; pSnd->loop = 0; // Fast forward to the last position and perform associated events when loading pSnd->pMidiParser->jumpToTick(pSnd->ticker, true, true, true); // Restore looping pSnd->loop = prevLoop; } pSnd->pMidiParser->mainThreadEnd(); _mutex.unlock(); } } pSnd->status = kSoundPlaying; }
void MainWnd::OnInitMenu(CMenu* pMenu) { CWnd::OnInitMenu(pMenu); soundPause(); }
void SciMusic::soundToggle(MusicEntry *pSnd, bool pause) { if (pause) soundPause(pSnd); else soundResume(pSnd); }
void SciMusic::soundPlay(MusicEntry *pSnd) { _mutex.lock(); uint playListCount = _playList.size(); uint playListNo = playListCount; MusicEntry *alreadyPlaying = NULL; // searching if sound is already in _playList for (uint i = 0; i < playListCount; i++) { if (_playList[i] == pSnd) playListNo = i; if ((_playList[i]->status == kSoundPlaying) && (_playList[i]->pMidiParser)) alreadyPlaying = _playList[i]; } if (playListNo == playListCount) { // not found _playList.push_back(pSnd); sortPlayList(); } _mutex.unlock(); // unlock to perform mixer-related calls if (pSnd->pMidiParser) { if ((_soundVersion <= SCI_VERSION_0_LATE) && (alreadyPlaying)) { // Music already playing in SCI0? if (pSnd->priority > alreadyPlaying->priority) { // And new priority higher? pause previous music and play new one immediately. // Example of such case: lsl3, when getting points (jingle is played then) soundPause(alreadyPlaying); alreadyPlaying->isQueued = true; } else { // And new priority equal or lower? queue up music and play it afterwards done by // SoundCommandParser::updateSci0Cues() // Example of such case: iceman room 14 pSnd->isQueued = true; pSnd->status = kSoundPaused; return; } } } if (pSnd->pStreamAud) { if (!_pMixer->isSoundHandleActive(pSnd->hCurrentAud)) { // Sierra SCI ignores volume set when playing samples via kDoSound // At least freddy pharkas/CD has a script bug that sets volume to 0 // when playing the "score" sample if (pSnd->loop > 1) { pSnd->pLoopStream = new Audio::LoopingAudioStream(pSnd->pStreamAud, pSnd->loop, DisposeAfterUse::NO); _pMixer->playStream(pSnd->soundType, &pSnd->hCurrentAud, pSnd->pLoopStream, -1, _pMixer->kMaxChannelVolume, 0, DisposeAfterUse::NO); } else { // Rewind in case we play the same sample multiple times // (non-looped) like in pharkas right at the start pSnd->pStreamAud->rewind(); _pMixer->playStream(pSnd->soundType, &pSnd->hCurrentAud, pSnd->pStreamAud, -1, _pMixer->kMaxChannelVolume, 0, DisposeAfterUse::NO); } } } else { if (pSnd->pMidiParser) { Common::StackLock lock(_mutex); pSnd->pMidiParser->mainThreadBegin(); if (pSnd->status != kSoundPaused) { // Stop any in progress music fading, as that will reset the // volume of the sound channels that the faded song occupies.. // Fixes bug #3266480 and partially fixes bug #3041738. for (uint i = 0; i < playListCount; i++) { // Is another MIDI song being faded down? If yes, stop it // immediately instead if (_playList[i]->fadeStep < 0 && _playList[i]->pMidiParser) { _playList[i]->status = kSoundStopped; if (_soundVersion <= SCI_VERSION_0_LATE) _playList[i]->isQueued = false; _playList[i]->pMidiParser->stop(); freeChannels(_playList[i]); _playList[i]->fadeStep = 0; } } } pSnd->pMidiParser->tryToOwnChannels(); if (pSnd->status != kSoundPaused) pSnd->pMidiParser->sendInitCommands(); pSnd->pMidiParser->setVolume(pSnd->volume); // Disable sound looping and hold before jumpToTick is called, // otherwise the song may keep looping forever when it ends in jumpToTick. // This is needed when loading saved games, or when a game // stops the same sound twice (e.g. LSL3 Amiga, going left from // room 210 to talk with Kalalau). Fixes bugs #3083151 and #3106107. uint16 prevLoop = pSnd->loop; int16 prevHold = pSnd->hold; pSnd->loop = 0; pSnd->hold = -1; if (pSnd->status == kSoundStopped) pSnd->pMidiParser->jumpToTick(0); else // Fast forward to the last position and perform associated events when loading pSnd->pMidiParser->jumpToTick(pSnd->ticker, true, true, true); // Restore looping and hold pSnd->loop = prevLoop; pSnd->hold = prevHold; pSnd->pMidiParser->mainThreadEnd(); } } pSnd->status = kSoundPlaying; }