/* 
*	AudioSynthNoiseWhite_F32
*
*	Created: Chip Audette (OpenAudio), Feb 2017
*       Extended from on Teensy Audio Library
*
*	License: MIT License.  Use at your own risk.
*/

#ifndef synth_whitenoise_f32_h_
#define synth_whitenoise_f32_h_
#include "Arduino.h"
#include "AudioStream_F32.h"
#include <Audio.h>
#include "utility/dspinst.h"

class AudioSynthNoiseWhite_F32 : public AudioStream_F32
{
//GUI: inputs:0, outputs:1 //this line used for automatic generation of GUI node
//GUI: shortName:whitenoise  //this line used for automatic generation of GUI node
public:
	AudioSynthNoiseWhite_F32() : AudioStream_F32(0, NULL) {
		noise.disconnectFromUpdateAll(); //requires modification to AudioStream.h
		i16_to_f32.disconnectFromUpdateAll(); //requires modification to AudioStream.h
		output_queue.disconnectFromUpdateAll(); //requires modification to AudioStream.h
		
		patchCord100 = new AudioConnection(noise, 0, i16_to_f32, 0);  //noise is an Int16 audio object.  So, convert it!
    	patchCord101 = new AudioConnection_F32(i16_to_f32, 0, output_queue, 0);
	}
	
	//define audio processing stack right here.
    AudioSynthNoiseWhite  	noise;
    AudioConvert_I16toF32   i16_to_f32; 
    AudioRecordQueue_F32    output_queue;    
    AudioConnection     *patchCord100;
    AudioConnection_F32 *patchCord101;
	
    void update(void) {
		//Serial.println("AudioSynthNoiseWhite_F32: update().");
		output_queue.begin();
		//output_queue.clear();

		//manually update audio blocks in the desired order
		noise.update();  //the output should be routed directly via the AudioConnection
		i16_to_f32.update();  // output is routed via the AudioConnection
		output_queue.update();

		//get the output
		audio_block_f32_t  *block = output_queue.getAudioBlock();
		if (block == NULL) return;

		//transmit the block, and release memory
		AudioStream_F32::transmit(block);
		output_queue.freeAudioBlock();
		output_queue.end();
    }
    void amplitude(float n) {
    	noise.amplitude(n);
    }
    
private:    

};

#endif