]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 't/resample'
authorAndre Noll <maan@systemlinux.org>
Sun, 16 Dec 2012 23:09:22 +0000 (00:09 +0100)
committerAndre Noll <maan@systemlinux.org>
Sun, 16 Dec 2012 23:09:22 +0000 (00:09 +0100)
Was cooking for quite some time. The merge conflicted slightly,
but this was easy to fix.

However, even with the conflict resolved, the merged tree would not
compile because after the merge para_play depends on libsamplerate,
but this dependency was not encoded in configure.ac.

There was no way to fix this issue in either of the two branches
involved without rewriting history: The recently merged t/afh_receiver
branch (which introduced para_play) had no idea of libsamplerate
while t/resample has no idea of para_play.

This merge commit fixes both issues.

0eb69b resample filter: Implementation.
cad284 resample filter: Infrastructure.
37e0df check_wav: Ask parent nodes before falling back to defaults.
216399 Replace check_wav_task by write_task.
1af65c Move wav detection code to a separate file.
d5dc1c write: Make wav-related config options modular.
c25d04 para_filter: Call proper ->free_config method on shutdown.

Conflicts:
m4/gengetopt/makefile

1  2 
configure.ac
error.h
m4/gengetopt/makefile

diff --combined configure.ac
index 444f9ed112c24a499ff26e0247171a19d69d906f,aacecee823aecc296f7988f5f2d04741b6194b99..f3e8fb070a2aa03254e2147c1c7392c32ad2ae24
@@@ -100,20 -100,16 +100,20 @@@ all_errlist_objs="mp3_afh afh_common ne
        dccp_recv recv_common write_common file_write audiod_command
        client_common recv stdout filter stdin audioc write client
        exec send_common ggo udp_recv color fec fecdec_filter
-       prebuffer_filter bitstream imdct
+       prebuffer_filter bitstream imdct check_wav
        wma_afh wma_common wmadec_filter buffer_tree crypt_common
 -      gui gui_theme sideband"
 +      gui gui_theme sideband afh_recv play"
  
 -executables="recv filter audioc write client afh audiod"
 +executables="recv filter audioc write client afh audiod play"
  
 -recv_cmdline_objs="add_cmdline(recv http_recv dccp_recv udp_recv)"
 +recv_cmdline_objs="add_cmdline(recv http_recv dccp_recv udp_recv afh_recv)"
 +
 +recv_errlist_objs="
 +      http_recv recv_common recv time string net dccp_recv fd
 +      sched stdout ggo udp_recv buffer_tree afh_recv afh_common
 +      wma_afh wma_common mp3_afh
 +"
  
 -recv_errlist_objs="http_recv recv_common recv time string net dccp_recv
 -      fd sched stdout ggo udp_recv buffer_tree"
  recv_ldflags=""
  
  filter_cmdline_objs="add_cmdline(filter compress_filter amp_filter prebuffer_filter)"
@@@ -142,7 -138,7 +142,7 @@@ afh_ldflags="
  
  write_cmdline_objs="add_cmdline(write file_write)"
  write_errlist_objs="write write_common file_write time fd string sched stdin
-       buffer_tree ggo"
+       buffer_tree ggo check_wav"
  write_ldflags=""
  writers=" file"
  default_writer="FILE_WRITE"
@@@ -155,17 -151,6 +155,17 @@@ client_ldflags="
  gui_cmdline_objs="add_cmdline(gui)"
  gui_errlist_objs="exec signal string stat ringbuffer fd gui gui_theme"
  gui_objs="$gui_cmdline_objs $gui_errlist_objs"
 +play_errlist_objs="play fd sched ggo buffer_tree time string net
 +      afh_recv afh_common
 +      wma_afh wma_common mp3_afh
 +      recv_common udp_recv http_recv dccp_recv
 +      filter_common fec bitstream imdct
 +      wav_filter compress_filter amp_filter prebuffer_filter fecdec_filter
 +              wmadec_filter
 +      write_common file_write
 +"
 +play_cmdline_objs="add_cmdline(http_recv dccp_recv udp_recv afh_recv compress_filter amp_filter prebuffer_filter file_write play)"
 +play_ldflags="-lm"
  ########################################################################### snprintf
  # ===========================================================================
  #        http://www.nongnu.org/autoconf-archive/ax_func_snprintf.html
