Merge pull request #318 from quantum5/multi-obj

Compile Cava as multiple object files
master
karl 6 years ago committed by GitHub
commit cf7eff3310
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 23
      Makefile.am
  2. 53
      cava.c
  3. 42
      config.c
  4. 26
      config.h
  5. 11
      configure.ac
  6. 6
      input/alsa.c
  7. 2
      input/alsa.h
  8. 43
      input/common.c
  9. 29
      input/common.h
  10. 73
      input/fifo.c
  11. 4
      input/fifo.h
  12. 5
      input/portaudio.c
  13. 2
      input/portaudio.h
  14. 5
      input/pulse.c
  15. 2
      input/pulse.h
  16. 6
      input/shmem.c
  17. 5
      input/shmem.h
  18. 2
      input/sndio.c
  19. 5
      input/sndio.h
  20. 3
      output/raw.c
  21. 2
      output/terminal_bcircle.c
  22. 1
      output/terminal_bcircle.h
  23. 5
      output/terminal_ncurses.c
  24. 3
      output/terminal_noncurses.c
  25. 8
      util.h

@ -9,12 +9,33 @@ ACLOCAL_AMFLAGS = -I m4
M_CPPFLAGS = -DSYSTEM_LIBINIPARSER=@SYSTEM_LIBINIPARSER@ M_CPPFLAGS = -DSYSTEM_LIBINIPARSER=@SYSTEM_LIBINIPARSER@
bin_PROGRAMS = cava bin_PROGRAMS = cava
cava_SOURCES = cava.c cava_SOURCES = cava.c config.c input/common.c input/fifo.c \
output/terminal_noncurses.c output/raw.c
cava_LDFLAGS = -L/usr/local/lib -Wl,-rpath /usr/local/lib cava_LDFLAGS = -L/usr/local/lib -Wl,-rpath /usr/local/lib
cava_CPPFLAGS = -DPACKAGE=\"$(PACKAGE)\" -DVERSION=\"$(VERSION)\" \ cava_CPPFLAGS = -DPACKAGE=\"$(PACKAGE)\" -DVERSION=\"$(VERSION)\" \
-D_POSIX_SOURCE -D _POSIX_C_SOURCE=200809L -D_POSIX_SOURCE -D _POSIX_C_SOURCE=200809L
cava_CFLAGS = -std=c99 -Wall -Wextra -Wno-unused-result -Wno-maybe-uninitialized cava_CFLAGS = -std=c99 -Wall -Wextra -Wno-unused-result -Wno-maybe-uninitialized
if ALSA
cava_SOURCES += input/alsa.c
endif
if PORTAUDIO
cava_SOURCES += input/portaudio.c
endif
if PULSE
cava_SOURCES += input/pulse.c
endif
if SNDIO
cava_SOURCES += input/sndio.c
endif
if NCURSES
cava_SOURCES += output/terminal_bcircle.c output/terminal_ncurses.c
endif
cava_font_dir = @FONT_DIR@ cava_font_dir = @FONT_DIR@
cava_font__DATA = cava.psf cava_font__DATA = cava.psf

@ -12,76 +12,43 @@
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <termios.h> #include <termios.h>
#include <fftw3.h>
#include <sys/ioctl.h>
#define max(a, b) \
({ \
__typeof__(a) _a = (a); \
__typeof__(b) _b = (b); \
_a > _b ? _a : _b; \
})
#include <ctype.h> #include <ctype.h>
#include <dirent.h> #include <dirent.h>
#include <fftw3.h>
#include <getopt.h> #include <getopt.h>
#include <pthread.h> #include <pthread.h>
#include <signal.h> #include <signal.h>
#include <string.h> #include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include "debug.h" #include "debug.h"
#include "util.h"
// We need to make sure that clang-format does not order the .h files before the .c files.
// clang-format off
#ifdef NCURSES #ifdef NCURSES
#include "output/terminal_bcircle.h" #include "output/terminal_bcircle.h"
#include "output/terminal_bcircle.c"
#include "output/terminal_ncurses.h" #include "output/terminal_ncurses.h"
#include "output/terminal_ncurses.c" #include <curses.h>
#endif #endif
#include "output/terminal_noncurses.h"
#include "output/terminal_noncurses.c"
#include "output/raw.h" #include "output/raw.h"
#include "output/raw.c" #include "output/terminal_noncurses.h"
#include "input/fifo.h"
#include "input/fifo.c"
#ifdef ALSA
#include <alsa/asoundlib.h>
#include "input/alsa.h" #include "input/alsa.h"
#include "input/alsa.c" #include "input/common.h"
#endif #include "input/fifo.h"
#ifdef PORTAUDIO
#include "input/portaudio.h" #include "input/portaudio.h"
#include "input/portaudio.c"
#endif
#ifdef PULSE
#include "input/pulse.h" #include "input/pulse.h"
#include "input/pulse.c" #include "input/shmem.h"
#endif #include "input/sndio.h"
#ifdef SNDIO
#include "input/sndio.c"
#endif
#ifdef SHMEM
#include "input/shmem.c"
#endif
#include <iniparser.h>
#include "config.h" #include "config.h"
#include "config.c"
// clang-format on
#ifdef __GNUC__ #ifdef __GNUC__
// curses.h or other sources may already define // curses.h or other sources may already define

