Final updates to the sound code (resampling seems to be working fine).

git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2585 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2013-01-27 15:08:04 +00:00
parent b7df9deeb6
commit a5cb67551f
12 changed files with 58 additions and 144 deletions

View File

@ -12,16 +12,17 @@
Release History
===========================================================================
3.7.5 to 3.8: (January xx, 2013)
3.7.5 to 3.8: (February xx, 2013)
* Huge changes to the sound system:
- The sound code now uses signed 16-bit samples instead of unsigned
8-bit samples, making it more compatible with a wider variety of
- The sound code now uses 16-bit signed samples instead of 8-bit
unsigned samples, making it more compatible with a wider variety of
systems.
- Improved sound output for several ROMs, including "Space Rocks"
(the 'heartbeat' sound can now be clearly heard).
- The 'volume clipping' option has been removed, since in 16-bit
mode it's no longer needed.
- The 'Tia freq' option has been removed.
* Improved bankswitch autodetection for X07 ROMs (although there's only
two known ROMs in existence, so the detection probably isn't robust).
@ -69,7 +70,7 @@
reading from TIMINT. Also, D6 of the Interrupt Flag register is now
properly set on active transition of the PA7 pin.
* Fixed bug in DPC+ bankswitch scheme; the music in "Stay Frosty 2"
* Fixed bug in DPC+ bankswitch scheme; the music several DPC+ ROMS
wasn't playing correctly.
* The ROM properties database now uses 'Auto' instead of 'Auto-select'

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -10,7 +10,7 @@
<br><br>
<center><h2><b>A multi-platform Atari 2600 VCS emulator</b></h2></center>
<center><h4><b>Release 3.7.5</b></h4></center>
<center><h4><b>Release 3.8</b></h4></center>
<br><br>
<center><h2><b>User's Guide</b></h2></center>
@ -54,7 +54,7 @@
<br><br><br>
<center><b>February 1999 - December 2012</b></center>
<center><b>February 1999 - February 2013</b></center>
<center><b>The Stella Team</b></center>
<center><b><a href="http://stella.sourceforge.net">Stella Homepage</a></b></center>
@ -1995,14 +1995,7 @@
<tr>
<td><pre>-freq &lt;number&gt;</pre></td>
<td>Set sound sample output frequency (0 - 48000).
Default is 31400. Do not change unless you experience sound
issues.</td>
</tr>
<tr>
<td><pre>-tiafreq &lt;number&gt;</pre></td>
<td>Set sound sample generation frequency (0 - 48000).
<td>Set sound sample output frequency (11025,22050,31400,44100,48000)
Default is 31400. Do not change unless you experience sound
issues.</td>
</tr>
@ -2494,9 +2487,7 @@
<tr><th>Item</th><th>Brief description</th><th>For more information,<br>see <a href="#CommandLine">CommandLine</a></th></tr>
<tr><td>Volume</td><td>self-explanatory</td><td>-volume</td></tr>
<tr><td>Sample size (*)</td><td>set size of audio buffers</td><td>-fragsize</td></tr>
<tr><td>Output freq (*)</td><td>change sound output frequency (advanced)</td><td>-freq</td></tr>
<tr><td>TIA freq</td><td>change TIA output frequency (advanced)</td><td>-tiafreq</td></tr>
<tr><td>Clip volume</td><td>Eliminate popping in sound generation (advanced)</td><td>-clipvol</td></tr>
<tr><td>Frequency (*)</td><td>change sound output frequency</td><td>-freq</td></tr>
<tr><td>Enable sound</td><td>self-explanatory</td><td>-sound</td></tr>
</table>
</td>

View File

@ -1,74 +0,0 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2013 by Bradford W. Mott, Stephen Anthony
// and the Stella Team
//
// See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id$
//============================================================================
#include "bspf.hxx"
#include "OSystem.hxx"
#include "Settings.hxx"
#include "SoundNull.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SoundNull::SoundNull(OSystem* osystem)
: Sound(osystem)
{
myOSystem->logMessage("Sound disabled.\n", 1);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SoundNull::~SoundNull()
{
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool SoundNull::load(Serializer& in)
{
if(in.getString() != "TIASound")
return false;
// Read sound registers and discard
in.getByte();
in.getByte();
in.getByte();
in.getByte();
in.getByte();
in.getByte();
// myLastRegisterSetCycle
in.getInt();
return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool SoundNull::save(Serializer& out) const
{
out.putString("TIASound");
out.putByte(0);
out.putByte(0);
out.putByte(0);
out.putByte(0);
out.putByte(0);
out.putByte(0);
// myLastRegisterSetCycle
out.putInt(0);
return true;
}

View File

@ -24,6 +24,7 @@ class OSystem;
#include "bspf.hxx"
#include "Sound.hxx"
#include "OSystem.hxx"
/**
This class implements a Null sound object, where-by sound generation
@ -39,7 +40,10 @@ class SoundNull : public Sound
Create a new sound object. The init method must be invoked before
using the object.
*/
SoundNull(OSystem* osystem);
SoundNull(OSystem* osystem) : Sound(osystem)
{
myOSystem->logMessage("Sound disabled.\n", 1);
}
/**
Destructor
@ -128,14 +132,25 @@ class SoundNull : public Sound
*/
void adjustVolume(Int8 direction) { }
public:
public:
/**
Saves the current state of this device to the given Serializer.
@param out The serializer device to save to.
@return The result of the save. True on success, false on failure.
*/
bool save(Serializer& out) const;
bool save(Serializer& out) const
{
out.putString("TIASound");
for(int = 0; i < 6; ++i)
out.putByte(0);
// myLastRegisterSetCycle
out.putInt(0);
return true;
}
/**
Loads the current state of this device from the given Serializer.
@ -143,7 +158,20 @@ public:
@param in The Serializer device to load from.
@return The result of the load. True on success, false on failure.
*/
bool load(Serializer& in);
bool load(Serializer& in)
{
if(in.getString() != "TIASound")
return false;
// Read sound registers and discard
for(int = 0; i < 6; ++i)
in.getByte();
// myLastRegisterSetCycle
in.getInt();
return true;
}
/**
Get a descriptor for this console class (used in error checking).

View File

@ -125,9 +125,7 @@ void SoundSDL::open()
}
// Now initialize the TIASound object which will actually generate sound
int tiafreq = myOSystem->settings().getInt("tiafreq");
myTIASound.outputFrequency(myHardwareSpec.freq);
myTIASound.tiaFrequency(tiafreq);
const string& chanResult =
myTIASound.channels(myHardwareSpec.channels, myNumChannels == 2);

View File

@ -2,7 +2,6 @@ MODULE := src/common
MODULE_OBJS := \
src/common/mainSDL.o \
src/common/SoundNull.o \
src/common/SoundSDL.o \
src/common/FrameBufferSoft.o \
src/common/FrameBufferGL.o \

View File

@ -79,7 +79,6 @@ Settings::Settings(OSystem* osystem)
setInternal("sound", "true");
setInternal("fragsize", "512");
setInternal("freq", "31400");
setInternal("tiafreq", "31400");
setInternal("volume", "100");
// Input event options
@ -285,9 +284,8 @@ void Settings::validate()
i = getInt("volume");
if(i < 0 || i > 100) setInternal("volume", "100");
i = getInt("freq");
if(i < 0 || i > 48000) setInternal("freq", "31400");
i = getInt("tiafreq");
if(i < 0 || i > 48000) setInternal("tiafreq", "31400");
if(!(i == 11025 || i == 22050 || i == 31400 || i == 44100 || i == 48000))
setInternal("freq", "31400");
#endif
i = getInt("joydeadzone");
@ -382,8 +380,7 @@ void Settings::usage()
#ifdef SOUND_SUPPORT
<< " -sound <1|0> Enable sound generation\n"
<< " -fragsize <number> The size of sound fragments (must be a power of two)\n"
<< " -freq <number> Set sound sample output frequency (0 - 48000)\n"
<< " -tiafreq <number> Set sound sample generation frequency (0 - 48000)\n"
<< " -freq <number> Set sound sample output frequency (11025|22050|31400|44100|48000)\n"
<< " -volume <number> Set the volume (0 - 100)\n"
<< " -clipvol <1|0> Enable volume clipping (eliminates popping)\n"
<< endl

View File

@ -21,10 +21,9 @@
#include "TIASnd.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TIASound::TIASound(Int32 outputFrequency, Int32 tiaFrequency)
TIASound::TIASound(Int32 outputFrequency)
: myChannelMode(Hardware2Stereo),
myOutputFrequency(outputFrequency),
myTIAFrequency(tiaFrequency),
myOutputCounter(0),
myVolumePercentage(100)
{
@ -68,12 +67,6 @@ void TIASound::outputFrequency(Int32 freq)
myOutputFrequency = freq;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void TIASound::tiaFrequency(Int32 freq)
{
myTIAFrequency = freq;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string TIASound::channels(uInt32 hardware, bool stereo)
{
@ -352,31 +345,31 @@ void TIASound::process(Int16* buffer, uInt32 samples)
switch(myChannelMode)
{
case Hardware2Mono: // mono sampling with 2 hardware channels
while((samples > 0) && (myOutputCounter >= myTIAFrequency))
while((samples > 0) && (myOutputCounter >= 31400))
{
Int16 byte = v0 + v1;
*(buffer++) = byte;
*(buffer++) = byte;
myOutputCounter -= myTIAFrequency;
myOutputCounter -= 31400;
samples--;
}
break;
case Hardware2Stereo: // stereo sampling with 2 hardware channels
while((samples > 0) && (myOutputCounter >= myTIAFrequency))
while((samples > 0) && (myOutputCounter >= 31400))
{
*(buffer++) = v0;
*(buffer++) = v1;
myOutputCounter -= myTIAFrequency;
myOutputCounter -= 31400;
samples--;
}
break;
case Hardware1: // mono/stereo sampling with only 1 hardware channel
while((samples > 0) && (myOutputCounter >= myTIAFrequency))
while((samples > 0) && (myOutputCounter >= 31400))
{
*(buffer++) = v0 + v1;
myOutputCounter -= myTIAFrequency;
myOutputCounter -= 31400;
samples--;
}
break;

View File

@ -26,6 +26,9 @@
This class implements a fairly accurate emulation of the TIA sound
hardware. This class uses code/ideas from z26 and MESS.
Currently, the sound generation routines work at 31400Hz only.
Resampling can be done by passing in a different output frequency.
@author Bradford W. Mott, Stephen Anthony, z26 and MESS teams
@version $Id$
*/
@ -35,7 +38,7 @@ class TIASound
/**
Create a new TIA Sound object using the specified output frequency
*/
TIASound(Int32 outputFrequency = 31400, Int32 tiaFrequency = 31400);
TIASound(Int32 outputFrequency = 31400);
/**
Destructor
@ -53,11 +56,6 @@ class TIASound
*/
void outputFrequency(Int32 freq);
/**
Set the frequency the of the TIA device
*/
void tiaFrequency(Int32 freq);
/**
Selects the number of audio channels per sample. There are two factors
to consider: hardware capability and desired mixing.
@ -159,7 +157,6 @@ class TIASound
ChannelMode myChannelMode;
Int32 myOutputFrequency;
Int32 myTIAFrequency;
Int32 myOutputCounter;
uInt32 myVolumePercentage;

View File

@ -55,7 +55,7 @@ AudioDialog::AudioDialog(OSystem* osystem, DialogContainer* parent,
// Set real dimensions
_w = 35 * fontWidth + 10;
_h = 8 * (lineHeight + 4) + 10;
_h = 7 * (lineHeight + 4) + 10;
// Volume
xpos = 3 * fontWidth; ypos = 10;
@ -95,20 +95,13 @@ AudioDialog::AudioDialog(OSystem* osystem, DialogContainer* parent,
items.push_back("48000 Hz", "48000");
myFreqPopup = new PopUpWidget(this, font, xpos, ypos,
pwidth + myVolumeLabel->getWidth() - 4, lineHeight,
items, "Output freq (*): ", lwidth);
items, "Frequency (*): ", lwidth);
wid.push_back(myFreqPopup);
ypos += lineHeight + 4;
// TIA frequency
// ... use same items as above
myTiaFreqPopup = new PopUpWidget(this, font, xpos, ypos,
pwidth + myVolumeLabel->getWidth() - 4, lineHeight,
items, "TIA freq: ", lwidth);
wid.push_back(myTiaFreqPopup);
ypos += lineHeight + 4;
// Enable sound
xpos = (_w - (font.getStringWidth("Enable sound") + 10)) / 2;
ypos += 4;
mySoundEnableCheckbox = new CheckboxWidget(this, font, xpos, ypos,
"Enable sound", kSoundEnableChanged);
wid.push_back(mySoundEnableCheckbox);
@ -148,9 +141,6 @@ void AudioDialog::loadConfig()
// Output frequency
myFreqPopup->setSelected(instance().settings().getString("freq"), "31400");
// TIA frequency
myTiaFreqPopup->setSelected(instance().settings().getString("tiafreq"), "31400");
// Enable sound
bool b = instance().settings().getBool("sound");
mySoundEnableCheckbox->setState(b);
@ -174,9 +164,6 @@ void AudioDialog::saveConfig()
// Output frequency
settings.setString("freq", myFreqPopup->getSelectedTag());
// TIA frequency
settings.setString("tiafreq", myTiaFreqPopup->getSelectedTag());
// Enable/disable sound (requires a restart to take effect)
instance().sound().setEnabled(mySoundEnableCheckbox->getState());
@ -194,7 +181,6 @@ void AudioDialog::setDefaults()
myFragsizePopup->setSelected("512", "");
myFreqPopup->setSelected("31400", "");
myTiaFreqPopup->setSelected("31400", "");
mySoundEnableCheckbox->setState(true);
@ -211,7 +197,6 @@ void AudioDialog::handleSoundEnableChange(bool active)
myVolumeLabel->setEnabled(active);
myFragsizePopup->setEnabled(active);
myFreqPopup->setEnabled(active);
myTiaFreqPopup->setEnabled(active);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -45,7 +45,6 @@ class AudioDialog : public Dialog
StaticTextWidget* myVolumeLabel;
PopUpWidget* myFragsizePopup;
PopUpWidget* myFreqPopup;
PopUpWidget* myTiaFreqPopup;
CheckboxWidget* mySoundEnableCheckbox;
private: