Buffer-leak fixes

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@714 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2003-02-07 21:43:06 +00:00
parent 9ed2fb6496
commit 4fe1275a57
6 changed files with 87 additions and 51 deletions
+52 -30
View File
@@ -472,14 +472,22 @@ mixSDL_Sourcei (mixSDL_Object srcobj, mixSDL_SourceProp pname,
src->looping = value; src->looping = value;
break; break;
case MIX_BUFFER: case MIX_BUFFER:
if (src->cqueued > 0) {
mixSDL_SourceUnqueueAll (src); mixSDL_Buffer *buf = (mixSDL_Buffer *) value;
src->firstqueued = (mixSDL_Buffer *) value; if (src->cqueued > 0)
src->nextqueued = src->firstqueued; mixSDL_SourceUnqueueAll (src);
src->lastqueued = src->nextqueued;
if (src->lastqueued) if (buf && !mixSDL_CheckBufferState (buf, "mixSDL_Sourcei"))
src->lastqueued->next = 0; break;
src->firstqueued = buf;
src->nextqueued = src->firstqueued;
src->lastqueued = src->nextqueued;
if (src->lastqueued)
src->lastqueued->next = 0;
src->cqueued = 1;
}
break; break;
case MIX_SOURCE_STATE: case MIX_SOURCE_STATE:
#ifdef DEBUG #ifdef DEBUG
@@ -812,30 +820,9 @@ mixSDL_SourceQueueBuffers (mixSDL_Object srcobj, uint32 n,
for (i = n, pobj = pbufobj; i; i--, pobj++) for (i = n, pobj = pbufobj; i; i--, pobj++)
{ {
mixSDL_Buffer *buf = (mixSDL_Buffer *) *pobj; mixSDL_Buffer *buf = (mixSDL_Buffer *) *pobj;
if (!buf || buf->magic != mixSDL_bufMagic) if (!buf || !mixSDL_CheckBufferState (buf,
"mixSDL_SourceQueueBuffers"))
{ {
mixSDL_SetError (MIX_INVALID_NAME);
#ifdef DEBUG
fprintf (stderr, "mixSDL_SourceQueueBuffers(): not a buffer\n");
#endif
break;
}
else if (buf->locked)
{
mixSDL_SetError (MIX_INVALID_OPERATION);
#ifdef DEBUG
fprintf (stderr, "mixSDL_SourceQueueBuffers(): "
"locked buffer attempted\n");
#endif
break;
}
else if (buf->state != MIX_BUF_FILLED)
{
mixSDL_SetError (MIX_INVALID_OPERATION);
#ifdef DEBUG
fprintf (stderr, "mixSDL_SourceQueueBuffers(): "
"invalid buffer attempted\n");
#endif
break; break;
} }
} }
@@ -1625,6 +1612,41 @@ mixSDL_ConvertBuffer (uint32 srcfmt, void* srcdata, uint32 srcsize,
* Buffer internals * Buffer internals
*/ */
static __inline__ bool
mixSDL_CheckBufferState (mixSDL_Buffer *buf, const char* FuncName)
{
if (!buf)
return false;
if (buf->magic != mixSDL_bufMagic)
{
mixSDL_SetError (MIX_INVALID_NAME);
#ifdef DEBUG
fprintf (stderr, "%s(): not a buffer\n", FuncName);
#endif
return false;
}
if (buf->locked)
{
mixSDL_SetError (MIX_INVALID_OPERATION);
#ifdef DEBUG
fprintf (stderr, "%s(): locked buffer attempted\n", FuncName);
#endif
return false;
}
if (buf->state != MIX_BUF_FILLED)
{
mixSDL_SetError (MIX_INVALID_OPERATION);
#ifdef DEBUG
fprintf (stderr, "%s: invalid buffer attempted\n", FuncName);
#endif
return false;
}
return true;
}
static void static void
mixSDL_ConvertBuffer_internal (mixSDL_Convertion *conv) mixSDL_ConvertBuffer_internal (mixSDL_Convertion *conv)
{ {
@@ -79,6 +79,8 @@ static void mixSDL_SourceStop_internal (mixSDL_Source *src);
static void mixSDL_SourceActivate (mixSDL_Source* src); static void mixSDL_SourceActivate (mixSDL_Source* src);
static void mixSDL_SourceDeactivate (mixSDL_Source* src); static void mixSDL_SourceDeactivate (mixSDL_Source* src);
static __inline__ bool mixSDL_CheckBufferState (mixSDL_Buffer *buf,
const char* FuncName);
/* Reentrant mutex */ /* Reentrant mutex */
typedef struct typedef struct
+10 -5
View File
@@ -28,15 +28,16 @@ PlayChannel (COUNT channel, PVOID sample, COUNT sample_length, COUNT loop_begin,
{ {
TFB_SoundSample *tfb_sample = *(TFB_SoundSample**) sample; TFB_SoundSample *tfb_sample = *(TFB_SoundSample**) sample;
soundSource[channel].sample = tfb_sample; soundSource[channel].sample = tfb_sample;
TFBSound_SourceRewind (soundSource[channel].handle); TFBSound_SourceStop (soundSource[channel].handle);
TFBSound_Sourcei (soundSource[channel].handle, TFBSOUND_BUFFER, tfb_sample->buffer[0]); TFBSound_Sourcei (soundSource[channel].handle, TFBSOUND_BUFFER,
tfb_sample->buffer[0]);
TFBSound_SourcePlay (soundSource[channel].handle); TFBSound_SourcePlay (soundSource[channel].handle);
} }
void void
StopChannel(COUNT channel, unsigned char Priority) StopChannel (COUNT channel, unsigned char Priority)
{ {
TFBSound_SourceRewind (soundSource[channel].handle); StopSource (channel);
} }
BOOLEAN BOOLEAN
@@ -44,7 +45,8 @@ ChannelPlaying (COUNT WhichChannel)
{ {
TFBSound_IntVal state; TFBSound_IntVal state;
TFBSound_GetSourcei (soundSource[WhichChannel].handle, TFBSOUND_SOURCE_STATE, &state); TFBSound_GetSourcei (soundSource[WhichChannel].handle,
TFBSOUND_SOURCE_STATE, &state);
if (state == TFBSOUND_PLAYING) if (state == TFBSOUND_PLAYING)
return TRUE; return TRUE;
return FALSE; return FALSE;
@@ -236,7 +238,10 @@ _ReleaseSoundBankData (MEM_HANDLE Snd)
for (i = 0; i < NUM_SOUNDSOURCES; ++i) for (i = 0; i < NUM_SOUNDSOURCES; ++i)
{ {
if (soundSource[i].sample == (*sptr)) if (soundSource[i].sample == (*sptr))
{
StopSource (i);
soundSource[i].sample = NULL; soundSource[i].sample = NULL;
}
} }
if ((*sptr)->decoder) if ((*sptr)->decoder)
+20 -1
View File
@@ -29,7 +29,26 @@ StopSound (void)
for (i = FIRST_SFX_SOURCE; i <= LAST_SFX_SOURCE; ++i) for (i = FIRST_SFX_SOURCE; i <= LAST_SFX_SOURCE; ++i)
{ {
TFBSound_SourceRewind (soundSource[i].handle); StopSource (i);
}
}
void
StopSource (int iSource)
{
TFBSound_IntVal processed;
TFBSound_SourceStop (soundSource[iSource].handle);
TFBSound_GetSourcei (soundSource[iSource].handle,
TFBSOUND_BUFFERS_PROCESSED, &processed);
if (processed != 0)
{
TFBSound_Object *buffer = (TFBSound_Object *)
HMalloc (sizeof (TFBSound_Object) * processed);
TFBSound_SourceUnqueueBuffers (soundSource[iSource].handle,
processed, buffer);
HFree (buffer);
} }
} }
+2
View File
@@ -89,6 +89,8 @@ typedef struct tfb_soundsource
extern TFB_SoundSource soundSource[]; extern TFB_SoundSource soundSource[];
void StopSource (int iSource);
void SetSFXVolume (float volume); void SetSFXVolume (float volume);
void SetSpeechVolume (float volume); void SetSpeechVolume (float volume);
void DoTrackTag (TFB_SoundTag *tag); void DoTrackTag (TFB_SoundTag *tag);
+1 -15
View File
@@ -111,9 +111,6 @@ PlayStream (TFB_SoundSample *sample, uint32 source, bool looping, bool scope, bo
void void
StopStream (uint32 source) StopStream (uint32 source)
{ {
TFBSound_IntVal queued, processed;
uint32 *buffer;
soundSource[source].stream_should_be_playing = FALSE; soundSource[source].stream_should_be_playing = FALSE;
soundSource[source].sample = NULL; soundSource[source].sample = NULL;
@@ -127,18 +124,7 @@ StopStream (uint32 source)
soundSource[source].sbuf_size = 0; soundSource[source].sbuf_size = 0;
soundSource[source].sbuf_offset = 0; soundSource[source].sbuf_offset = 0;
TFBSound_SourceStop (soundSource[source].handle); StopSource (source);
TFBSound_GetSourcei (soundSource[source].handle, TFBSOUND_BUFFERS_PROCESSED, &processed);
TFBSound_GetSourcei (soundSource[source].handle, TFBSOUND_BUFFERS_QUEUED, &queued);
//fprintf (stderr, "StopStream(): source %d processed %d queued %d num_buffers %d\n", source, processed, queued, soundSource[source].sample->num_buffers);
if (processed != 0)
{
buffer = (uint32 *) HMalloc (sizeof (uint32) * processed);
TFBSound_SourceUnqueueBuffers (soundSource[source].handle, processed, buffer);
HFree (buffer);
}
} }
void void