@@@ -480,7 -465,7 +480,7 @@@ if test "$have_curses" = "yes"; the
        extras="$extras gui"
        executables="$executables gui"
  else
 -      AC_MSG_WARN([cannot build para_gui])
 +      AC_MSG_WARN([no curses lib, cannot build para_gui])
  fi
  CPPFLAGS="$OLD_CPPFLAGS"
  LDFLAGS="$OLD_LDFLAGS"
@@@ -526,10 -511,6 +526,10 @@@ if test ${have_core_audio} = yes; the
        audiod_cmdline_objs="$audiod_cmdline_objs osx_write.cmdline"
        audiod_ldflags="$audiod_ldflags $f"
  
 +      play_errlist_objs="$play_errlist_objs osx_write ipc"
 +      play_cmdline_objs="$play_cmdline_objs osx_write.cmdline"
 +      play_ldflags="$play_ldflags $f"
 +
        write_errlist_objs="$write_errlist_objs osx_write ipc"
        write_cmdline_objs="$write_cmdline_objs osx_write.cmdline"
        write_ldflags="$write_ldflags $f"
@@@ -608,14 -589,10 +608,14 @@@ if test "$have_vorbis" = "yes" || test 
        server_ldflags="$server_ldflags $ogg_libs"
        filter_ldflags="$filter_ldflags $ogg_libs"
        audiod_ldflags="$audiod_ldflags $ogg_libs"
 +      play_ldflags="$play_ldflags $ogg_libs"
        afh_ldflags="$afh_ldflags $ogg_libs"
 +      recv_ldflags="$recv_ldflags $ogg_libs"
        all_errlist_objs="$all_errlist_objs ogg_afh_common"
        afh_errlist_objs="$afh_errlist_objs ogg_afh_common"
 +      recv_errlist_objs="$recv_errlist_objs ogg_afh_common"
        server_errlist_objs="$server_errlist_objs ogg_afh_common"
 +      play_errlist_objs="$play_errlist_objs ogg_afh_common"
  fi
  if test "$have_vorbis" = "yes"; then
        all_errlist_objs="$all_errlist_objs oggdec_filter ogg_afh"
        server_ldflags="$server_ldflags $vorbis_libs"
        filter_ldflags="$filter_ldflags $vorbis_libs"
        audiod_ldflags="$audiod_ldflags $vorbis_libs"
 +      play_ldflags="$play_ldflags $vorbis_libs"
        afh_ldflags="$afh_ldflags $vorbis_libs"
 +      recv_ldflags="$recv_ldflags $vorbis_libs"
  
        server_errlist_objs="$server_errlist_objs ogg_afh"
        filter_errlist_objs="$filter_errlist_objs oggdec_filter"
        audiod_errlist_objs="$audiod_errlist_objs oggdec_filter"
 +      play_errlist_objs="$play_errlist_objs oggdec_filter ogg_afh"
        afh_errlist_objs="$afh_errlist_objs ogg_afh"
 +      recv_errlist_objs="$recv_errlist_objs ogg_afh"
  
        audiod_audio_formats="$audiod_audio_formats ogg"
        server_audio_formats="$server_audio_formats ogg"
