#ifndef NULLSOFT_ALLOCLAYERH #define NULLSOFT_ALLOCLAYERH #include "WMHandler.h" #include "BufferPool.h" #include 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