@ -1,27 +1,16 @@
#define MAX_ERROR_LEN 1024 #include "config.h"
#include <ctype.h>
#include <iniparser.h>
#include <math.h>
#include <stdarg.h>
#include <stdbool.h>
#include <sys/stat.h>
double smoothDef[5] = {1, 1, 1, 1, 1}; double smoothDef[5] = {1, 1, 1, 1, 1};
char *inputMethod, *outputMethod, *channels; char *inputMethod, *outputMethod, *channels;
struct config_params {
char *color, *bcolor, *raw_target, *audio_source,
/**gradient_color_1, *gradient_color_2,*/ **gradient_colors, *data_format, *mono_option;
char bar_delim, frame_delim;
double monstercat, integral, gravity, ignore, sens;
unsigned int lowcf, highcf;
double *smooth;
int smcount, customEQ, im, om, col, bgcol, autobars, stereo, is_bin, ascii_range, bit_format,
gradient, gradient_count, fixedbars, framerate, bw, bs, autosens, overshoot, waves,
FFTbufferSize, fifoSample;
};
struct error_s {
char message[MAX_ERROR_LEN];
int length;
};
void write_errorf(void *err, const char *fmt, ...) { void write_errorf(void *err, const char *fmt, ...) {
struct error_s *error = (struct error_s *)err; struct error_s *error = (struct error_s *)err;
va_list args; va_list args;
@ -138,11 +127,7 @@ bool validate_colors(void *params, void *err) {
return true; return true;
} }
bool validate_config(char supportedInput[255], void *params, void *err) { bool validate_config(char supportedInput[255], struct config_params *p, struct error_s *error) {
struct config_params *p = (struct config_params *)params;
struct error_s *error = (struct error_s *)err;
// validate: input method // validate: input method
p->im = 0; p->im = 0;
if (strcmp(inputMethod, "alsa") == 0) { if (strcmp(inputMethod, "alsa") == 0) {
@ -385,11 +370,8 @@ bool load_colors(struct config_params *p, dictionary *ini, void *err) {
return true; return true;
} }
bool load_config(char configPath[255], char supportedInput[255], void *params, bool colorsOnly, bool load_config(char configPath[255], char supportedInput[255], struct config_params *p,
void *err) { bool colorsOnly, struct error_s *error) {
struct config_params *p = (struct config_params *)params;
struct error_s *error = (struct error_s *)err;
FILE *fp; FILE *fp;
// config: creating path to default config file // config: creating path to default config file
@ -565,7 +547,7 @@ bool load_config(char configPath[255], char supportedInput[255], void *params, b
} }
#endif #endif
bool result = validate_config(supportedInput, params, error); bool result = validate_config(supportedInput, p, error);
iniparser_freedict(ini); iniparser_freedict(ini);
return result; return result;
} }

@ -1,6 +1,26 @@
#include <stdarg.h> #pragma once
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h> #include <stdio.h>
bool load_config(char configPath[255], char supportedInput[255], void *p, bool colorsOnly, #define MAX_ERROR_LEN 1024
void *error);
struct config_params {
char *color, *bcolor, *raw_target, *audio_source,
/**gradient_color_1, *gradient_color_2,*/ **gradient_colors, *data_format, *mono_option;
char bar_delim, frame_delim;
double monstercat, integral, gravity, ignore, sens;
unsigned int lowcf, highcf;
double *smooth;
int smcount, customEQ, im, om, col, bgcol, autobars, stereo, is_bin, ascii_range, bit_format,
gradient, gradient_count, fixedbars, framerate, bw, bs, autosens, overshoot, waves,
FFTbufferSize, fifoSample;
};
struct error_s {
char message[MAX_ERROR_LEN];
int length;
};
bool load_config(char configPath[255], char supportedInput[255], struct config_params *p,
bool colorsOnly, struct error_s *error);

@ -65,6 +65,8 @@ AC_CHECK_LIB(asound, snd_pcm_open, have_alsa=yes, have_alsa=no)
AC_MSG_NOTICE([WARNING: No alsa dev files found building without alsa support]) AC_MSG_NOTICE([WARNING: No alsa dev files found building without alsa support])
fi fi
AM_CONDITIONAL([ALSA], [test x$have_alsa = xyes])
dnl ###################### dnl ######################
dnl checking for pulse dev dnl checking for pulse dev
@ -79,6 +81,8 @@ AC_CHECK_LIB(pulse-simple, pa_simple_new, have_pulse=yes, have_pulse=no)
AC_MSG_NOTICE([WARNING: No pusleaudio dev files found building without pulseaudio support]) AC_MSG_NOTICE([WARNING: No pusleaudio dev files found building without pulseaudio support])
fi fi
AM_CONDITIONAL([PULSE], [test x$have_pulse = xyes])
dnl ###################### dnl ######################
dnl checking for portaudio dev dnl checking for portaudio dev
dnl ###################### dnl ######################
@ -92,6 +96,8 @@ AC_CHECK_LIB(portaudio, Pa_Initialize, have_portaudio=yes, have_portaudio=no)
AC_MSG_NOTICE([WARNING: No portaudio dev files found building without portaudio support]) AC_MSG_NOTICE([WARNING: No portaudio dev files found building without portaudio support])
fi fi
AM_CONDITIONAL([PORTAUDIO], [test x$have_portaudio = xyes])
dnl ###################### dnl ######################
dnl checking for sndio dev dnl checking for sndio dev
dnl ###################### dnl ######################
@ -105,6 +111,8 @@ AC_CHECK_LIB(sndio, sio_open, have_sndio=yes, have_sndio=no)
AC_MSG_NOTICE([WARNING: No sndio dev files found building without sndio support]) AC_MSG_NOTICE([WARNING: No sndio dev files found building without sndio support])
fi fi
AM_CONDITIONAL([SNDIO], [test x$have_sndio = xyes])
dnl ###################### dnl ######################
dnl checking for math lib dnl checking for math lib
dnl ###################### dnl ######################
@ -151,8 +159,10 @@ AC_CHECK_LIB($curses_lib, initscr,
LIBS="$LIBS `$CURSES_CONFIG --libs`" LIBS="$LIBS `$CURSES_CONFIG --libs`"
fi fi
AC_CHECK_HEADERS([curses.h], , AC_MSG_ERROR([missing curses.h header])) AC_CHECK_HEADERS([curses.h], , AC_MSG_ERROR([missing curses.h header]))
AM_CONDITIONAL([NCURSES], [true])
, ,
AC_MSG_NOTICE([WARNING: building without ncursesw support ncursesw is recomended!]) AC_MSG_NOTICE([WARNING: building without ncursesw support ncursesw is recomended!])
AM_CONDITIONAL([NCURSES], [false])
) )
@ -199,6 +209,7 @@ AS_IF([test "x$enable_shmem" = "xyes"], [
CPPFLAGS="$CPPFLAGS -DSHMEM" CPPFLAGS="$CPPFLAGS -DSHMEM"
LIBS="$LIBS -lrt" LIBS="$LIBS -lrt"
]) ])
AM_CONDITIONAL([SHMEM], [test "x$enable_shmem" = xyes])

