diff options
-rw-r--r-- | common/fmplayer_drumrom_unix.c | 2 | ||||
-rw-r--r-- | gtk/Makefile.am | 17 | ||||
-rw-r--r-- | gtk/configure.ac | 23 | ||||
-rw-r--r-- | soundout/alsaout.c (renamed from gtk/soundout/alsaout.c) | 21 | ||||
-rw-r--r-- | soundout/alsaout.h (renamed from gtk/soundout/alsaout.h) | 0 | ||||
-rw-r--r-- | soundout/jackout.c (renamed from gtk/soundout/jackout.c) | 0 | ||||
-rw-r--r-- | soundout/jackout.h (renamed from gtk/soundout/jackout.h) | 0 | ||||
-rw-r--r-- | soundout/ossout.c (renamed from gtk/soundout/ossout.c) | 0 | ||||
-rw-r--r-- | soundout/pulseout.c (renamed from gtk/soundout/pulseout.c) | 35 | ||||
-rw-r--r-- | soundout/pulseout.h (renamed from gtk/soundout/pulseout.h) | 0 | ||||
-rw-r--r-- | soundout/soundout.c (renamed from gtk/soundout/soundout.c) | 10 | ||||
-rw-r--r-- | soundout/soundout.h (renamed from gtk/soundout/soundout.h) | 0 |
12 files changed, 89 insertions, 19 deletions
diff --git a/common/fmplayer_drumrom_unix.c b/common/fmplayer_drumrom_unix.c index 791b264..9111616 100644 --- a/common/fmplayer_drumrom_unix.c +++ b/common/fmplayer_drumrom_unix.c @@ -11,7 +11,7 @@ static struct { #define DATADIR "/.local/share/fmplayer/" -void loadfile(void) { +static void loadfile(void) { const char *path = "ym2608_adpcm_rom.bin"; const char *home = getenv("HOME"); char *dpath = 0; diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 43a767d..2375b28 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -19,15 +19,22 @@ FMDSP_SRC=../fmdsp/fmdsp.c \ ../fmdsp/font_fmdsp_small.c \ ../fmdsp/fmdsp_platform_unix.c -SOUNDOUT_SRC=soundout/soundout.c \ - soundout/pulseout.c \ - soundout/jackout.c \ - soundout/alsaout.c +SOUNDOUT_SRC=../soundout/soundout.c + +if ENABLE_JACK +SOUNDOUT_SRC+=../soundout/jackout.c +endif +if ENABLE_PULSE +SOUNDOUT_SRC+=../soundout/pulseout.c +endif +if ENABLE_ALSA +SOUNDOUT_SRC+=../soundout/alsaout.c +endif #fmplayer_CFLAGS=$(CFLAGS) #CFLAGS= fmplayer_CPPFLAGS=-Wall -Wextra -pedantic \ - -I.. -Isoundout \ + -I.. -I../soundout \ $(GTK3_CFLAGS) $(JACK_CFLAGS) $(PULSE_CFLAGS) $(ALSA_CFLAGS) $(SNDFILE_CFLAGS) fmplayer_LDADD=$(GTK3_LIBS) $(JACK_LIBS) $(PULSE_LIBS) $(ALSA_LIBS) $(SNDFILE_LIBS) -lm -lpthread diff --git a/gtk/configure.ac b/gtk/configure.ac index 8a61ac1..fc79c8c 100644 --- a/gtk/configure.ac +++ b/gtk/configure.ac @@ -6,12 +6,29 @@ AC_PROG_RANLIB AM_PROG_AR AM_PROG_AS -PKG_CHECK_MODULES([JACK], [jack soxr]) -PKG_CHECK_MODULES([PULSE], [libpulse]) -PKG_CHECK_MODULES([ALSA], [alsa]) +PKG_CHECK_MODULES([JACK], [jack soxr], [jack_found=yes], [jack_found=no]) +PKG_CHECK_MODULES([PULSE], [libpulse], [pulse_found=yes], [pulse_found=no]) +PKG_CHECK_MODULES([ALSA], [alsa], [alsa_found=yes], [alsa_found=no]) PKG_CHECK_MODULES([GTK3], [gtk+-3.0 cairo]) PKG_CHECK_MODULES([SNDFILE], [sndfile]) +AS_IF([test "x$jack_found" = "xno" -a "x$pulse_found" = "xno" -a "x$alsa_found" = "xno"], [ + AC_MSG_ERROR([No audio output backend found]) +]) + +AM_CONDITIONAL([ENABLE_JACK], [test "x$jack_found" = "xyes"]) +AS_IF([test "x$jack_found" = "xyes"], [ + AC_DEFINE([ENABLE_JACK]) +]) +AM_CONDITIONAL([ENABLE_PULSE], [test "x$pulse_found" = "xyes"]) +AS_IF([test "x$pulse_found" = "xyes"], [ + AC_DEFINE([ENABLE_PULSE]) +]) +AM_CONDITIONAL([ENABLE_ALSA], [test "x$alsa_found" = "xyes"]) +AS_IF([test "x$alsa_found" = "xyes"], [ + AC_DEFINE([ENABLE_ALSA]) +]) + AC_ARG_ENABLE([neon], AS_HELP_STRING([--enable-neon], [Enable NEON optimized functions for SSG sinc filtering and fmdsp palette lookup. Tested on Cortex-A53 (Raspberry PI 3)])) AM_CONDITIONAL([ENABLE_NEON], [test "x$enable_neon" = "xyes"]) AS_IF([test "x$enable_neon" = "xyes"], [ diff --git a/gtk/soundout/alsaout.c b/soundout/alsaout.c index 5c5e667..0658206 100644 --- a/gtk/soundout/alsaout.c +++ b/soundout/alsaout.c @@ -46,7 +46,8 @@ static void *alsaout_thread(void *ptr) { if (as->terminate) return 0; if (as->fds[0].revents) { uint64_t eventdata; - read(as->fd_event, &eventdata, sizeof(eventdata)); + ssize_t t = read(as->fd_event, &eventdata, sizeof(eventdata)); + (void)t; } unsigned short event; if (snd_pcm_poll_descriptors_revents( @@ -80,13 +81,20 @@ static void *alsaout_thread(void *ptr) { static void alsaout_pause(struct sound_state *ss, int pause, int flush) { struct alsaout_state *as = (struct alsaout_state *)ss; + as->paused = pause; + if (!pause && flush) { + snd_pcm_drop(as->apcm); + snd_pcm_prepare(as->apcm); + snd_pcm_start(as->apcm); + } else { + snd_pcm_pause(as->apcm, pause); + } while (atomic_flag_test_and_set_explicit( &as->cb_flag, memory_order_acquire)); - as->paused = pause; - snd_pcm_pause(as->apcm, pause); atomic_flag_clear_explicit(&as->cb_flag, memory_order_release); uint64_t event = 1; - write(as->fd_event, &event, sizeof(event)); + ssize_t t = write(as->fd_event, &event, sizeof(event)); + (void)t; } static void alsaout_free(struct sound_state *ss) { @@ -95,7 +103,8 @@ static void alsaout_free(struct sound_state *ss) { if (as->thread_valid) { as->terminate = true; uint64_t event = 1; - write(as->fd_event, &event, sizeof(event)); + ssize_t t = write(as->fd_event, &event, sizeof(event)); + (void)t; pthread_join(as->alsa_thread, 0); } if (as->fd_event != -1) { @@ -144,7 +153,7 @@ struct sound_state *alsaout_init( goto err; } as->thread_valid = true; - return as; + return &as->ss; err: alsaout_free(&as->ss); diff --git a/gtk/soundout/alsaout.h b/soundout/alsaout.h index cd79c27..cd79c27 100644 --- a/gtk/soundout/alsaout.h +++ b/soundout/alsaout.h diff --git a/gtk/soundout/jackout.c b/soundout/jackout.c index 54e7f16..54e7f16 100644 --- a/gtk/soundout/jackout.c +++ b/soundout/jackout.c diff --git a/gtk/soundout/jackout.h b/soundout/jackout.h index 4b72f2e..4b72f2e 100644 --- a/gtk/soundout/jackout.h +++ b/soundout/jackout.h diff --git a/gtk/soundout/ossout.c b/soundout/ossout.c index 1083f20..1083f20 100644 --- a/gtk/soundout/ossout.c +++ b/soundout/ossout.c diff --git a/gtk/soundout/pulseout.c b/soundout/pulseout.c index 9dbcd6c..5734991 100644 --- a/gtk/soundout/pulseout.c +++ b/soundout/pulseout.c @@ -18,16 +18,46 @@ struct pulseout_state { bool pa_status_changed; }; +#include <stdio.h> + +static void pulseout_success_cb(pa_stream *s, int success, void *userdata) { + (void)s; + (void)success; + struct pulseout_state *ps = userdata; + pa_threaded_mainloop_signal(ps->pa_tm, 0); +} + static void pulseout_pause(struct sound_state *ss, int pause, int flush) { - //return; struct pulseout_state *ps = (struct pulseout_state *)ss; if (ps->paused != !!pause) { if (pause) { pa_threaded_mainloop_lock(ps->pa_tm); + pa_operation *op_cork = pa_stream_cork(ps->pa_s, 1, pulseout_success_cb, ps); + while (pa_operation_get_state(op_cork) == PA_OPERATION_RUNNING) + pa_threaded_mainloop_wait(ps->pa_tm); + pa_operation_unref(op_cork); } ps->paused = pause; if (!pause) { - if (flush) ps->flush = true; + //if (flush) ps->flush = true; + if (flush) { + pa_operation *op_flush = pa_stream_flush(ps->pa_s, pulseout_success_cb, ps); + if (op_flush) { + while (pa_operation_get_state(op_flush) == PA_OPERATION_RUNNING) + pa_threaded_mainloop_wait(ps->pa_tm); + pa_operation_unref(op_flush); + } else { + fprintf(stderr, "FLUSH ERR\n"); + } + } + pa_operation *op_cork = pa_stream_cork(ps->pa_s, 0, pulseout_success_cb, ps); + if (op_cork) { + while (pa_operation_get_state(op_cork) == PA_OPERATION_RUNNING) + pa_threaded_mainloop_wait(ps->pa_tm); + pa_operation_unref(op_cork); + } else { + fprintf(stderr, "CORK ERR\n"); + } pa_threaded_mainloop_unlock(ps->pa_tm); } } @@ -70,6 +100,7 @@ static void pulseout_cb(pa_stream *p, size_t bytes, void *userdata) { } static void pa_c_cb(pa_context *pa_c, void *userdata) { + (void)pa_c; struct pulseout_state *ps = userdata; ps->pa_status_changed = true; pa_threaded_mainloop_signal(ps->pa_tm, 0); diff --git a/gtk/soundout/pulseout.h b/soundout/pulseout.h index d9fbb20..d9fbb20 100644 --- a/gtk/soundout/pulseout.h +++ b/soundout/pulseout.h diff --git a/gtk/soundout/soundout.c b/soundout/soundout.c index 56134be..a749fe4 100644 --- a/gtk/soundout/soundout.c +++ b/soundout/soundout.c @@ -5,10 +5,16 @@ struct sound_state *sound_init(const char *clientname, unsigned srate, sound_callback cbfunc, void *userptr) { struct sound_state *ss = 0; - //ss = jackout_init(clientname, srate, cbfunc, userptr); +#ifdef ENABLE_JACK + ss = jackout_init(clientname, srate, cbfunc, userptr); +#endif if (ss) return ss; - //ss = pulseout_init(clientname, srate, cbfunc, userptr); +#ifdef ENABLE_PULSE + ss = pulseout_init(clientname, srate, cbfunc, userptr); +#endif if (ss) return ss; +#ifdef ENABLE_ALSA ss = alsaout_init(clientname, srate, cbfunc, userptr); +#endif return ss; } diff --git a/gtk/soundout/soundout.h b/soundout/soundout.h index aea926f..aea926f 100644 --- a/gtk/soundout/soundout.h +++ b/soundout/soundout.h |