removed unnecessary extra buffers (int arrays) between audio source and FFTW input

master
karlstav 6 years ago
parent 90ecd6dd0c
commit 41189b76e6
  1. 148
      cava.c
  2. 31
      input/common.c
  3. 9
      input/common.h

148
cava.c

@ -76,13 +76,10 @@ int reload_colors = 0;
// will allow us to not free them on exit without ASan complaining
struct config_params p;
double *in_bass_r, *in_bass_l;
fftw_complex *out_bass_l, *out_bass_r;
fftw_plan p_bass_l, p_bass_r;
double *in_mid_r, *in_mid_l;
fftw_complex *out_mid_l, *out_mid_r;
fftw_plan p_mid_l, p_mid_r;
double *in_treble_r, *in_treble_l;
fftw_complex *out_treble_l, *out_treble_r;
fftw_plan p_treble_l, p_treble_r;
@ -374,6 +371,63 @@ as of 0.4.0 all options are specified in config file, see in '/home/username/.co
audio.mid_index = 0;
audio.treble_index = 0;
// BASS
// audio.FFTbassbufferSize = audio.rate / 20; // audio.FFTbassbufferSize;
audio.in_bass_r = fftw_alloc_real(2 * (audio.FFTbassbufferSize / 2 + 1));
audio.in_bass_l = fftw_alloc_real(2 * (audio.FFTbassbufferSize / 2 + 1));
memset(audio.in_bass_r, 0, 2 * (audio.FFTbassbufferSize / 2 + 1) * sizeof(double));
memset(audio.in_bass_l, 0, 2 * (audio.FFTbassbufferSize / 2 + 1) * sizeof(double));
out_bass_l = fftw_alloc_complex(2 * (audio.FFTbassbufferSize / 2 + 1));
out_bass_r = fftw_alloc_complex(2 * (audio.FFTbassbufferSize / 2 + 1));
memset(out_bass_l, 0, 2 * (audio.FFTbassbufferSize / 2 + 1) * sizeof(fftw_complex));
memset(out_bass_r, 0, 2 * (audio.FFTbassbufferSize / 2 + 1) * sizeof(fftw_complex));
p_bass_l = fftw_plan_dft_r2c_1d(audio.FFTbassbufferSize, audio.in_bass_l, out_bass_l,
FFTW_MEASURE);
p_bass_r = fftw_plan_dft_r2c_1d(audio.FFTbassbufferSize, audio.in_bass_r, out_bass_r,
FFTW_MEASURE);
// MID
// audio.FFTmidbufferSize = audio.rate / bass_cut_off; // audio.FFTbassbufferSize;
audio.in_mid_r = fftw_alloc_real(2 * (audio.FFTmidbufferSize / 2 + 1));
audio.in_mid_l = fftw_alloc_real(2 * (audio.FFTmidbufferSize / 2 + 1));
memset(audio.in_mid_r, 0, 2 * (audio.FFTmidbufferSize / 2 + 1) * sizeof(double));
memset(audio.in_mid_l, 0, 2 * (audio.FFTmidbufferSize / 2 + 1) * sizeof(double));
out_mid_l = fftw_alloc_complex(2 * (audio.FFTmidbufferSize / 2 + 1));
out_mid_r = fftw_alloc_complex(2 * (audio.FFTmidbufferSize / 2 + 1));
memset(out_mid_l, 0, 2 * (audio.FFTmidbufferSize / 2 + 1) * sizeof(fftw_complex));
memset(out_mid_r, 0, 2 * (audio.FFTmidbufferSize / 2 + 1) * sizeof(fftw_complex));
p_mid_l =
fftw_plan_dft_r2c_1d(audio.FFTmidbufferSize, audio.in_mid_l, out_mid_l, FFTW_MEASURE);
p_mid_r =
fftw_plan_dft_r2c_1d(audio.FFTmidbufferSize, audio.in_mid_r, out_mid_r, FFTW_MEASURE);
// TRIEBLE
// audio.FFTtreblebufferSize = audio.rate / treble_cut_off; // audio.FFTbassbufferSize;
audio.in_treble_r = fftw_alloc_real(2 * (audio.FFTtreblebufferSize / 2 + 1));
audio.in_treble_l = fftw_alloc_real(2 * (audio.FFTtreblebufferSize / 2 + 1));
memset(audio.in_treble_r, 0, 2 * (audio.FFTtreblebufferSize / 2 + 1) * sizeof(double));
memset(audio.in_treble_l, 0, 2 * (audio.FFTtreblebufferSize / 2 + 1) * sizeof(double));
out_treble_l = fftw_alloc_complex(2 * (audio.FFTtreblebufferSize / 2 + 1));
out_treble_r = fftw_alloc_complex(2 * (audio.FFTtreblebufferSize / 2 + 1));
memset(out_treble_l, 0, 2 * (audio.FFTtreblebufferSize / 2 + 1) * sizeof(fftw_complex));
memset(out_treble_r, 0, 2 * (audio.FFTtreblebufferSize / 2 + 1) * sizeof(fftw_complex));
p_treble_l = fftw_plan_dft_r2c_1d(audio.FFTtreblebufferSize, audio.in_treble_l,
out_treble_l, FFTW_MEASURE);
p_treble_r = fftw_plan_dft_r2c_1d(audio.FFTtreblebufferSize, audio.in_treble_r,
out_treble_r, FFTW_MEASURE);
debug("got buffer size: %d, %d, %d", audio.FFTbassbufferSize, audio.FFTmidbufferSize,
audio.FFTtreblebufferSize);
reset_output_buffers(&audio);
debug("starting audio thread\n");
switch (p.im) {
#ifdef ALSA
@ -458,59 +512,6 @@ as of 0.4.0 all options are specified in config file, see in '/home/username/.co
exit(EXIT_FAILURE);
}
// BASS
// audio.FFTbassbufferSize = audio.rate / 20; // audio.FFTbassbufferSize;
in_bass_r = fftw_alloc_real(2 * (audio.FFTbassbufferSize / 2 + 1));
in_bass_l = fftw_alloc_real(2 * (audio.FFTbassbufferSize / 2 + 1));
memset(in_bass_r, 0, 2 * (audio.FFTbassbufferSize / 2 + 1) * sizeof(double));
memset(in_bass_l, 0, 2 * (audio.FFTbassbufferSize / 2 + 1) * sizeof(double));
out_bass_l = fftw_alloc_complex(2 * (audio.FFTbassbufferSize / 2 + 1));
out_bass_r = fftw_alloc_complex(2 * (audio.FFTbassbufferSize / 2 + 1));
memset(out_bass_l, 0, 2 * (audio.FFTbassbufferSize / 2 + 1) * sizeof(fftw_complex));
memset(out_bass_r, 0, 2 * (audio.FFTbassbufferSize / 2 + 1) * sizeof(fftw_complex));
p_bass_l =
fftw_plan_dft_r2c_1d(audio.FFTbassbufferSize, in_bass_l, out_bass_l, FFTW_MEASURE);
p_bass_r =
fftw_plan_dft_r2c_1d(audio.FFTbassbufferSize, in_bass_r, out_bass_r, FFTW_MEASURE);
// MID
// audio.FFTmidbufferSize = audio.rate / bass_cut_off; // audio.FFTbassbufferSize;
in_mid_r = fftw_alloc_real(2 * (audio.FFTmidbufferSize / 2 + 1));
in_mid_l = fftw_alloc_real(2 * (audio.FFTmidbufferSize / 2 + 1));
memset(in_mid_r, 0, 2 * (audio.FFTmidbufferSize / 2 + 1) * sizeof(double));
memset(in_mid_l, 0, 2 * (audio.FFTmidbufferSize / 2 + 1) * sizeof(double));
out_mid_l = fftw_alloc_complex(2 * (audio.FFTmidbufferSize / 2 + 1));
out_mid_r = fftw_alloc_complex(2 * (audio.FFTmidbufferSize / 2 + 1));
memset(out_mid_l, 0, 2 * (audio.FFTmidbufferSize / 2 + 1) * sizeof(fftw_complex));
memset(out_mid_r, 0, 2 * (audio.FFTmidbufferSize / 2 + 1) * sizeof(fftw_complex));
p_mid_l = fftw_plan_dft_r2c_1d(audio.FFTmidbufferSize, in_mid_l, out_mid_l, FFTW_MEASURE);
p_mid_r = fftw_plan_dft_r2c_1d(audio.FFTmidbufferSize, in_mid_r, out_mid_r, FFTW_MEASURE);
// TRIEBLE
// audio.FFTtreblebufferSize = audio.rate / treble_cut_off; // audio.FFTbassbufferSize;
in_treble_r = fftw_alloc_real(2 * (audio.FFTtreblebufferSize / 2 + 1));
in_treble_l = fftw_alloc_real(2 * (audio.FFTtreblebufferSize / 2 + 1));
memset(in_treble_r, 0, 2 * (audio.FFTtreblebufferSize / 2 + 1) * sizeof(double));
memset(in_treble_l, 0, 2 * (audio.FFTtreblebufferSize / 2 + 1) * sizeof(double));
out_treble_l = fftw_alloc_complex(2 * (audio.FFTtreblebufferSize / 2 + 1));
out_treble_r = fftw_alloc_complex(2 * (audio.FFTtreblebufferSize / 2 + 1));
memset(out_treble_l, 0, 2 * (audio.FFTtreblebufferSize / 2 + 1) * sizeof(fftw_complex));
memset(out_treble_r, 0, 2 * (audio.FFTtreblebufferSize / 2 + 1) * sizeof(fftw_complex));
p_treble_l = fftw_plan_dft_r2c_1d(audio.FFTtreblebufferSize, in_treble_l, out_treble_l,
FFTW_MEASURE);
p_treble_r = fftw_plan_dft_r2c_1d(audio.FFTtreblebufferSize, in_treble_r, out_treble_r,
FFTW_MEASURE);
debug("got buffer size: %d, %d, %d", audio.FFTbassbufferSize, audio.FFTmidbufferSize,
audio.FFTtreblebufferSize);
bool reloadConf = false;
while (!reloadConf) { // jumbing back to this loop means that you resized the screen
@ -794,39 +795,30 @@ as of 0.4.0 all options are specified in config file, see in '/home/username/.co
silence = true;
for (i = 0; i < (2 * (audio.FFTbassbufferSize / 2 + 1)); i++) {
if (i < audio.FFTbassbufferSize) {
in_bass_l[i] = audio.audio_out_bass_l[i];
if (p.stereo)
in_bass_r[i] = audio.audio_out_bass_r[i];
if (in_bass_l[i] || in_bass_r[i])
if (audio.in_bass_l[i] || audio.in_bass_r[i])
silence = false;
} else {
in_bass_l[i] = 0;
audio.in_bass_l[i] = 0;
if (p.stereo)
in_bass_r[i] = 0;
audio.in_bass_r[i] = 0;
}
}
for (i = 0; i < (2 * (audio.FFTmidbufferSize / 2 + 1)); i++) {
if (i < audio.FFTmidbufferSize) {
in_mid_l[i] = audio.audio_out_mid_l[i];
if (p.stereo)
in_mid_r[i] = audio.audio_out_mid_r[i];
} else {
in_mid_l[i] = 0;
audio.in_mid_l[i] = 0;
if (p.stereo)
in_mid_r[i] = 0;
audio.in_mid_r[i] = 0;
}
}
for (i = 0; i < (2 * (audio.FFTtreblebufferSize / 2 + 1)); i++) {
if (i < audio.FFTtreblebufferSize) {
in_treble_l[i] = audio.audio_out_treble_l[i];
if (p.stereo)
in_treble_r[i] = audio.audio_out_treble_r[i];
} else {
in_treble_l[i] = 0;
audio.in_treble_l[i] = 0;
if (p.stereo)
in_treble_r[i] = 0;
audio.in_treble_r[i] = 0;
}
}
if (silence)
@ -1023,22 +1015,22 @@ as of 0.4.0 all options are specified in config file, see in '/home/username/.co
if (sourceIsAuto)
free(audio.source);
fftw_free(in_bass_r);
fftw_free(in_bass_l);
fftw_free(audio.in_bass_r);
fftw_free(audio.in_bass_l);
fftw_free(out_bass_r);
fftw_free(out_bass_l);
fftw_destroy_plan(p_bass_l);
fftw_destroy_plan(p_bass_r);
fftw_free(in_mid_r);
fftw_free(in_mid_l);
fftw_free(audio.in_mid_r);
fftw_free(audio.in_mid_l);
fftw_free(out_mid_r);
fftw_free(out_mid_l);
fftw_destroy_plan(p_mid_l);
fftw_destroy_plan(p_mid_r);
fftw_free(in_treble_r);
fftw_free(in_treble_l);
fftw_free(audio.in_treble_r);
fftw_free(audio.in_treble_l);
fftw_free(out_treble_r);
fftw_free(out_treble_l);
fftw_destroy_plan(p_treble_l);

@ -3,12 +3,12 @@
#include <string.h>
void reset_output_buffers(struct audio_data *data) {
memset(data->audio_out_bass_r, 0, sizeof(int16_t) * data->FFTbassbufferSize);
memset(data->audio_out_bass_l, 0, sizeof(int16_t) * data->FFTbassbufferSize);
memset(data->audio_out_mid_r, 0, sizeof(int16_t) * data->FFTmidbufferSize);
memset(data->audio_out_mid_l, 0, sizeof(int16_t) * data->FFTmidbufferSize);
memset(data->audio_out_treble_r, 0, sizeof(int16_t) * data->FFTtreblebufferSize);
memset(data->audio_out_treble_l, 0, sizeof(int16_t) * data->FFTtreblebufferSize);
memset(data->in_bass_r, 0, sizeof(double) * data->FFTbassbufferSize);
memset(data->in_bass_l, 0, sizeof(double) * data->FFTbassbufferSize);
memset(data->in_mid_r, 0, sizeof(double) * data->FFTmidbufferSize);
memset(data->in_mid_l, 0, sizeof(double) * data->FFTmidbufferSize);
memset(data->in_treble_r, 0, sizeof(double) * data->FFTtreblebufferSize);
memset(data->in_treble_l, 0, sizeof(double) * data->FFTtreblebufferSize);
}
int write_to_fftw_input_buffers(int16_t buf[], int16_t frames, void *data) {
@ -17,27 +17,26 @@ int write_to_fftw_input_buffers(int16_t buf[], int16_t frames, void *data) {
for (uint16_t i = 0; i < frames * 2; i += 2) {
if (audio->channels == 1) {
if (audio->average) {
audio->audio_out_bass_l[audio->bass_index] = (buf[i] + buf[i + 1]) / 2;
audio->in_bass_l[audio->bass_index] = (buf[i] + buf[i + 1]) / 2;
}
if (audio->left) {
audio->audio_out_bass_l[audio->bass_index] = buf[i];
audio->in_bass_l[audio->bass_index] = buf[i];
}
if (audio->right) {
audio->audio_out_bass_l[audio->bass_index] = buf[i + 1];
audio->in_bass_l[audio->bass_index] = buf[i + 1];
}
}
// stereo storing channels in buffer
if (audio->channels == 2) {
audio->audio_out_bass_l[audio->bass_index] = buf[i];
audio->audio_out_bass_r[audio->bass_index] = buf[i + 1];
audio->in_bass_l[audio->bass_index] = buf[i];
audio->in_bass_r[audio->bass_index] = buf[i + 1];
audio->audio_out_mid_r[audio->mid_index] = audio->audio_out_bass_r[audio->bass_index];
audio->audio_out_treble_r[audio->treble_index] =
audio->audio_out_bass_r[audio->bass_index];
audio->in_mid_r[audio->mid_index] = audio->in_bass_r[audio->bass_index];
audio->in_treble_r[audio->treble_index] = audio->in_bass_r[audio->bass_index];
}
audio->audio_out_mid_l[audio->mid_index] = audio->audio_out_bass_l[audio->bass_index];
audio->audio_out_treble_l[audio->treble_index] = audio->audio_out_bass_l[audio->bass_index];
audio->in_mid_l[audio->mid_index] = audio->in_bass_l[audio->bass_index];
audio->in_treble_l[audio->treble_index] = audio->in_bass_l[audio->bass_index];
audio->bass_index++;
audio->mid_index++;

@ -18,12 +18,9 @@ struct audio_data {
int bass_index;
int mid_index;
int treble_index;
int16_t audio_out_bass_r[65536];
int16_t audio_out_bass_l[65536];
int16_t audio_out_mid_r[65536];
int16_t audio_out_mid_l[65536];
int16_t audio_out_treble_r[65536];
int16_t audio_out_treble_l[65536];
double *in_bass_r, *in_bass_l;
double *in_mid_r, *in_mid_l;
double *in_treble_r, *in_treble_l;
int format;
unsigned int rate;
char *source; // alsa device, fifo path or pulse source

Loading…
Cancel
Save