@ -1,4 +1,10 @@
// input: ALSA // input: ALSA
#include "input/alsa.h"
#include "debug.h"
#include "input/common.h"
#include <alsa/asoundlib.h>
#include <math.h>
// assuming stereo // assuming stereo
#define CHANNELS_COUNT 2 #define CHANNELS_COUNT 2

@ -1,3 +1,5 @@
// header file for alsa, part of cava. // header file for alsa, part of cava.
#pragma once
void *input_alsa(void *data); void *input_alsa(void *data);

@ -0,0 +1,43 @@
#include "input/common.h"
int write_to_fftw_input_buffers(int16_t buf[], int16_t frames, void *data) {
struct audio_data *audio = (struct audio_data *)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;
}
if (audio->left) {
audio->audio_out_bass_l[audio->bass_index] = buf[i];
}
if (audio->right) {
audio->audio_out_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->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->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->bass_index++;
audio->mid_index++;
audio->treble_index++;
if (audio->bass_index == audio->FFTbassbufferSize - 1)
audio->bass_index = 0;
if (audio->mid_index == audio->FFTmidbufferSize - 1)
audio->mid_index = 0;
if (audio->treble_index == audio->FFTtreblebufferSize - 1)
audio->treble_index = 0;
}
return 0;
}

@ -0,0 +1,29 @@
#pragma once
#include <inttypes.h>
#include <stdbool.h>
struct audio_data {
int FFTbassbufferSize;
int FFTmidbufferSize;
int FFTtreblebufferSize;
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];
int format;
unsigned int rate;
char *source; // alsa device, fifo path or pulse source
int im; // input mode alsa, fifo or pulse
int channels;
bool left, right, average;
int terminate; // shared variable used to terminate audio thread
char error_message[1024];
};
int write_to_fftw_input_buffers(int16_t buf[], int16_t frames, void *data);

