exec send_common ggo udp_recv color fec fecdec_filter
prebuffer_filter bitstream imdct
wma_afh wma_common wmadec_filter buffer_tree crypt_common
- gui gui_theme sideband afh_recv"
-executables="recv filter audioc write client afh audiod"
+ gui gui_theme sideband afh_recv play"
+
+executables="recv filter audioc write client afh audiod play"
recv_cmdline_objs="add_cmdline(recv http_recv dccp_recv udp_recv afh_recv)"
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
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"
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"
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"
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"
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)
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])
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"
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"
]
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"
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"
])
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])
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
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)
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)
--- /dev/null
+/*
+ * Copyright (C) 2012 Andre Noll <maan@systemlinux.org>
+ *
+ * Licensed under the GPL v2. For licencing details see COPYING.
+ */
+
+/** \file play.c Paraslash's standalone player. */
+
+#include <regex.h>
+
+#include "para.h"
+#include "list.h"
+#include "play.cmdline.h"
+#include "filter.cmdline.h"
+#include "error.h"
+#include "ggo.h"
+#include "buffer_tree.h"
+#include "version.h"
+#include "string.h"
+#include "sched.h"
+#include "filter.h"
+#include "afh.h"
+#include "recv.h"
+#include "write.h"
+#include "write_common.h"
+#include "fd.h"
+
+static struct play_args_info conf;
+
+/** Initialize the array of errors for para_play. */
+INIT_PLAY_ERRLISTS;
+
+/* Activate the afh receiver. */
+extern void afh_recv_init(struct receiver *r);
+#undef AFH_RECEIVER
+#define AFH_RECEIVER {.name = "afh", .init = afh_recv_init},
+DEFINE_RECEIVER_ARRAY;
+
+/* FIXME: This is needed by the amp filter. */
+char *stat_item_values[NUM_STAT_ITEMS] = {NULL};
+
+static int loglevel = LL_WARNING;
+INIT_STDERR_LOGGING(loglevel);
+
+__noreturn static void print_help_and_die(void)
+{
+ int d = conf.detailed_help_given;
+ const char **p = d? play_args_info_detailed_help
+ : play_args_info_help;
+
+ printf_or_die("%s\n\n", PLAY_CMDLINE_PARSER_PACKAGE "-"
+ PLAY_CMDLINE_PARSER_VERSION);
+ printf_or_die("%s\n\n", play_args_info_usage);
+ for (; *p; p++)
+ printf_or_die("%s\n", *p);
+ print_filter_helps(d);
+ print_writer_helps(d);
+ exit(0);
+}
+
+static void parse_config_or_die(int argc, char *argv[])
+{
+ int ret;
+ char *config_file;
+ struct play_cmdline_parser_params params = {
+ .override = 0,
+ .initialize = 1,
+ .check_required = 0,
+ .check_ambiguity = 0,
+ .print_errors = 1
+ };
+
+ if (play_cmdline_parser_ext(argc, argv, &conf, ¶ms))
+ exit(EXIT_FAILURE);
+ HANDLE_VERSION_FLAG("play", conf);
+ if (conf.help_given || conf.detailed_help_given)
+ print_help_and_die();
+ loglevel = get_loglevel_by_name(conf.loglevel_arg);
+ if (conf.config_file_given)
+ config_file = para_strdup(conf.config_file_arg);
+ else {
+ char *home = para_homedir();
+ config_file = make_message("%s/.paraslash/play.conf", home);
+ free(home);
+ }
+ ret = file_exists(config_file);
+ if (conf.config_file_given && !ret) {
+ PARA_EMERG_LOG("can not read config file %s\n", config_file);
+ goto err;
+ }
+ if (ret) {
+ params.initialize = 0;
+ params.check_required = 1;
+ play_cmdline_parser_config_file(config_file, &conf, ¶ms);
+ }
+ free(config_file);
+ return;
+err:
+ free(config_file);
+ exit(EXIT_FAILURE);
+}
+
+int main(int argc, char *argv[])
+{
+ /* needed this early to make help work */
+ recv_init();
+ filter_init();
+ writer_init();
+
+ parse_config_or_die(argc, argv);
+ return 0;
+}