//-------------------------------------------------------------------------------------------------------
// VST Plug-Ins SDK
// Version 2.4		$Date: 2006/11/13 09:08:27 $
//
// Category     : VST 2.x SDK Samples
// Filename     : AEcho_Hiding_Wtm.h
// Created by   : Steinberg Media Technologies
// Description  : Simple Delay plugin (Mono->Stereo)
//
// © 2006, Steinberg Media Technologies, All Rights Reserved
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
// Date: 2008/05/10 
//
// Category     : VST 2.x SDK Samples
// Filename     : AEcho_Hiding_Wtm.h
// Created by   : David Henzl
// Description  : Audio Watermarking Plug-In(Echo Hiding) (Mono->Stereo)
//-------------------------------------------------------------------------------------------------------

#ifndef __AEcho_Hiding_Wtm__
#define __AEcho_Hiding_Wtm__

#include "../vst2.x/audioeffectx.h"
#include "../editor/VSTGLEditor.h"

#define PI 3.14159265358979323846
#define M_PI 3.14159265358979323846

class AEchoHidingProgram;

//------------------------------------------------------------------------
class AEcho_Hiding_Wtm : public AudioEffectX
{
public:
	AEcho_Hiding_Wtm (audioMasterCallback audioMaster);
	~AEcho_Hiding_Wtm ();

	//---from AudioEffect-----------------------
	virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);
	//Funkce volaná funkcí processReplacing. Slouží ke vložení vodoznaku do audio signálu.
	virtual void subProcessInserting (float *inL,float *inR, float *outL, float *outR, long sampleFrames);
	//Funkce volaná funkcí processReplacing. Slouží k detekci vodoznaku v audio signálu.
	virtual void subProcessDecoding (float *inL,float *inR, float *outL, float *outR, long sampleFrames);
	//Rychlá Fourierova transformace FFT. Využita k detekci vodoznaku.
	virtual void fft(float *x,float *y,int order,int param);
	//Funkce pro mixování signálu, která generuje modulační signál.
	//Slouží ke složení originálního signálu a směsi zpoždění.
	virtual float mixer_signal(float f,int position,char* bits,int counter,int L1,int L2,int L3);
	//Převod vodoznaku(String) na posloupnost bitů.(Inserting Mode)
	virtual int Wtm2Bin(char *Wtm);
	//Převod posloupnosti bitů na vodoznak(String).(Decoding Mode)
	virtual int Bin2Wtm(int DecBits[],int i);
	//Funkce volána funkcí subProcessDecoding. Slouží k dekódování vložených vodoznaků
	virtual void Decode(int DecBits[],int BitsCounter);
	VstIntPtr test_buff;
	//Nastavení vodoznaku
	virtual void setWatermark (char wattermark[]);
	/*******Funkce nutné pro běh VST plug-in modulu***************/
	virtual void setProgram (VstInt32 program);
	virtual void setProgramName (char* name);
	virtual void getProgramName (char* name);
	virtual bool getProgramNameIndexed (VstInt32 category, VstInt32 index, char* text);

	virtual void setParameter (VstInt32 index, float value);
	virtual float getParameter (VstInt32 index);
	virtual void getParameterLabel (VstInt32 index, char* label);
	virtual void getParameterDisplay (VstInt32 index, char* text);
	virtual void getParameterName (VstInt32 index, char* text);

	virtual void resume ();
	virtual void suspend ();
	virtual bool getEffectName (char* name);
	virtual bool getVendorString (char* text);
	virtual bool getProductString (char* text);
	virtual VstInt32 getVendorVersion () { return 1000; };

	virtual VstPlugCategory getPlugCategory () { return kPlugCategEffect; };
	/*************************************************************/
	//-------------------------------------------------------------
	enum
	{
		// Global
		kNumPrograms = 16,

		// Parameters Tags
		kDelay0 = 0,
		kDelay1,
		kAlfa,
		kMode,
		kVSTblok,
		kWtmblok,
		kWitchBlok,
		kWatermark,
		kNumParams,
		kWavDisp,
		kWavDispSize,
		kCharCounter,

	};

protected:

	float triangle (float f, float position);
	AEchoHidingProgram* programs;

	float params[kNumParams+4];

	int* my_index;
	float* bufferL;
	float* bufferR;
	float* fftbuffer;
	float* ifftbuffer;
	float* corr;
	float* decodedbits;
	float* y2_1;
	float* y2_2;
	//float* x;
	char Wtm[20];
	char bits[200];
	int DecBits[20000];
	int RecBits[250][80];
	int* SumWtm;//rekonstruovany vodoznak
	float xx[512];
	int* one;
	int* zer;
	int partWtm;
	int syncposition;
	int StartDec,StopDec;
	int Wtmlength;
	long delay;
	long size;
	int pSize;
	int fftsize;
	long cursor;
	long rcursor;
	long wcursor;
	float VolumeUnit;
	VSTGLEditor* GLeditor;

	int delay0;
	int delay1;
	float Alfa;
	int position;
	float stepDec;
	float stepSum;
	int stepRecBits;
	int stepSingleWtm;
	float Energy;
	float ZeroCross;
	bool  canWatermark,canDetect,sync;
	int   N;
	int   N2;
	int   blockCounter;
	int   BitsCounter;
	int   NumberOfBits;
	int L1,L2,L3;  //indexy pro mixer_signal

};
//------------------------------------------------------------------------
// Nastavení programů(parametrů) plug-inu 
class AEchoHidingProgram 
{
	friend class AEchoHidingProgram;
public:
	AEchoHidingProgram ();
	~AEchoHidingProgram () {};

	//private:	
	float params[AEcho_Hiding_Wtm::kNumParams];
	char name[24];
	char Wtm[16];

};
#endif
