ITANUPCUFilter.h 2.09 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
#ifndef IW_ITA_NUP_CONV_FILTERCOMPONENTIMPL
#define IW_ITA_NUP_CONV_FILTERCOMPONENTIMPL

#include "ITANUPartitioningScheme.h"

#include <ITAAtomicPrimitives.h>
#include <ITACriticalSection.h>
#include <ITAFFT.h>
#include <ITAStopWatch.h>

#include <vector>

// Forwards
class UFilterPool;

// Implementation class for filter componentes
class CUFilter
{
public:
	// Konstruktor
	CUFilter( const CUPartition* pPartition, UFilterPool* pParentPool );
	~CUFilter();

	bool IsInUse() const;
	void Release();

	void Load( const float* pfLeftData, int iLeftDataLength, const float* pfRightData, int iRightDataLength );

	void Zero();
	void Identity();

	friend class ITANUPConvolutionImpl;

private:
	// Interne Zustandklasse, welche Referenzzhler enthlt.
	// Es werden immer zwei Zhler bentigt: Prep und Use.
	class State
	{
	public:
		State();

		bool isInUse() const;
		void addPrep();
		void removePrep();
		void xchangePrep2Use();
		void removeUse();

		// Damit auf lteren Windows-System, welche keine DCAS-Operationen bereistellen,
		// dieser zwei-elementige Zustand atomar verndert werden kann,
		// muss eine Datenstruktur von 32-Bit realisiert werden.
		// 16-Bit fr die Zhler ist immer noch ausreichend
		typedef struct {
			int16_t iPrepRefCount;
			int16_t iUseRefCount;
		} StateStruct;

		CUFilter* m_pParent;
		volatile StateStruct m_oState;

		void modifyState( int16_t iPrepDelta, int16_t iUseDelta );
	};

	const CUPartition* m_pPartition;			// Index des zugehrigen Segments in Partitionierung
	UFilterPool* m_pParentPool;				// bergeordneter Pool
	State m_oState;							// Aktueller Zustand
	int m_iDataBufSize;						// Anzahl der floats im internen Datenpuffer
	float* m_pfDataBuf;						// Interner Datenpuffer
	std::vector<float*> vpfPartSpecBuf;		// Datenpuffer fr die Teilspektren (niemals Null)
	std::vector<float*> vpfPartSpecData;	// Zeiger auf Teilspektren (knnen auch Null sein)
	ITAFFT m_fft;
	ITACriticalSection m_csReentrance;		// Reentrance-Lock fr die Load-Methode

	// PROFILING:
	ITAStopWatch sw;

	friend class CStage;
	friend class UFilterPool;
};

#endif // IW_ITA_NUP_CONV_FILTERCOMPONENTIMPL