winamp/Src/Plugins/Input/in_wmvdrm/AllocLayer.h
2024-09-24 14:54:57 +02:00

80 lines
1.5 KiB
C++

#ifndef NULLSOFT_ALLOCLAYERH
#define NULLSOFT_ALLOCLAYERH
#include "WMHandler.h"
#include "BufferPool.h"
#include <cassert>
class AllocLayer : public WMHandler
{
public:
AllocLayer(IWMReader *reader)
: readerAdvanced(0),
listenOutput( -1),
maxSize(0)
{
reader->QueryInterface(&readerAdvanced);
}
~AllocLayer()
{
if (readerAdvanced)
{
readerAdvanced->Release();
readerAdvanced = 0;
}
}
void Listen(long output)
{
listenOutput = output;
if (output != -1)
{
readerAdvanced->SetAllocateForOutput(listenOutput, TRUE);
readerAdvanced->GetMaxOutputSampleSize(listenOutput, &maxSize);
assert(maxSize>0);
pool.SetAllocSize(maxSize);
}
}
void Listen(long output, long numBuffers)
{
listenOutput = output;
if (output != -1)
{
readerAdvanced->SetAllocateForOutput(listenOutput, TRUE);
readerAdvanced->GetMaxOutputSampleSize(listenOutput, &maxSize);
assert(maxSize>0);
pool.SetAllocSize(maxSize);
pool.PreAllocate(numBuffers);
pool.limit=numBuffers;
}
}
void FreeBuffers()
{
pool.FreeBuffers();
}
BufferPool pool;
private:
void AllocateOutput(long outputNum, long bufferSize, INSSBuffer *&buffer)
{
if (outputNum == listenOutput)
{
assert(maxSize >= bufferSize);
buffer = pool.GetBuffer(bufferSize);
}
else
WMHandler::AllocateOutput(outputNum, bufferSize, buffer); // let other handlers have a shot at it first.
}
// WMHandler
long listenOutput;
DWORD maxSize;
IWMReaderAdvanced *readerAdvanced;
};
#endif