It works, but (2)

Gnuplot_067

This is to show how the pointers move in the buffer.

	buffer_size =  32   * 1024;
	period_size =   5.5 * 1024; /* intentionally odd number */
	nfft        =   2   * 1024;

	double *audio_signal {nullptr};
	double *signal_start {nullptr};  /* valid data in [start,end) */
	double *signal_end   {nullptr};

	audio_signal = new double [large_enough];
	signal_start = audio_signal;
	signal_end   = audio_signal;

	for (int i = 0; i < period_size; i++) {
		*signal_end++ = samples[i]; /* get new set of samples */
	}

	while(s->signal_end - s->signal_start >= nfft) {
		auto p = signal_start;
		for (int i = 0; i < nfft; i++) {
			in_real[i] = *p++ * audio_window[i]; /* copy into FFT buffer */
		}
		fftw_execute(s->plan);
		/* update waterfall, etc. */
		signal_start += nfft/2; /* shift the FFT window for half the FFT size */
	}

	/* move a bulk of samples not used for FFT to the top of the buffer */

	auto p = s->audio_signal;
	auto q = s->signal_start;
	while(q < s->signal_end) {
		*p++ = *q++;
	}
	s->signal_start = s->audio_signal;
	s->signal_end   = p;

It seems that the buffer operation is stable.

Gnuplot_068