Stop using basic_string for Sint32. We only use it in one place and it's

a bit of a performance hit there ...
This commit is contained in:
Glenn Maynard
2003-04-25 19:40:49 +00:00
parent c6115c79b9
commit 60921db8e5
3 changed files with 22 additions and 30 deletions
+17 -5
View File
@@ -299,15 +299,27 @@ void RageSoundManager::SetPrefs(float MixVol)
SoundMixBuffer::SoundMixBuffer()
{
vol = SOUNDMAN->GetMixVolume();
bufsize = used = 0;
mixbuf = NULL;
}
SoundMixBuffer::~SoundMixBuffer()
{
free(mixbuf);
}
void SoundMixBuffer::write(const Sint16 *buf, unsigned size)
{
if(mixbuf.size() < size)
if(bufsize < size)
{
basic_string<Sint32, char_traits_Sint32> empty(size-mixbuf.size(), 0);
mixbuf = (Sint32 *) realloc(mixbuf, sizeof(Sint32) * size);
bufsize = size;
}
mixbuf.insert(mixbuf.end(), empty.begin(), empty.end());
if(used < size)
{
memset(mixbuf + used, 0, (size - used) * sizeof(Sint32));
used = size;
}
for(unsigned pos = 0; pos < size; ++pos)
@@ -330,7 +342,7 @@ void SoundMixBuffer::write(const Sint16 *buf, unsigned size)
void SoundMixBuffer::read(Sint16 *buf)
{
for(unsigned pos = 0; pos < mixbuf.size(); ++pos)
for(unsigned pos = 0; pos < used; ++pos)
{
/* XXX: dither */
Sint32 out = (mixbuf[pos]) / 32768;
@@ -338,5 +350,5 @@ void SoundMixBuffer::read(Sint16 *buf)
buf[pos] = Sint16(out);
}
mixbuf.erase();
used = 0;
}
+5 -2
View File
@@ -68,16 +68,19 @@ public:
/* This inputs and outputs 16-bit 44khz stereo input. */
class SoundMixBuffer
{
basic_string<Sint32, char_traits_Sint32> mixbuf;
Sint32 *mixbuf;
unsigned bufsize; /* actual allocated samples */
unsigned used; /* used samples */
float vol;
public:
void write(const Sint16 *buf, unsigned size);
void read(Sint16 *buf);
unsigned size() const { return mixbuf.size(); }
unsigned size() const { return used; }
void SetVolume(float f);
SoundMixBuffer();
~SoundMixBuffer();
};
extern RageSoundManager *SOUNDMAN;
-23
View File
@@ -46,28 +46,5 @@ bool SDL_GetEvent(SDL_Event &event, int mask);
#define TRAIT_WHITE_ONLY 0x0004 /* 8alphaonly */
int FindSurfaceTraits(const SDL_Surface *img);
struct char_traits_Sint32: public char_traits<Sint32>
{
static Sint32 *copy(Sint32 *s, const Sint32 *p, size_t n)
{
memcpy(s, p, n * sizeof(Sint32));
return s;
}
static Sint32 *move(Sint32 *s, const Sint32 *p, size_t n)
{
memmove(s, p, n * sizeof(Sint32));
return s;
}
static Sint32 *assign(Sint32 *s, unsigned cnt, int n)
{
while(cnt--) *(s++) = n;
return s;
}
static void assign(Sint32 &c1, Sint32 c2)
{
c1 = c2;
}
};
#endif