@@@ -649,16 -622,12 +649,16 @@@ if test "$have_speex" = "yes"; the
        server_ldflags="$server_ldflags $speex_libs"
        filter_ldflags="$filter_ldflags $speex_libs"
        audiod_ldflags="$audiod_ldflags $speex_libs"
 +      play_ldflags="$play_ldflags $speex_libs"
        afh_ldflags="$afh_ldflags $speex_libs"
 +      recv_ldflags="$recv_ldflags $speex_libs"
  
        server_errlist_objs="$server_errlist_objs spx_afh spx_common"
        filter_errlist_objs="$filter_errlist_objs spxdec_filter spx_common"
        audiod_errlist_objs="$audiod_errlist_objs spxdec_filter spx_common"
 +      play_errlist_objs="$play_errlist_objs spxdec_filter spx_afh spx_common"
        afh_errlist_objs="$afh_errlist_objs spx_afh spx_common"
 +      recv_errlist_objs="$recv_errlist_objs spx_afh spx_common"
  
        audiod_audio_formats="$audiod_audio_formats spx"
        server_audio_formats="$server_audio_formats spx"
@@@ -693,17 -662,11 +693,17 @@@ if test "$have_faad" = "yes"; the
        filter_errlist_objs="$filter_errlist_objs aacdec_filter aac_common"
        afh_errlist_objs="$afh_errlist_objs aac_common aac_afh"
        audiod_errlist_objs="$audiod_errlist_objs aacdec_filter aac_common"
 +      play_errlist_objs="$play_errlist_objs aacdec_filter aac_afh aac_common"
        server_errlist_objs="$server_errlist_objs aac_afh aac_common"
 +      recv_errlist_objs="$recv_errlist_objs aac_afh aac_common"
 +
        server_ldflags="$server_ldflags $faad_libs -lfaad"
        filter_ldflags="$filter_ldflags $faad_libs -lfaad"
        audiod_ldflags="$audiod_ldflags $faad_libs -lfaad"
 +      play_ldflags="$play_ldflags $faad_libs -lfaad"
        afh_ldflags="$afh_ldflags $faad_libs -lfaad"
 +      recv_ldflags="$afh_ldflags $faad_libs -lfaad"
 +
        audiod_audio_formats="$audiod_audio_formats aac"
        server_audio_formats="$server_audio_formats aac"
        filters="$filters aacdec"
@@@ -742,14 -705,11 +742,14 @@@ if test "$have_mad" = "yes"; the
        AC_DEFINE(HAVE_MAD, 1, define to 1 if you want to build the mp3dec filter)
        filter_cmdline_objs="$filter_cmdline_objs add_cmdline(mp3dec_filter)"
        audiod_cmdline_objs="$audiod_cmdline_objs add_cmdline(mp3dec_filter)"
 +      play_cmdline_objs="$play_cmdline_objs add_cmdline(mp3dec_filter)"
        all_errlist_objs="$all_errlist_objs mp3dec_filter"
        filter_errlist_objs="$filter_errlist_objs mp3dec_filter"
        audiod_errlist_objs="$audiod_errlist_objs mp3dec_filter"
 +      play_errlist_objs="$play_errlist_objs mp3dec_filter"
        filter_ldflags="$filter_ldflags $mad_libs -lmad"
        audiod_ldflags="$audiod_ldflags $mad_libs -lmad"
 +      play_ldflags="$play_ldflags $mad_libs -lmad"
        audiod_audio_formats="$audiod_audio_formats mp3"
        filters="$filters mp3dec"
        AC_SUBST(mad_cppflags)
@@@ -790,9 -750,6 +790,9 @@@ if test ${have_libid3tag} = yes; the
        AC_DEFINE(HAVE_LIBID3TAG, 1, define to 1 you have libid3tag)
        server_ldflags="$server_ldflags $id3tag_libs -lid3tag -lz"
        afh_ldflags="$afh_ldflags $id3tag_libs -lid3tag -lz"
 +      play_ldflags="$play_ldflags -lz"
 +      recv_ldflags="$recv_ldflags $id3tag_libs -lid3tag"
 +      play_ldflags="$play_ldflags $id3tag_libs -lid3tag"
        AC_SUBST(id3tag_cppflags)
  else
        AC_MSG_WARN([no support for id3v2 tags])