@ -1,75 +1,14 @@
#include "input/fifo.h"
#include "input/common.h"
#include <fcntl.h>
#include <time.h>
#include <unistd.h> #include <unistd.h>
#define BUFSIZE 1024 #define BUFSIZE 1024
#define MAX_FFTBUFERSIZE #define MAX_FFTBUFERSIZE
int rc; int rc;
struct audio_data {
int FFTbassbufferSize;
int FFTmidbufferSize;
int FFTtreblebufferSize;
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];
int format;
unsigned int rate;
char *source; // alsa device, fifo path or pulse source
int im; // input mode alsa, fifo or pulse
int channels;
bool left, right, average;
int terminate; // shared variable used to terminate audio thread
char error_message[1024];
};
int write_to_fftw_input_buffers(int16_t buf[], int16_t frames, void *data) {
struct audio_data *audio = (struct audio_data *)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;
}
if (audio->left) {
audio->audio_out_bass_l[audio->bass_index] = buf[i];
}
if (audio->right) {
audio->audio_out_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->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->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->bass_index++;
audio->mid_index++;
audio->treble_index++;
if (audio->bass_index == audio->FFTbassbufferSize - 1)
audio->bass_index = 0;
if (audio->mid_index == audio->FFTmidbufferSize - 1)
audio->mid_index = 0;
if (audio->treble_index == audio->FFTtreblebufferSize - 1)
audio->treble_index = 0;
}
return 0;
}
int open_fifo(const char *path) { int open_fifo(const char *path) {
int fd = open(path, O_RDONLY); int fd = open(path, O_RDONLY);
int flags = fcntl(fd, F_GETFL, 0); int flags = fcntl(fd, F_GETFL, 0);

@ -1,3 +1,5 @@
// header files for fifo, part of cava // header files for fifo, part of cava
#pragma once
void *input_fifo(void *data); void *input_fifo(void *data);
int write_to_fftw_input_buffers(int16_t buf[], int16_t frames, void *data);

@ -1,5 +1,6 @@
#include "portaudio.h" #include "input/portaudio.h"
#include "fifo.h" #include "input/common.h"
#include <portaudio.h> #include <portaudio.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>

@ -1 +1,3 @@
#pragma once
void *input_portaudio(void *audiodata); void *input_portaudio(void *audiodata);

@ -1,10 +1,15 @@
#include "input/pulse.h"
#include "input/common.h"
#include <errno.h> #include <errno.h>
#include <pthread.h>
#include <pulse/error.h> #include <pulse/error.h>
#include <pulse/pulseaudio.h> #include <pulse/pulseaudio.h>
#include <pulse/simple.h> #include <pulse/simple.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#define BUFFERSIZE 4096 #define BUFFERSIZE 4096
pa_mainloop *m_pulseaudio_mainloop; pa_mainloop *m_pulseaudio_mainloop;

@ -1,4 +1,6 @@
// header file for pulse, part of cava. // header file for pulse, part of cava.
#pragma once
void *input_pulse(void *data); void *input_pulse(void *data);
void getPulseDefaultSink(); void getPulseDefaultSink();

@ -1,6 +1,10 @@
#include "input/shmem.h"
#include "input/common.h"
#include <fcntl.h> #include <fcntl.h>
#include <pthread.h> #include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
@ -36,8 +40,6 @@ void *input_shmem(void *data) {
vis_t *mmap_area; vis_t *mmap_area;
int fd; /* file descriptor to mmaped area */ int fd; /* file descriptor to mmaped area */
int mmap_count = sizeof(vis_t); int mmap_count = sizeof(vis_t);
int n = 0;
int i;
printf("input_shmem: source: %s", audio->source); printf("input_shmem: source: %s", audio->source);

@ -0,0 +1,5 @@
// header file for shmem, part of cava.
#pragma once
void *input_shmem(void *data);

@ -1,3 +1,5 @@
#include "input/sndio.h"
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
#include <sndio.h> #include <sndio.h>

@ -0,0 +1,5 @@
// header file for sndio, part of cava.
#pragma once
void *input_sndio(void *data);

@ -1,5 +1,8 @@
#include <math.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
int16_t buf_16; int16_t buf_16;
int8_t buf_8; int8_t buf_8;

@ -1,3 +1,5 @@
#include "output/terminal_bcircle.h"
#include <curses.h> #include <curses.h>
#include <locale.h> #include <locale.h>
#include <math.h> #include <math.h>

@ -1,3 +1,4 @@
#pragma once
int init_terminal_bcircle(int col, int bgcol); int init_terminal_bcircle(int col, int bgcol);
void get_terminal_dim_bcircle(int *w, int *h); void get_terminal_dim_bcircle(int *w, int *h);

@ -1,7 +1,12 @@
#include "output/terminal_ncurses.h"
#include <curses.h> #include <curses.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <wchar.h> #include <wchar.h>
#include "util.h"
int gradient_size = 64; int gradient_size = 64;
struct colors { struct colors {

@ -1,6 +1,9 @@
#include <locale.h> #include <locale.h>
#include <math.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <termios.h> #include <termios.h>
#include <unistd.h> #include <unistd.h>
#include <wchar.h> #include <wchar.h>

@ -0,0 +1,8 @@
#pragma once
#define max(a, b) \
({ \
__typeof__(a) _a = (a); \
__typeof__(b) _b = (b); \
_a > _b ? _a : _b; \
})
Loading…
Cancel
Save