It works, but

Selection_057

Accessing an array with a pointer is not a very good idea.

	audio_signal = new double [buffer_size];
	signal_start = audio_signal;
	signal_end   = audio_signal; /* valid signal in [start, end) */
//
	for (int i = 0; i < (int) (period_size * channels); i++) {
		*signal_end++ = samples[i]; /* get new signal */
	}
//
	if(signal_end - signal_start >= nfft) { /* if there is enough for FFT */
		for (int i = 0; i < nfft; i++) {
			in_real[i] = *signal_start++ * audio_window[i];
		}
	}
//
	auto p = signal_start;
	auto q = audio_signal;
	while(p < signal_end) {
		*q++ = *p++;
	}

	signal_start = audio_signal;
	signal_end   = q;

The code is far from nice and simple.