diff options
author | Torbjörn Andersson | 2004-07-16 10:24:29 +0000 |
---|---|---|
committer | Torbjörn Andersson | 2004-07-16 10:24:29 +0000 |
commit | 70f8f689a152aee9a599c310a09da0a72508af6d (patch) | |
tree | b6151287e1a67cb5eae6efd00333dc0ddf200753 | |
parent | 078dc6220f2f2cb829429c1075c9c66bd0f717c3 (diff) | |
download | scummvm-rg350-70f8f689a152aee9a599c310a09da0a72508af6d.tar.gz scummvm-rg350-70f8f689a152aee9a599c310a09da0a72508af6d.tar.bz2 scummvm-rg350-70f8f689a152aee9a599c310a09da0a72508af6d.zip |
Applied patch #957544 to make output sample rate configurable at runtime.
svn-id: r14225
-rw-r--r-- | README | 33 | ||||
-rw-r--r-- | backends/sdl/sdl-common.h | 3 | ||||
-rw-r--r-- | backends/sdl/sdl.cpp | 31 | ||||
-rw-r--r-- | base/gameDetector.cpp | 5 | ||||
-rw-r--r-- | doc/05_01.tex | 1 | ||||
-rw-r--r-- | doc/07.tex | 3 | ||||
-rw-r--r-- | doc/08.tex | 2 | ||||
-rw-r--r-- | sound/mixer.cpp | 11 |
8 files changed, 79 insertions, 10 deletions
@@ -34,6 +34,7 @@ Table of Contents: * 7.3 Native MIDI support * 7.4 UNIX native & ALSA sequencer support * 7.5 Using compressed audiofiles (MP3, Ogg Vorbis, Flac) + * 7.6 Output sample rate 8.0) Configuration Files 9.0) Compiling X.X) Credits @@ -330,6 +331,7 @@ arguments - see the next section. atari, fmtowns, mac, pc) --multi-midi Enable combination of Adlib and native MIDI --native-mt32 True Roland MT-32 (disable GM emulation) + --output-rate=RATE Select output sample rate in Hz (e.g. 22050) --aspect-ratio Enable aspect ratio correction --alt-intro Use alternative intro for CD versions of Beneath a @@ -863,6 +865,35 @@ For Flac add --flac and optional parameters, i.e. Eventually you will have a much smaller *.mp3, *.ogg or *.fla file, copy this file to your game dir. You can safely remove the old file. +7.6) Output sample rate: +---- ------------------- + +The output sample rate tells ScummVM how many sound samples to play per channel +per second. There is much that could be said on this subject, but most of it +would be irrelevant here. The short version is that for most games 22050 Hz is +fine, but in some cases 44100 Hz is preferable. On extremely low-end systems +you may want to use 11025 Hz, but it's unlikely that you have to worry about +that. + +To elaborate, most of the sounds ScummVM has to play were sampled at either +22050 Hz or 11025 Hz. Using a higher sample rate will not magically improve the +quality of these sounds. Hence, 22050 Hz is fine. + +Some games use CD audio. If you use compressed files for this, they are +probably sampled at 44100 Hz, so for these games that may be a better choice of +sample rate. + +When using the Adlib, FM Towns, PC Speaker or IBM PCjr music drivers, ScummVM +is responsible for generating the samples. Usually 22050 Hz will be plenty for +these, but there is at least one piece of Adlib music in Beneath a Steeel Sky +that will sound a lot better at 44100 Hz. + +Using frequencies in between is not recommended. For one thing, your sound card +may not support it. In theory, ScummVM should fall back on a sensible frequency +in that case, but don't count on it. More importantly, ScummVM has to resample +all sounds to its output frequency. This is much easier to do well if the +output frequency is a multiple of the original frequency. + 8.0) Configuration file: ---- ------------------- @@ -946,6 +977,8 @@ The following keywords are recognized: joystick_num number Number of joystick device to use for input master_volume number The master volume setting (0-255) music_driver string The music engine to use. + output_rate number The output sample rate to use, in Hz. Sensible + values are 11025, 22050 and 44100. alsa_port string Port to use for output when using the ALSA music driver. music_volume number The music volume setting (0-255) diff --git a/backends/sdl/sdl-common.h b/backends/sdl/sdl-common.h index 02a9244046..10f6c8b5e4 100644 --- a/backends/sdl/sdl-common.h +++ b/backends/sdl/sdl-common.h @@ -169,6 +169,9 @@ protected: SDL_Surface *_tmpscreen; bool _overlayVisible; + // Audio + int _samplesPerSec; + // CD Audio SDL_CD *_cdrom; int cd_track, cd_num_loops, cd_start_frame, cd_duration; diff --git a/backends/sdl/sdl.cpp b/backends/sdl/sdl.cpp index a15978f791..c7292ad554 100644 --- a/backends/sdl/sdl.cpp +++ b/backends/sdl/sdl.cpp @@ -95,6 +95,7 @@ OSystem_SDL::OSystem_SDL() #endif _hwscreen(0), _screen(0), _screenWidth(0), _screenHeight(0), _tmpscreen(0), _overlayVisible(false), + _samplesPerSec(0), _cdrom(0), _scaler_proc(0), _modeChanged(false), _dirty_checksums(0), _mouseVisible(false), _mouseDrawn(false), _mouseData(0), _mouseHotspotX(0), _mouseHotspotY(0), @@ -274,18 +275,40 @@ void OSystem_SDL::deleteMutex(MutexRef mutex) { bool OSystem_SDL::setSoundCallback(SoundProc proc, void *param) { SDL_AudioSpec desired; + SDL_AudioSpec obtained; memset(&desired, 0, sizeof(desired)); - desired.freq = SAMPLES_PER_SEC; + if (ConfMan.hasKey("output_rate")) + _samplesPerSec = ConfMan.getInt("output_rate"); + else + _samplesPerSec = SAMPLES_PER_SEC; + + // Originally, we always used 2048 samples. This loop will produce the + // same result at 22050 Hz, and should hopefully produce something + // sensible for other frequencies. Note that it must be a power of two. + + uint16 samples = 0x8000; + + for (;;) { + if (samples / (_samplesPerSec / 1000) < 100) + break; + samples >>= 1; + } + + desired.freq = _samplesPerSec; desired.format = AUDIO_S16SYS; desired.channels = 2; - desired.samples = 2048; + desired.samples = samples; desired.callback = proc; desired.userdata = param; - if (SDL_OpenAudio(&desired, NULL) != 0) { + if (SDL_OpenAudio(&desired, &obtained) != 0) { return false; } + // Note: This should be the obtained output rate, but it seems that at + // least on some platforms SDL will lie and claim it did get the rate + // even if it didn't. Probably only happens for "weird" rates, though. + _samplesPerSec = obtained.freq; SDL_PauseAudio(0); return true; } @@ -295,7 +318,7 @@ void OSystem_SDL::clearSoundCallback() { } int OSystem_SDL::getOutputSampleRate() const { - return SAMPLES_PER_SEC; + return _samplesPerSec; } #pragma mark - diff --git a/base/gameDetector.cpp b/base/gameDetector.cpp index 1eeb5cd1a2..a99ae0c254 100644 --- a/base/gameDetector.cpp +++ b/base/gameDetector.cpp @@ -78,6 +78,7 @@ static const char USAGE_STRING[] = " atari, fmtowns, mac, pc)\n" " --multi-midi Enable combination Adlib and native MIDI\n" " --native-mt32 True Roland MT-32 (disable GM emulation)\n" + " --output-rate=RATE Select output sample rate in Hz (e.g. 22050)\n" " --aspect-ratio Enable aspect ratio correction\n" "\n" #if !defined(DISABLE_SKY) || !defined(DISABLE_QUEEN) @@ -312,6 +313,10 @@ void GameDetector::parseCommandLine(int argc, char **argv) { ConfMan.set("music_driver", option, kTransientDomain); END_OPTION + DO_LONG_OPTION("output-rate") + ConfMan.set("output_rate", (int)strtol(option, 0, 10), kTransientDomain); + END_OPTION + DO_OPTION_BOOL('f', "fullscreen") ConfMan.set("fullscreen", cmdValue, kTransientDomain); END_OPTION diff --git a/doc/05_01.tex b/doc/05_01.tex index 25a37f7abb..93eded4ef6 100644 --- a/doc/05_01.tex +++ b/doc/05_01.tex @@ -37,6 +37,7 @@ Usage: scummvm [OPTIONS]... [GAME]\\ &atari, fmtowns, mac, pc)\\ --multi-midi &Enable combination of Adlib and native MIDI\\ --native-mt32 &True Roland MT-32 (disable GM emulation)\\ + --output-rate=RATE &Select output sample rate in Hz (e.g. 22050)\\ --aspect-ratio &Enable aspect ratio correction\\ \\ --alt-intro &Use alternative intro for CD versions of Beneath a\\ diff --git a/doc/07.tex b/doc/07.tex index 4087ef5419..6d9fecb670 100644 --- a/doc/07.tex +++ b/doc/07.tex @@ -34,4 +34,5 @@ for example: \input {07_02.tex} \input {07_03.tex} \input {07_04.tex} -\input {07_05.tex}
\ No newline at end of file +\input {07_05.tex} +\input {07_06.tex} diff --git a/doc/08.tex b/doc/08.tex index 0fd6dd7a6b..1d569a2e3f 100644 --- a/doc/08.tex +++ b/doc/08.tex @@ -92,6 +92,8 @@ The following keywords are recognized: joystick\_num &number Number of joystick device to use for input\\ master\_volume &number The master volume setting (0-255)\\ music\_driver &string The music engine to use.\\ + output\_rate &number The output sample rate to use, in Hz. Sensible\\ + & values are 11025, 22050 and 44100.\\ alsa\_port &string Port to use for output when using the\\ & ALSA music driver.\\ music\_volume &number The music volume setting (0-255)\\ diff --git a/sound/mixer.cpp b/sound/mixer.cpp index b67b0c782b..40dfe8b3be 100644 --- a/sound/mixer.cpp +++ b/sound/mixer.cpp @@ -111,11 +111,6 @@ SoundMixer::SoundMixer() { _premixProc = 0; int i = 0; - _outputRate = (uint) _syst->getOutputSampleRate(); - - if (_outputRate == 0) - error("OSystem returned invalid sample rate"); - _globalVolume = 0; _musicVolume = 0; @@ -125,6 +120,12 @@ SoundMixer::SoundMixer() { _channels[i] = 0; _mixerReady = _syst->setSoundCallback(mixCallback, this); + _outputRate = (uint) _syst->getOutputSampleRate(); + + if (_outputRate == 0) + error("OSystem returned invalid sample rate"); + + debug(1, "Output sample rate: %d Hz", _outputRate); } SoundMixer::~SoundMixer() { |