1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #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
|