commit 5a620efc525d83480f48978f91da004c633f5d7d
parent 72294cf3e6c96db75249b3973b156c70786c51fe
Author: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Date: Fri, 19 May 2023 16:04:23 +0800
audio_windows: fix leaked buffer
This leak was caused by allocating the Buffer by the caller and the
within the callee, where the callee ignores the buffer provided to it
by the caller, and allocates it's own which it writes to the out pointer.
This lead to 1MB of leaked memory per invocation.
Signed-off-by: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Diffstat:
1 file changed, 6 insertions(+), 13 deletions(-)
diff --git a/audio_windows.c b/audio_windows.c
@@ -541,13 +541,12 @@ done:
// decode buffers the decoded PCM s16le data and returns it via out.
Error*
-decode(IMFSourceReader * reader, Buffer ** out)
+decode(IMFSourceReader * reader, Buffer * out)
{
assert(reader);
-
+
IMFMediaBuffer *bufferReader = NULL; // buffer object containing the raw buffer.
IMFSample *pSample = NULL; // sample object containing on or more streams.
- Buffer *buffer = NULL; // Buffer to accumulate decoded PCM and return to Go.
BYTE *chunk = NULL; // pointer to start of chunk.
LONGLONG prev_time_stamp = -1;
@@ -556,10 +555,6 @@ decode(IMFSourceReader * reader, Buffer ** out)
HRESULT hr = S_OK;
Error *err = NULL;
- // Heap allocated buffer to accumulate the audio data.
- // NOTE(jfm): Free from cgo side with BufferFree().
- buffer = BufferNew();
-
// Stream all the data into a byte buffer.
// NOTE(jfm): we can create a streaming api by extracting this loop
@@ -642,7 +637,7 @@ decode(IMFSourceReader * reader, Buffer ** out)
goto done;
}
- BufferWrite(buffer, cbBuffer, chunk);
+ BufferWrite(out, cbBuffer, chunk);
// Unlock the reader that we just copied from.
hr = bufferReader->lpVtbl->Unlock(bufferReader);
@@ -656,8 +651,6 @@ decode(IMFSourceReader * reader, Buffer ** out)
chunk = NULL;
}
- *out = buffer;
-
done:
if (pSample != NULL)
@@ -739,9 +732,9 @@ Decode(BYTE* compressed, UINT size)
goto done;
}
- Buffer * buffer = NULL;
+ Buffer * buffer = BufferNew();
- r.Err = decode(reader, &buffer);
+ r.Err = decode(reader, buffer);
if (r.Err != NULL)
{
@@ -856,7 +849,7 @@ Load(char* path)
// NOTE(jfm): Free from cgo side with BufferFree().
buffer = BufferNew();
- err = decode(reader, &buffer);
+ err = decode(reader, buffer);
if (err != NULL)
{