@@@ -825,16 -782,12 +825,16 @@@ if test "$have_flac" = "yes"; the
        all_errlist_objs="$all_errlist_objs flacdec_filter flac_afh"
        filter_errlist_objs="$filter_errlist_objs flacdec_filter"
        audiod_errlist_objs="$audiod_errlist_objs flacdec_filter"
 +      play_errlist_objs="$play_errlist_objs flacdec_filter flac_afh"
        afh_errlist_objs="$afh_errlist_objs flac_afh"
        server_errlist_objs="$server_errlist_objs flac_afh"
 +      recv_errlist_objs="$recv_errlist_objs flac_afh"
        filter_ldflags="$filter_ldflags $flac_libs -lFLAC"
        audiod_ldflags="$audiod_ldflags $flac_libs -lFLAC"
 +      play_ldflags="$play_ldflags $flac_libs -lFLAC"
        server_ldflags="$server_ldflags $flac_libs -lFLAC"
        afh_ldflags="$afh_ldflags $flac_libs -lFLAC"
 +      recv_ldflags="$afh_ldflags $flac_libs -lFLAC"
        filters="$filters flacdec"
        server_audio_formats="$server_audio_formats flac"
        audiod_audio_formats="$audiod_audio_formats flac"
@@@ -855,10 -808,7 +855,10 @@@ msg="=> will not build oss writer
  
  AC_CHECK_HEADER(sys/soundcard.h, [
        audiod_errlist_objs="$audiod_errlist_objs oss_write"
 +      play_errlist_objs="$play_errlist_objs oss_write"
        audiod_cmdline_objs="$audiod_cmdline_objs add_cmdline(oss_write)"
 +      play_cmdline_objs="$play_cmdline_objs add_cmdline(oss_write)"
 +
        write_errlist_objs="$write_errlist_objs oss_write"
        write_cmdline_objs="$write_cmdline_objs add_cmdline(oss_write)"
        fade_errlist_objs="$fade_errlist_objs oss_mix"
  
        AC_CHECK_LIB(ossaudio, _oss_ioctl, [
                        audiod_ldflags="$audiod_ldflags -lossaudio"
 +                      play_ldflags="$play_ldflags -lossaudio"
                        write_ldflags="$write_ldflags -lossaudio"
                        fade_ldflags="$fade_ldflags -lossaudio"
                ]
@@@ -915,10 -864,6 +915,10 @@@ if test "$have_alsa" = "yes"; the
        audiod_errlist_objs="$audiod_errlist_objs alsa_write"
        audiod_cmdline_objs="$audiod_cmdline_objs add_cmdline(alsa_write)"
        audiod_ldflags="$audiod_ldflags -lasound"
 +      play_errlist_objs="$play_errlist_objs alsa_write"
 +      play_cmdline_objs="$play_cmdline_objs add_cmdline(alsa_write)"
 +      play_ldflags="$play_ldflags -lasound"
 +
        write_errlist_objs="$write_errlist_objs alsa_write"
        write_cmdline_objs="$write_cmdline_objs add_cmdline(alsa_write)"
        write_ldflags="$write_ldflags -lasound"
@@@ -1022,10 -967,6 +1022,10 @@@ if test "$have_ao" = "yes"; the
        audiod_cmdline_objs="$audiod_cmdline_objs add_cmdline(ao_write)"
        audiod_ldflags="$audiod_ldflags -lao -lpthread"
  
 +      play_errlist_objs="$play_errlist_objs ao_write"
 +      play_cmdline_objs="$play_cmdline_objs add_cmdline(ao_write)"
 +      play_ldflags="$play_ldflags -lao -lpthread"
 +
        write_errlist_objs="$write_errlist_objs ao_write"
        write_cmdline_objs="$write_cmdline_objs add_cmdline(ao_write)"
        write_ldflags="$write_ldflags $ao_libs -lao -lpthread"
@@@ -1061,21 -1002,14 +1061,21 @@@ AC_CHECK_HEADERS([readline/readline.h]
        have_readline="no"
        AC_MSG_WARN([readline/readline.h not found, $msg])
  ])
 +
 +if test "$have_curses" != "yes"; then
 +      have_readline="no"
 +      AC_MSG_WARN([interactive cli support depends on curses,])
 +      AC_MSG_WARN([but no curses lib was detected, $msg])
 +fi
 +
  if test "$have_readline" = "yes"; then
        readline_libs="$readline_libs -lreadline"
 -      AC_SEARCH_LIBS([rl_replace_line], [readline], [], [have_readline="no"])
 +      AC_SEARCH_LIBS([rl_free_keymap], [readline], [], [have_readline="no"])
        if test "$have_readline" = "no"; then # try with -lcurses
                  # clear cache
                AC_MSG_NOTICE([trying again with -lcurses])
 -                unset ac_cv_search_rl_replace_line 2> /dev/null
 -              AC_SEARCH_LIBS([rl_replace_line], [readline], [
 +                unset ac_cv_search_rl_free_keymap 2> /dev/null
 +              AC_SEARCH_LIBS([rl_free_keymap], [readline], [
                        have_readline=yes
                        readline_libs="$readline_libs -lcurses"
                ], [], [-lcurses])
        if test "$have_readline" = "no"; then # try with -ltermcap
                  # clear cache
                AC_MSG_NOTICE([trying again with -ltermcap])
 -                unset ac_cv_search_rl_replace_line 2> /dev/null
 -              AC_SEARCH_LIBS([rl_replace_line], [readline], [
 +                unset ac_cv_search_rl_free_keymap 2> /dev/null
 +              AC_SEARCH_LIBS([rl_free_keymap], [readline], [
                        have_readline=yes
                        readline_libs="$readline_libs -ltermcap"
                ], [], [-ltermcap])
@@@ -1097,8 -1031,6 +1097,8 @@@ if test "$have_readline" = "yes"; the
        client_ldflags="$client_ldflags $readline_libs"
        audioc_errlist_objs="$audioc_errlist_objs buffer_tree interactive sched time"
        audioc_ldflags="$audioc_ldflags $readline_libs"
 +      play_errlist_objs="$play_errlist_objs interactive"
 +      play_ldflags="$play_ldflags $readline_libs"
        AC_SUBST(readline_cppflags)
        AC_DEFINE(HAVE_READLINE, 1, define to 1 to turn on readline support)
  else
  CPPFLAGS="$OLD_CPPFLAGS"
  LDFLAGS="$OLD_LDFLAGS"
  LIBS="$OLD_LIBS"
+ ############################################################# libsamplerate
+ OLD_CPPFLAGS="$CPPFLAGS"
+ OLD_LD_FLAGS="$LDFLAGS"
+ OLD_LIBS="$LIBS"
+ have_samplerate="yes"
+ AC_ARG_WITH(samplerate_headers, [AS_HELP_STRING(--with-samplerate-headers=dir,
+       [look for samplerate headers also in dir])])
+ if test -n "$with_samplerate_headers"; then
+       samplerate_cppflags="-I$with_samplerate_headers"
+       CPPFLAGS="$CPPFLAGS $samplerate_cppflags"
+ fi
+ AC_ARG_WITH(samplerate_libs, [AS_HELP_STRING(--with-samplerate-libs=dir,
+       [look for samplerate libs also in dir])])
+ if test -n "$with_samplerate_libs"; then
+       samplerate_libs="-L$with_samplerate_libs"
+       LDFLAGS="$LDFLAGS $samplerate_libs"
+ fi
+ AC_CHECK_HEADER(samplerate.h, [], have_samplerate=no)
+ AC_CHECK_LIB([samplerate], [src_process], [], have_samplerate=no, [])
+ if test "$have_samplerate" = "yes"; then
+       all_errlist_objs="$all_errlist_objs resample_filter"
+       filter_errlist_objs="$filter_errlist_objs resample_filter check_wav"
+       filter_cmdline_objs="$filter_cmdline_objs add_cmdline(resample_filter)"
+       audiod_errlist_objs="$audiod_errlist_objs resample_filter check_wav"
+       audiod_cmdline_objs="$audiod_cmdline_objs add_cmdline(resample_filter)"
++      play_errlist_objs="$play_errlist_objs resample_filter check_wav"
++      play_cmdline_objs="$play_cmdline_objs add_cmdline(resample_filter)"
+       filter_ldflags="$filter_ldflags $samplerate_libs -lsamplerate"
+       audiod_ldflags="$audiod_ldflags $samplerate_libs -lsamplerate"
++      play_ldflags="$play_ldflags $samplerate_libs -lsamplerate"
+       filters="$filters resample"
+       AC_SUBST(samplerate_cppflags)
+ else
+       AC_MSG_WARN([no resample support in para_audiod/para_filter])
+ fi
+ CPPFLAGS="$OLD_CPPFLAGS"
+ LDFLAGS="$OLD_LDFLAGS"
+ LIBS="$OLD_LIBS"
  ############################################################# error2.h
  AC_MSG_NOTICE(creating error2.h)
  for i in $executables; do
@@@ -1158,8 -1128,6 +1199,8 @@@ write_objs="$write_cmdline_objs $write_
  client_objs="$client_cmdline_objs $client_errlist_objs"
  audioc_objs="$audioc_cmdline_objs $audioc_errlist_objs"
  afh_objs="$afh_cmdline_objs $afh_errlist_objs"
 +play_objs="$play_cmdline_objs $play_errlist_objs"
 +
  
  AC_SUBST(recv_objs, add_dot_o($recv_objs))
  AC_SUBST(recv_ldflags, $recv_ldflags)
@@@ -1205,13 -1173,6 +1246,13 @@@ AC_SUBST(gui_objs, add_dot_o($gui_objs)
  AC_DEFINE_UNQUOTED(INIT_GUI_ERRLISTS,
        objlist_to_errlist($gui_errlist_objs), errors used by para_gui)
  
 +AC_SUBST(play_objs, add_dot_o($play_objs))
 +AC_SUBST(play_ldflags, $play_ldflags)
 +AC_DEFINE_UNQUOTED(INIT_PLAY_ERRLISTS,
 +      objlist_to_errlist($play_errlist_objs), errors used by para_play)
 +
 +AC_MSG_NOTICE(play objs: $play_objs)
 +
  enum="$(for i in $filters; do printf "${i}_FILTER, " | tr '[a-z]' '[A-Z]'; done)"
  AC_DEFINE_UNQUOTED(FILTER_ENUM, $enum NUM_SUPPORTED_FILTERS,
        enum of supported filters)
diff --combined error.h
index 981b2b794d40e2df30527245c1edb20d17d4e4bc,422ddfd263fba2d08e05dcfe0cb6eb73b1aac23b..164f8adbf11d4bcf57251fc5832af23ce630d76f
+++ b/error.h
@@@ -33,6 -33,7 +33,7 @@@ DEFINE_ERRLIST_OBJECT_ENUM
  #define FILE_WRITE_ERRORS
  #define STDIN_ERRORS
  #define WRITE_ERRORS
+ #define CHECK_WAV_ERRORS
  
  extern const char **para_errlist[];
  
        PARA_ERROR(ALSA_MIX_GET_VAL, "could not read control element state"), \
        PARA_ERROR(ALSA_MIX_SET_VAL, "could not set control element state"), \
  
+ #define RESAMPLE_FILTER_ERRORS \
+       PARA_ERROR(RESAMPLE_EOF, "resample filter: end of file"), \
+       PARA_ERROR(LIBSAMPLERATE, "secret rabbit code error"), \
  #define SIDEBAND_ERRORS \
        PARA_ERROR(BAD_BAND, "invalid or unexpected band designator"), \
        PARA_ERROR(SB_PACKET_SIZE, "invalid sideband packet size or protocol error"), \
  
  
 +#define PLAY_ERRORS \
 +      PARA_ERROR(PLAY_SYNTAX, "para_play: syntax error"), \
 +      PARA_ERROR(NO_VALID_FILES, "no valid file found in playlist"), \
 +      PARA_ERROR(TERM_RQ, "user termination request"), \
 +      PARA_ERROR(BAD_PLAY_CMD, "invalid command"), \
 +
 +
  #define FLACDEC_FILTER_ERRORS \
        PARA_ERROR(FLACDEC_DECODER_ALLOC, "could not allocate stream decoder"), \
        PARA_ERROR(FLACDEC_DECODER_INIT, "could not init stream decoder"), \
        PARA_ERROR(FLAC_STREAMINFO, "could not read stream info meta block"), \
  
  
 +#define AFH_RECV_ERRORS \
 +      PARA_ERROR(AFH_RECV_BAD_FILENAME, "invalid file name"), \
 +
 +
  #define OGG_AFH_COMMON_ERRORS \
        PARA_ERROR(STREAM_PACKETOUT, "ogg stream packet-out error (first packet)"), \
        PARA_ERROR(SYNC_PAGEOUT, "ogg sync page-out error (no ogg file?)"), \
  #define INTERACTIVE_ERRORS \
        PARA_ERROR(I9E_EOF, "end of input"), \
        PARA_ERROR(I9E_SETUPTERM, "failed to set up terminal"), \
 +      PARA_ERROR(I9E_TERM_RQ, "received termination request"), \
  
  /** \endcond errors */
  
diff --combined m4/gengetopt/makefile
index c88dfd984be2bd3864e710a257fc6244869cfd1e,c3b42f441ffa4b445c193849180b51404c0d0009..138ac30b909f4b95bb0d2d50921f9930e4493840
@@@ -27,15 -27,20 +27,22 @@@ $(ggo_dir)/filter.ggo: $(m4_ggo_dir)/lo
  $(ggo_dir)/fsck.ggo: $(m4_ggo_dir)/loglevel.m4
  $(ggo_dir)/gui.ggo: $(m4_ggo_dir)/loglevel.m4 $(m4_ggo_dir)/config_file.m4
  $(ggo_dir)/recv.ggo: $(m4_ggo_dir)/loglevel.m4
- $(ggo_dir)/write.ggo: $(m4_ggo_dir)/loglevel.m4
+ $(ggo_dir)/write.ggo: $(m4_ggo_dir)/loglevel.m4 \
+       $(m4_ggo_dir)/channels.m4 \
+       $(m4_ggo_dir)/sample_rate.m4 \
+       $(m4_ggo_dir)/sample_format.m4
  $(ggo_dir)/client.ggo: \
        $(m4_ggo_dir)/loglevel.m4 \
        $(m4_ggo_dir)/config_file.m4 \
        $(m4_ggo_dir)/history_file.m4 \
        $(m4_ggo_dir)/complete.m4
  $(ggo_dir)/fade.ggo: $(m4_ggo_dir)/loglevel.m4 $(m4_ggo_dir)/config_file.m4
+ $(ggo_dir)/resample_filter.ggo: \
+       $(m4_ggo_dir)/channels.m4 \
+       $(m4_ggo_dir)/sample_rate.m4 \
+       $(m4_ggo_dir)/sample_format.m4
 +$(ggo_dir)/play.ggo: $(m4_ggo_dir)/loglevel.m4 $(m4_ggo_dir)/config_file.m4
 +
  $(ggo_dir)/%.ggo: $(m4_ggo_dir)/%.m4 $(m4_ggo_dir)/header.m4 | $(ggo_dir)
        @[ -z "$(Q)" ] || echo 'M4 $<'
        $(Q) m4 -I $(m4_ggo_dir) $< > $@