mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-09 11:20:56 +00:00
882ed43427
svn-id: r52262
121 lines
3.0 KiB
C++
121 lines
3.0 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* $URL$
|
|
* $Id$
|
|
*
|
|
*/
|
|
|
|
#include "osys_n64.h"
|
|
|
|
void checkTimers(void) {
|
|
OSystem_N64 *osys = (OSystem_N64 *)g_system;
|
|
|
|
uint32 curTime = osys->getMillis();
|
|
|
|
// Timer checking & firing
|
|
if (osys->_timerCallback && (curTime >= osys->_timerCallbackNext)) {
|
|
osys->_timerCallback(osys->_timerCallbackTimer);
|
|
osys->_timerCallbackNext = curTime + osys->_timerCallbackTimer;
|
|
}
|
|
}
|
|
|
|
void disableAudioPlayback(void) {
|
|
if (!_audioEnabled) return;
|
|
|
|
_audioEnabled = false;
|
|
|
|
while (AI_busy()); // Wait for audio to stop
|
|
}
|
|
|
|
void enableAudioPlayback(void) {
|
|
static bool _firstRun = true;
|
|
|
|
OSystem_N64 *osys = (OSystem_N64 *)g_system;
|
|
Audio::MixerImpl *localmixer = (Audio::MixerImpl *)osys->getMixer();
|
|
|
|
uint32 sampleBufferSize = 3072;
|
|
|
|
initAudioInterface(osys->_viClockRate, DEFAULT_SOUND_SAMPLE_RATE, 16, sampleBufferSize);
|
|
osys->_audioBufferSize = getAIBufferSize();
|
|
|
|
if (_firstRun) {
|
|
localmixer->setReady(true);
|
|
_firstRun = false;
|
|
}
|
|
|
|
disable_interrupts();
|
|
|
|
_audioEnabled = true;
|
|
|
|
sndCallback();
|
|
sndCallback();
|
|
|
|
registerAIhandler(sndCallback); // Lib checks if i try to register it multiple times
|
|
|
|
enable_interrupts();
|
|
}
|
|
|
|
static volatile Uint32 _requiredSoundSlots = 0;
|
|
|
|
void vblCallback(void) {
|
|
// Switch display buffer
|
|
switchDisplayBuffer();
|
|
|
|
// If audio buffer got depleted, ask for more slots to refill.
|
|
if (_audioEnabled && !AI_busy() && !_requiredSoundSlots) {
|
|
sndCallback();
|
|
sndCallback();
|
|
}
|
|
|
|
((OSystem_N64 *)g_system)->readControllerAnalogInput();
|
|
}
|
|
|
|
void sndCallback() {
|
|
// Signal that an audio buffer finished playing and that we need more samples
|
|
if (_requiredSoundSlots < 2)
|
|
_requiredSoundSlots++;
|
|
}
|
|
|
|
void refillAudioBuffers(void) {
|
|
if (!_audioEnabled) return;
|
|
|
|
OSystem_N64 *osys = (OSystem_N64 *)g_system;
|
|
byte *sndBuf;
|
|
Audio::MixerImpl *localmixer = (Audio::MixerImpl *)osys->getMixer();
|
|
|
|
while (_requiredSoundSlots) {
|
|
sndBuf = (byte*)getAIBuffer();
|
|
|
|
localmixer->mixCallback((byte*)sndBuf, osys->_audioBufferSize);
|
|
|
|
putAIBuffer();
|
|
|
|
_requiredSoundSlots--;
|
|
}
|
|
}
|
|
|
|
int timer_handler(int t) {
|
|
DefaultTimerManager *tm = (DefaultTimerManager *)g_system->getTimerManager();
|
|
tm->handler();
|
|
return t;
|
|
}
|
|
|