ITANUPCInputBuffer1.h 1.7 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
#ifndef __INPUTBUFFER1_H__
#define __INPUTBUFFER1_H__

#include <vector>

/*
   Die Klasse InputBuffer1 realisiert den Eingabepuffer für einen Kanal.
   Er hat eine feste Größe erzeugt.
   Eingabedaten werden Block- und Kanalweise übergeben.
   Der Eingabecursor wird immer in Blocklänge-Schritten erhöht.
   Daten können mittels der Methode get entnommen werden.
   */

class CInputBuffer1
{
public:
	// Konstruktor
	// Wichtig: Die Länge muß Vielfaches der Blocklänge sein!
	CInputBuffer1( unsigned int uiBlocklength, unsigned int uiSize );

	// Destruktor
	~CInputBuffer1();

	// Puffer zurücksetzen
	void reset();

	/* Daten lesen

	   Parameter: pfDest     Zielbuffer
	   uiOffset	 (Lese)Position
	   uiLength   Länge (Anzahl Samples)

	   Rückgabewert: false, falls die angeforderten Daten nur Stille sind
	   und ausschließlich Nullsamples enthalten
	   true,  falls die Daten nicht Stille sind
	   */

	bool get( float* pfDest, unsigned int uiOffset, unsigned int uiLength );

	// Daten hineinlegen
	// Info: Hier wird immer genau eine Blocklänge kopiert!
	void put( const float* pfSource, float fGain = 1.0 );

	// Daten hineinmischen
	// Info: Hier wird immer genau eine Blocklänge eingemischt!
	void mix( const float* pfSource, float fGain = 1.0 );

	// (Schreib)Cursor weitersetzen
	void incrementCursor();

	/* Gibt die Leseposition im Puffer zurück, ab der - inklusive des
	   aktuellen Block - die gewünschte Länge Samples gelesen werden können.
	   (Für Tasks) */
	unsigned int getOffset( unsigned int uiLength );

private:
	unsigned int uiCursor;				// Schreibcursor/Basiscursor
	unsigned int m_uiBlocklength;
	unsigned int m_uiSize;
	float* m_pfData;
	std::vector< bool > m_vbSilence;
};

#endif // __INPUTBUFFER1_H__