ITAStreamFilter.h 3.19 KB
Newer Older
Jonas Stienen's avatar
Jonas Stienen committed
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 81 82 83 84 85 86 87 88 89 90 91
/*
* ----------------------------------------------------------------
*
*		ITA core libs
*		(c) Copyright Institute of Technical Acoustics (ITA)
*		RWTH Aachen University, Germany, 2015-2016
*
* ----------------------------------------------------------------
*				    ____  __________  _______
*				   //  / //__   ___/ //  _   |
*				  //  /    //  /    //  /_|  |
*				 //  /    //  /    //  ___   |
*				//__/    //__/    //__/   |__|
*
* ----------------------------------------------------------------
*
*/
// $Id: ITAStreamFunctionGenerator.h 2900 2012-09-17 08:42:42Z stienen $

#ifndef INCLUDE_WATCHER_ITA_STREAM_FILTER
#define INCLUDE_WATCHER_ITA_STREAM_FILTER

#include <ITADataSourcesDefinitions.h>

#include <ITADataSource.h>
#include <ITATypes.h>

#include <vector>

class ITAStreamFilter : public ITADatasource
{
public:
	//! Konstruktor
	ITAStreamFilter(ITADatasource* pdsInput=NULL);	

	//! Destruktor
	virtual ~ITAStreamFilter();

	//! Eingangsdatenquelle zurckgeben
	ITADatasource* GetInputDatasource() const;

	// TODO: Erstmal aus...
	//! Eingangsdatenquelle setzen
	//void SetInputDatasource(ITADatasource* pdsInput);
	
	// -= Realisierung der abstrakten Methoden von "ITADatasource" =-
    const float* GetBlockPointer(unsigned int uiChannel, bool bWaitForData=true);
	void IncrementBlockPointer();

protected:
	//! Verarbeitungsmethode
	/**
	 * In dieser Methode werden die neue Eingangsdaten aller Kanle verarbeitet und das Filter berechnet.
	 */
	virtual void ProcessAllChannels(const float** ppfInputData, float** ppfOutputData) {
		/* 
		   Hinweis: Diese Vorgabe-Implementierung setzt den Methodenaufruf in die kanalweise
		            Verarbeitung mittels der Methode "ProcessChannel" um. Diese Verfahrensweise
					ist adquat fr Filter welche eine kanal-unabhngige Verarbeitung erlauben.

					Mchten Sie einen Filter mit kanal-abhngiger Verarbeitung bauen,
					so muss diese Methode entsprechend angepasst werden.

					Hierbei mssen Sie nicht zwangslufig die Methode "ProcessChannel" involvieren.
	    */

		for (unsigned int i=0; i<m_uiChannels; i++) ProcessChannel(i, ppfInputData[i], ppfOutputData[i]);
	}

	//! Verarbeitungsmethode
	/**
	 * In dieser Methode werden fr einen Kanal neue Eingangsdaten verarbeitet und das Filter berechnet.
	 * Diese Methode wird die kanal-unabhngige Datenverarbeitung des Filters realisiert. Kanal-unabhngig
	 * bedeutet, dass die Ausgangsdaten dieses Kanals einzig aus den Eingangsdaten des selben Kanals 
	 * berechnet werden knnen.
	 */
	virtual void ProcessChannel(unsigned int uiChannel, const float* pfInputData, float* pfOutputData) {
		// Dies ist eine Vorgabe-Implementierung, welche die Eingangsdaten unverndert in die Ausgabe kopiert
		//fm_copy(pfOutputData, pfInputData, m_uiBlocklength);
		memcpy(pfOutputData, pfInputData, m_uiBlocklength * sizeof(float));
	}

private:
	ITADatasource* m_pdsInput;					// Eingangsdatenquelle
	std::vector<const float*> m_vpfInputData;	// Eingangsdatenzeiger
	std::vector<float*> m_vpfOutputBuffer;		// Ausgabepuffer
	bool m_bGBPCalled;							// Flag die Anzeigt ob seit dem letzten IncrementBlockPointer (IBP)
												// bereits ein erneuter Eintritt in GetBlockPointer (GBP) erfolgt ist
};

#endif // INCLUDE_WATCHER_ITA_STREAM_FILTER