diff options
Diffstat (limited to '')
-rw-r--r-- | test/dump_playlist.c | 157 | ||||
-rw-r--r-- | test/read_conf.c | 12 | ||||
-rw-r--r-- | test/read_mixer.c | 72 | ||||
-rw-r--r-- | test/read_tags.c | 76 | ||||
-rw-r--r-- | test/run_convert.c | 122 | ||||
-rw-r--r-- | test/run_decoder.c | 100 | ||||
-rw-r--r-- | test/run_encoder.c | 17 | ||||
-rw-r--r-- | test/run_filter.c | 204 | ||||
-rw-r--r-- | test/run_inotify.c | 93 | ||||
-rw-r--r-- | test/run_input.c | 45 | ||||
-rw-r--r-- | test/run_normalize.c | 72 | ||||
-rw-r--r-- | test/run_output.c | 66 | ||||
-rw-r--r-- | test/software_volume.c | 25 | ||||
-rw-r--r-- | test/stdbin.h | 29 | ||||
-rwxr-xr-x | test/test_archive_bzip2.sh | 10 | ||||
-rwxr-xr-x | test/test_archive_iso9660.sh | 10 | ||||
-rwxr-xr-x | test/test_archive_zzip.sh | 10 |
17 files changed, 1043 insertions, 77 deletions
diff --git a/test/dump_playlist.c b/test/dump_playlist.c new file mode 100644 index 000000000..a8cb4d750 --- /dev/null +++ b/test/dump_playlist.c @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2003-2010 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" +#include "input_init.h" +#include "input_stream.h" +#include "tag_pool.h" +#include "tag_save.h" +#include "conf.h" +#include "song.h" +#include "playlist_list.h" +#include "playlist_plugin.h" + +#include <glib.h> + +#include <unistd.h> + +static void +my_log_func(const gchar *log_domain, G_GNUC_UNUSED GLogLevelFlags log_level, + const gchar *message, G_GNUC_UNUSED gpointer user_data) +{ + if (log_domain != NULL) + g_printerr("%s: %s\n", log_domain, message); + else + g_printerr("%s\n", message); +} + +int main(int argc, char **argv) +{ + const char *uri; + struct input_stream *is = NULL; + bool success; + GError *error = NULL; + struct playlist_provider *playlist; + struct song *song; + + if (argc != 3) { + g_printerr("Usage: dump_playlist CONFIG URI\n"); + return 1; + } + + uri = argv[2]; + + /* initialize GLib */ + + g_thread_init(NULL); + g_log_set_default_handler(my_log_func, NULL); + + /* initialize MPD */ + + tag_pool_init(); + config_global_init(); + success = config_read_file(argv[1], &error); + if (!success) { + g_printerr("%s:", error->message); + g_error_free(error); + return 1; + } + + if (!input_stream_global_init(&error)) { + g_warning("%s", error->message); + g_error_free(error); + return 2; + } + + playlist_list_global_init(); + + /* open the playlist */ + + playlist = playlist_list_open_uri(uri); + if (playlist == NULL) { + /* open the stream and wait until it becomes ready */ + + is = input_stream_open(uri, &error); + if (is == NULL) { + if (error != NULL) { + g_warning("%s", error->message); + g_error_free(error); + } else + g_printerr("input_stream_open() failed\n"); + return 2; + } + + while (!is->ready) { + int ret = input_stream_buffer(is, &error); + if (ret < 0) { + /* error */ + g_warning("%s", error->message); + g_error_free(error); + return 2; + } + + if (ret == 0) + /* nothing was buffered - wait */ + g_usleep(10000); + } + + /* open the playlist */ + + playlist = playlist_list_open_stream(is, uri); + if (playlist == NULL) { + input_stream_close(is); + g_printerr("Failed to open playlist\n"); + return 2; + } + } + + /* dump the playlist */ + + while ((song = playlist_plugin_read(playlist)) != NULL) { + g_print("%s\n", song->uri); + + if (song->end_ms > 0) + g_print("range: %u:%02u..%u:%02u\n", + song->start_ms / 60000, + (song->start_ms / 1000) % 60, + song->end_ms / 60000, + (song->end_ms / 1000) % 60); + else if (song->start_ms > 0) + g_print("range: %u:%02u..\n", + song->start_ms / 60000, + (song->start_ms / 1000) % 60); + + if (song->tag != NULL) + tag_save(stdout, song->tag); + + song_free(song); + } + + /* deinitialize everything */ + + playlist_plugin_close(playlist); + if (is != NULL) + input_stream_close(is); + playlist_list_global_finish(); + input_stream_global_finish(); + config_global_finish(); + tag_pool_deinit(); + + return 0; +} diff --git a/test/read_conf.c b/test/read_conf.c index 286ec2c77..4f43e6a2e 100644 --- a/test/read_conf.c +++ b/test/read_conf.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2009 The Music Player Daemon Project + * Copyright (C) 2003-2010 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "config.h" #include "conf.h" #include <glib.h> @@ -37,6 +38,8 @@ my_log_func(G_GNUC_UNUSED const gchar *log_domain, int main(int argc, char **argv) { const char *path, *name, *value; + GError *error = NULL; + bool success; int ret; if (argc != 3) { @@ -50,7 +53,12 @@ int main(int argc, char **argv) g_log_set_default_handler(my_log_func, NULL); config_global_init(); - config_read_file(path); + success = config_read_file(path, &error); + if (!success) { + g_printerr("%s:", error->message); + g_error_free(error); + return 1; + } value = config_get_string(name, NULL); if (value != NULL) { diff --git a/test/read_mixer.c b/test/read_mixer.c index be6864ba1..1b5b093a3 100644 --- a/test/read_mixer.c +++ b/test/read_mixer.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2009 The Music Player Daemon Project + * Copyright (C) 2003-2010 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -17,8 +17,12 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "config.h" #include "mixer_control.h" #include "mixer_list.h" +#include "filter_registry.h" +#include "pcm_volume.h" +#include "event_pipe.h" #include <glib.h> @@ -26,8 +30,55 @@ #include <string.h> #include <unistd.h> +#ifdef HAVE_PULSE +#include "output/pulse_output_plugin.h" + +void +pulse_output_set_mixer(G_GNUC_UNUSED struct pulse_output *po, + G_GNUC_UNUSED struct pulse_mixer *pm) +{ +} + +void +pulse_output_clear_mixer(G_GNUC_UNUSED struct pulse_output *po, + G_GNUC_UNUSED struct pulse_mixer *pm) +{ +} + +bool +pulse_output_set_volume(G_GNUC_UNUSED struct pulse_output *po, + G_GNUC_UNUSED const struct pa_cvolume *volume, + G_GNUC_UNUSED GError **error_r) +{ + return false; +} + +#endif + +void +event_pipe_emit(G_GNUC_UNUSED enum pipe_event event) +{ +} + +const struct filter_plugin * +filter_plugin_by_name(G_GNUC_UNUSED const char *name) +{ + assert(false); + return NULL; +} + +bool +pcm_volume(G_GNUC_UNUSED void *buffer, G_GNUC_UNUSED int length, + G_GNUC_UNUSED const struct audio_format *format, + G_GNUC_UNUSED int volume) +{ + assert(false); + return false; +} + int main(int argc, G_GNUC_UNUSED char **argv) { + GError *error = NULL; struct mixer *mixer; bool success; int volume; @@ -39,27 +90,34 @@ int main(int argc, G_GNUC_UNUSED char **argv) g_thread_init(NULL); - mixer = mixer_new(&alsa_mixer, NULL); + mixer = mixer_new(&alsa_mixer_plugin, NULL, NULL, &error); if (mixer == NULL) { - g_printerr("mixer_new() failed\n"); + g_printerr("mixer_new() failed: %s\n", error->message); + g_error_free(error); return 2; } - success = mixer_open(mixer); + success = mixer_open(mixer, &error); if (!success) { mixer_free(mixer); - g_printerr("failed to open the mixer\n"); + g_printerr("failed to open the mixer: %s\n", error->message); + g_error_free(error); return 2; } - volume = mixer_get_volume(mixer); + volume = mixer_get_volume(mixer, &error); mixer_close(mixer); mixer_free(mixer); assert(volume >= -1 && volume <= 100); if (volume < 0) { - g_printerr("failed to read volume\n"); + if (error != NULL) { + g_printerr("failed to read volume: %s\n", + error->message); + g_error_free(error); + } else + g_printerr("failed to read volume\n"); return 2; } diff --git a/test/read_tags.c b/test/read_tags.c index e7958abdb..3e5e523bf 100644 --- a/test/read_tags.c +++ b/test/read_tags.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2009 The Music Player Daemon Project + * Copyright (C) 2003-2010 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -17,19 +17,34 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "config.h" #include "decoder_list.h" #include "decoder_api.h" +#include "input_init.h" #include "input_stream.h" #include "audio_format.h" #include "pcm_volume.h" #include "tag_ape.h" #include "tag_id3.h" +#include "idle.h" #include <glib.h> #include <assert.h> #include <unistd.h> +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif + +/** + * No-op dummy. + */ +void +idle_add(G_GNUC_UNUSED unsigned flags) +{ +} + /** * No-op dummy. */ @@ -49,11 +64,6 @@ decoder_initialized(G_GNUC_UNUSED struct decoder *decoder, { } -char *decoder_get_uri(G_GNUC_UNUSED struct decoder *decoder) -{ - return NULL; -} - enum decoder_command decoder_get_command(G_GNUC_UNUSED struct decoder *decoder) { @@ -78,15 +88,20 @@ decoder_read(G_GNUC_UNUSED struct decoder *decoder, struct input_stream *is, void *buffer, size_t length) { - return input_stream_read(is, buffer, length); + return input_stream_read(is, buffer, length, NULL); +} + +void +decoder_timestamp(G_GNUC_UNUSED struct decoder *decoder, + G_GNUC_UNUSED double t) +{ } enum decoder_command decoder_data(G_GNUC_UNUSED struct decoder *decoder, G_GNUC_UNUSED struct input_stream *is, const void *data, size_t datalen, - G_GNUC_UNUSED float data_time, G_GNUC_UNUSED uint16_t bit_rate, - G_GNUC_UNUSED struct replay_gain_info *replay_gain_info) + G_GNUC_UNUSED uint16_t bit_rate) { write(1, data, datalen); return DECODE_COMMAND_NONE; @@ -100,6 +115,22 @@ decoder_tag(G_GNUC_UNUSED struct decoder *decoder, return DECODE_COMMAND_NONE; } +float +decoder_replay_gain(G_GNUC_UNUSED struct decoder *decoder, + G_GNUC_UNUSED const struct replay_gain_info *replay_gain_info) +{ + return 0.0; +} + +void +decoder_mixramp(G_GNUC_UNUSED struct decoder *decoder, + G_GNUC_UNUSED float replay_gain_db, + char *mixramp_start, char *mixramp_end) +{ + g_free(mixramp_start); + g_free(mixramp_end); +} + static void print_tag(const struct tag *tag) { @@ -114,11 +145,17 @@ print_tag(const struct tag *tag) int main(int argc, char **argv) { + GError *error = NULL; const char *decoder_name, *path; const struct decoder_plugin *plugin; struct tag *tag; bool empty; +#ifdef HAVE_LOCALE_H + /* initialize locale */ + setlocale(LC_CTYPE,""); +#endif + if (argc != 3) { g_printerr("Usage: read_tags DECODER FILE\n"); return 1; @@ -127,7 +164,12 @@ int main(int argc, char **argv) decoder_name = argv[1]; path = argv[2]; - input_stream_global_init(); + if (!input_stream_global_init(&error)) { + g_warning("%s", error->message); + g_error_free(error); + return 2; + } + decoder_plugin_init_all(); plugin = decoder_plugin_from_name(decoder_name); @@ -137,6 +179,20 @@ int main(int argc, char **argv) } tag = decoder_plugin_tag_dup(plugin, path); + if (tag == NULL && plugin->stream_tag != NULL) { + struct input_stream *is = input_stream_open(path, &error); + + if (is == NULL) { + g_printerr("Failed to open %s: %s\n", + path, error->message); + g_error_free(error); + return 1; + } + + tag = decoder_plugin_stream_tag(plugin, is); + input_stream_close(is); + } + decoder_plugin_deinit_all(); input_stream_global_finish(); if (tag == NULL) { diff --git a/test/run_convert.c b/test/run_convert.c new file mode 100644 index 000000000..415d7535c --- /dev/null +++ b/test/run_convert.c @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2003-2010 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/* + * This program is a command line interface to MPD's PCM conversion + * library (pcm_convert.c). + * + */ + +#include "config.h" +#include "audio_parser.h" +#include "audio_format.h" +#include "pcm_convert.h" +#include "conf.h" +#include "fifo_buffer.h" +#include "stdbin.h" + +#include <glib.h> + +#include <assert.h> +#include <stddef.h> +#include <unistd.h> + +static void +my_log_func(const gchar *log_domain, G_GNUC_UNUSED GLogLevelFlags log_level, + const gchar *message, G_GNUC_UNUSED gpointer user_data) +{ + if (log_domain != NULL) + g_printerr("%s: %s\n", log_domain, message); + else + g_printerr("%s\n", message); +} + +const char * +config_get_string(G_GNUC_UNUSED const char *name, const char *default_value) +{ + return default_value; +} + +int main(int argc, char **argv) +{ + GError *error = NULL; + struct audio_format in_audio_format, out_audio_format; + struct pcm_convert_state state; + const void *output; + ssize_t nbytes; + size_t length; + + if (argc != 3) { + g_printerr("Usage: run_convert IN_FORMAT OUT_FORMAT <IN >OUT\n"); + return 1; + } + + g_log_set_default_handler(my_log_func, NULL); + + if (!audio_format_parse(&in_audio_format, argv[1], + false, &error)) { + g_printerr("Failed to parse audio format: %s\n", + error->message); + return 1; + } + + if (!audio_format_parse(&out_audio_format, argv[2], + false, &error)) { + g_printerr("Failed to parse audio format: %s\n", + error->message); + return 1; + } + + const size_t in_frame_size = audio_format_frame_size(&in_audio_format); + + pcm_convert_init(&state); + + struct fifo_buffer *buffer = fifo_buffer_new(4096); + + while (true) { + void *p = fifo_buffer_write(buffer, &length); + assert(p != NULL); + + nbytes = read(0, p, length); + if (nbytes <= 0) + break; + + fifo_buffer_append(buffer, nbytes); + + const void *src = fifo_buffer_read(buffer, &length); + assert(src != NULL); + + length -= length % in_frame_size; + if (length == 0) + continue; + + fifo_buffer_consume(buffer, length); + + output = pcm_convert(&state, &in_audio_format, src, length, + &out_audio_format, &length, &error); + if (output == NULL) { + g_printerr("Failed to convert: %s\n", error->message); + return 2; + } + + write(1, output, length); + } + + pcm_convert_deinit(&state); +} diff --git a/test/run_decoder.c b/test/run_decoder.c index 861720cdb..c997ebf8f 100644 --- a/test/run_decoder.c +++ b/test/run_decoder.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2009 The Music Player Daemon Project + * Copyright (C) 2003-2010 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -17,17 +17,39 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "config.h" #include "decoder_list.h" #include "decoder_api.h" +#include "input_init.h" #include "input_stream.h" #include "audio_format.h" #include "pcm_volume.h" +#include "idle.h" +#include "stdbin.h" #include <glib.h> #include <assert.h> #include <unistd.h> +static void +my_log_func(const gchar *log_domain, G_GNUC_UNUSED GLogLevelFlags log_level, + const gchar *message, G_GNUC_UNUSED gpointer user_data) +{ + if (log_domain != NULL) + g_printerr("%s: %s\n", log_domain, message); + else + g_printerr("%s\n", message); +} + +/** + * No-op dummy. + */ +void +idle_add(G_GNUC_UNUSED unsigned flags) +{ +} + /** * No-op dummy. */ @@ -53,20 +75,17 @@ decoder_initialized(struct decoder *decoder, G_GNUC_UNUSED bool seekable, G_GNUC_UNUSED float total_time) { + struct audio_format_string af_string; + assert(!decoder->initialized); assert(audio_format_valid(audio_format)); - g_printerr("audio_format=%u:%u:%u\n", audio_format->sample_rate, - audio_format->bits, audio_format->channels); + g_printerr("audio_format=%s\n", + audio_format_to_string(audio_format, &af_string)); decoder->initialized = true; } -char *decoder_get_uri(struct decoder *decoder) -{ - return g_strdup(decoder->uri); -} - enum decoder_command decoder_get_command(G_GNUC_UNUSED struct decoder *decoder) { @@ -91,15 +110,20 @@ decoder_read(G_GNUC_UNUSED struct decoder *decoder, struct input_stream *is, void *buffer, size_t length) { - return input_stream_read(is, buffer, length); + return input_stream_read(is, buffer, length, NULL); +} + +void +decoder_timestamp(G_GNUC_UNUSED struct decoder *decoder, + G_GNUC_UNUSED double t) +{ } enum decoder_command decoder_data(G_GNUC_UNUSED struct decoder *decoder, G_GNUC_UNUSED struct input_stream *is, const void *data, size_t datalen, - G_GNUC_UNUSED float data_time, G_GNUC_UNUSED uint16_t bit_rate, - G_GNUC_UNUSED struct replay_gain_info *replay_gain_info) + G_GNUC_UNUSED uint16_t kbit_rate) { write(1, data, datalen); return DECODE_COMMAND_NONE; @@ -113,9 +137,36 @@ decoder_tag(G_GNUC_UNUSED struct decoder *decoder, return DECODE_COMMAND_NONE; } +float +decoder_replay_gain(G_GNUC_UNUSED struct decoder *decoder, + const struct replay_gain_info *replay_gain_info) +{ + const struct replay_gain_tuple *tuple = + &replay_gain_info->tuples[REPLAY_GAIN_ALBUM]; + if (replay_gain_tuple_defined(tuple)) + g_printerr("replay_gain[album]: gain=%f peak=%f\n", + tuple->gain, tuple->peak); + + tuple = &replay_gain_info->tuples[REPLAY_GAIN_TRACK]; + if (replay_gain_tuple_defined(tuple)) + g_printerr("replay_gain[track]: gain=%f peak=%f\n", + tuple->gain, tuple->peak); + + return 0.0; +} + +void +decoder_mixramp(G_GNUC_UNUSED struct decoder *decoder, + G_GNUC_UNUSED float replay_gain_db, + char *mixramp_start, char *mixramp_end) +{ + g_free(mixramp_start); + g_free(mixramp_end); +} + int main(int argc, char **argv) { - bool ret; + GError *error = NULL; const char *decoder_name; struct decoder decoder; @@ -127,7 +178,14 @@ int main(int argc, char **argv) decoder_name = argv[1]; decoder.uri = argv[2]; - input_stream_global_init(); + g_log_set_default_handler(my_log_func, NULL); + + if (!input_stream_global_init(&error)) { + g_warning("%s", error->message); + g_error_free(error); + return 2; + } + decoder_plugin_init_all(); decoder.plugin = decoder_plugin_from_name(decoder_name); @@ -142,15 +200,21 @@ int main(int argc, char **argv) decoder_plugin_file_decode(decoder.plugin, &decoder, decoder.uri); } else if (decoder.plugin->stream_decode != NULL) { - struct input_stream is; + struct input_stream *is = + input_stream_open(decoder.uri, &error); + if (is == NULL) { + if (error != NULL) { + g_warning("%s", error->message); + g_error_free(error); + } else + g_printerr("input_stream_open() failed\n"); - ret = input_stream_open(&is, decoder.uri); - if (!ret) return 1; + } - decoder_plugin_stream_decode(decoder.plugin, &decoder, &is); + decoder_plugin_stream_decode(decoder.plugin, &decoder, is); - input_stream_close(&is); + input_stream_close(is); } else { g_printerr("Decoder plugin is not usable\n"); return 1; diff --git a/test/run_encoder.c b/test/run_encoder.c index 8cb1c6d1d..4b512d46a 100644 --- a/test/run_encoder.c +++ b/test/run_encoder.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2009 The Music Player Daemon Project + * Copyright (C) 2003-2010 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -17,11 +17,13 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "config.h" #include "encoder_list.h" #include "encoder_plugin.h" #include "audio_format.h" #include "audio_parser.h" #include "conf.h" +#include "stdbin.h" #include <glib.h> @@ -41,11 +43,7 @@ encoder_to_stdout(struct encoder *encoder) int main(int argc, char **argv) { GError *error = NULL; - struct audio_format audio_format = { - .sample_rate = 44100, - .bits = 16, - .channels = 2, - }; + struct audio_format audio_format; bool ret; const char *encoder_name; const struct encoder_plugin *plugin; @@ -66,6 +64,8 @@ int main(int argc, char **argv) else encoder_name = "vorbis"; + audio_format_init(&audio_format, 44100, SAMPLE_FORMAT_S16, 2); + /* create the encoder */ plugin = encoder_plugin_get(encoder_name); @@ -75,7 +75,7 @@ int main(int argc, char **argv) } param = config_new_param(NULL, -1); - config_add_block_param(param, "quality", "5.0", -1); + config_add_block_param(param, "quality", "5.0", -1, NULL); encoder = encoder_init(plugin, param, &error); if (encoder == NULL) { @@ -88,7 +88,8 @@ int main(int argc, char **argv) /* open the encoder */ if (argc > 2) { - ret = audio_format_parse(&audio_format, argv[2], &error); + ret = audio_format_parse(&audio_format, argv[2], + false, &error); if (!ret) { g_printerr("Failed to parse audio format: %s\n", error->message); diff --git a/test/run_filter.c b/test/run_filter.c new file mode 100644 index 000000000..ee2445eac --- /dev/null +++ b/test/run_filter.c @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2003-2010 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" +#include "conf.h" +#include "audio_parser.h" +#include "audio_format.h" +#include "filter_plugin.h" +#include "pcm_volume.h" +#include "idle.h" +#include "mixer_control.h" +#include "playlist.h" +#include "stdbin.h" + +#include <glib.h> + +#include <assert.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> + +struct playlist g_playlist; + +void +idle_add(G_GNUC_UNUSED unsigned flags) +{ +} + +bool +mixer_set_volume(G_GNUC_UNUSED struct mixer *mixer, + G_GNUC_UNUSED unsigned volume, G_GNUC_UNUSED GError **error_r) +{ + return true; +} + +static void +my_log_func(const gchar *log_domain, G_GNUC_UNUSED GLogLevelFlags log_level, + const gchar *message, G_GNUC_UNUSED gpointer user_data) +{ + if (log_domain != NULL) + g_printerr("%s: %s\n", log_domain, message); + else + g_printerr("%s\n", message); +} + +static const struct config_param * +find_named_config_block(const char *block, const char *name) +{ + const struct config_param *param = NULL; + + while ((param = config_get_next_param(block, param)) != NULL) { + const char *current_name = + config_get_block_string(param, "name", NULL); + if (current_name != NULL && strcmp(current_name, name) == 0) + return param; + } + + return NULL; +} + +static struct filter * +load_filter(const char *name) +{ + const struct config_param *param; + struct filter *filter; + GError *error = NULL; + + param = find_named_config_block("filter", name); + if (param == NULL) { + g_printerr("No such configured filter: %s\n", name); + return false; + } + + filter = filter_configured_new(param, &error); + if (filter == NULL) { + g_printerr("Failed to load filter: %s\n", error->message); + g_error_free(error); + return NULL; + } + + return filter; +} + +int main(int argc, char **argv) +{ + struct audio_format audio_format; + struct audio_format_string af_string; + bool success; + GError *error = NULL; + struct filter *filter; + const struct audio_format *out_audio_format; + char buffer[4096]; + size_t frame_size; + + if (argc < 3 || argc > 4) { + g_printerr("Usage: run_filter CONFIG NAME [FORMAT] <IN\n"); + return 1; + } + + audio_format_init(&audio_format, 44100, SAMPLE_FORMAT_S16, 2); + + /* initialize GLib */ + + g_thread_init(NULL); + g_log_set_default_handler(my_log_func, NULL); + + /* read configuration file (mpd.conf) */ + + config_global_init(); + success = config_read_file(argv[1], &error); + if (!success) { + g_printerr("%s:", error->message); + g_error_free(error); + return 1; + } + + /* parse the audio format */ + + if (argc > 3) { + success = audio_format_parse(&audio_format, argv[3], + false, &error); + if (!success) { + g_printerr("Failed to parse audio format: %s\n", + error->message); + g_error_free(error); + return 1; + } + } + + /* initialize the filter */ + + filter = load_filter(argv[2]); + if (filter == NULL) + return 1; + + /* open the filter */ + + out_audio_format = filter_open(filter, &audio_format, &error); + if (out_audio_format == NULL) { + g_printerr("Failed to open filter: %s\n", error->message); + g_error_free(error); + filter_free(filter); + return 1; + } + + g_printerr("audio_format=%s\n", + audio_format_to_string(out_audio_format, &af_string)); + + frame_size = audio_format_frame_size(&audio_format); + + /* play */ + + while (true) { + ssize_t nbytes; + size_t length; + const void *dest; + + nbytes = read(0, buffer, sizeof(buffer)); + if (nbytes <= 0) + break; + + dest = filter_filter(filter, buffer, (size_t)nbytes, + &length, &error); + if (dest == NULL) { + g_printerr("Filter failed: %s\n", error->message); + filter_close(filter); + filter_free(filter); + return 1; + } + + nbytes = write(1, dest, length); + if (nbytes < 0) { + g_printerr("Failed to write: %s\n", strerror(errno)); + filter_close(filter); + filter_free(filter); + return 1; + } + } + + /* cleanup and exit */ + + filter_close(filter); + filter_free(filter); + + config_global_finish(); + + return 0; +} diff --git a/test/run_inotify.c b/test/run_inotify.c new file mode 100644 index 000000000..9f3c30b8c --- /dev/null +++ b/test/run_inotify.c @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2003-2010 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" +#include "inotify_source.h" + +#include <stdbool.h> +#include <sys/inotify.h> +#include <signal.h> + +static GMainLoop *main_loop; + +static void +exit_signal_handler(G_GNUC_UNUSED int signum) +{ + g_main_loop_quit(main_loop); +} + +enum { + IN_MASK = IN_ATTRIB|IN_CLOSE_WRITE|IN_CREATE|IN_DELETE|IN_DELETE_SELF + |IN_MOVE|IN_MOVE_SELF +#ifdef IN_ONLYDIR + |IN_ONLYDIR +#endif +}; + +static void +my_inotify_callback(G_GNUC_UNUSED int wd, unsigned mask, + const char *name, G_GNUC_UNUSED void *ctx) +{ + g_print("mask=0x%x name='%s'\n", mask, name); +} + +int main(int argc, char **argv) +{ + GError *error = NULL; + const char *path; + + if (argc != 2) { + g_printerr("Usage: run_inotify PATH\n"); + return 1; + } + + path = argv[1]; + + struct mpd_inotify_source *source = + mpd_inotify_source_new(my_inotify_callback, NULL, + &error); + if (source == NULL) { + g_warning("%s", error->message); + g_error_free(error); + return 2; + } + + int descriptor = mpd_inotify_source_add(source, path, + IN_MASK, &error); + if (descriptor < 0) { + mpd_inotify_source_free(source); + g_warning("%s", error->message); + g_error_free(error); + return 2; + } + + main_loop = g_main_loop_new(NULL, false); + + struct sigaction sa; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + sa.sa_handler = exit_signal_handler; + sigaction(SIGINT, &sa, NULL); + sigaction(SIGTERM, &sa, NULL); + + g_main_loop_run(main_loop); + g_main_loop_unref(main_loop); + + mpd_inotify_source_free(source); +} diff --git a/test/run_input.c b/test/run_input.c index 5d74473e3..a50cd70ab 100644 --- a/test/run_input.c +++ b/test/run_input.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2009 The Music Player Daemon Project + * Copyright (C) 2003-2010 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -18,10 +18,12 @@ */ #include "config.h" +#include "input_init.h" #include "input_stream.h" #include "tag_pool.h" #include "tag_save.h" #include "conf.h" +#include "stdbin.h" #ifdef ENABLE_ARCHIVE #include "archive_list.h" @@ -44,6 +46,7 @@ my_log_func(const gchar *log_domain, G_GNUC_UNUSED GLogLevelFlags log_level, static int dump_input_stream(struct input_stream *is) { + GError *error = NULL; char buffer[4096]; size_t num_read; ssize_t num_written; @@ -51,10 +54,13 @@ dump_input_stream(struct input_stream *is) /* wait until the stream becomes ready */ while (!is->ready) { - int ret = input_stream_buffer(is); - if (ret < 0) + int ret = input_stream_buffer(is, &error); + if (ret < 0) { /* error */ + g_warning("%s", error->message); + g_error_free(error); return 2; + } if (ret == 0) /* nothing was buffered - wait */ @@ -76,9 +82,16 @@ dump_input_stream(struct input_stream *is) tag_free(tag); } - num_read = input_stream_read(is, buffer, sizeof(buffer)); - if (num_read == 0) + num_read = input_stream_read(is, buffer, sizeof(buffer), + &error); + if (num_read == 0) { + if (error != NULL) { + g_warning("%s", error->message); + g_error_free(error); + } + break; + } num_written = write(1, buffer, num_read); if (num_written <= 0) @@ -90,7 +103,8 @@ dump_input_stream(struct input_stream *is) int main(int argc, char **argv) { - struct input_stream is; + GError *error = NULL; + struct input_stream *is; int ret; if (argc != 2) { @@ -112,15 +126,24 @@ int main(int argc, char **argv) archive_plugin_init_all(); #endif - input_stream_global_init(); + if (!input_stream_global_init(&error)) { + g_warning("%s", error->message); + g_error_free(error); + return 2; + } /* open the stream and dump it */ - if (input_stream_open(&is, argv[1])) { - ret = dump_input_stream(&is); - input_stream_close(&is); + is = input_stream_open(argv[1], &error); + if (is != NULL) { + ret = dump_input_stream(is); + input_stream_close(is); } else { - g_printerr("input_stream_open() failed\n"); + if (error != NULL) { + g_warning("%s", error->message); + g_error_free(error); + } else + g_printerr("input_stream_open() failed\n"); ret = 2; } diff --git a/test/run_normalize.c b/test/run_normalize.c new file mode 100644 index 000000000..dd1140782 --- /dev/null +++ b/test/run_normalize.c @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2003-2010 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/* + * This program is a command line interface to MPD's normalize library + * (based on AudioCompress). + * + */ + +#include "config.h" +#include "AudioCompress/compress.h" +#include "audio_parser.h" +#include "audio_format.h" +#include "stdbin.h" + +#include <glib.h> + +#include <stddef.h> +#include <unistd.h> +#include <string.h> + +int main(int argc, char **argv) +{ + GError *error = NULL; + struct audio_format audio_format; + bool ret; + struct Compressor *compressor; + static char buffer[4096]; + ssize_t nbytes; + + if (argc > 2) { + g_printerr("Usage: run_normalize [FORMAT] <IN >OUT\n"); + return 1; + } + + if (argc > 1) { + ret = audio_format_parse(&audio_format, argv[1], + false, &error); + if (!ret) { + g_printerr("Failed to parse audio format: %s\n", + error->message); + return 1; + } + } else + audio_format_init(&audio_format, 48000, 16, 2); + + compressor = Compressor_new(0); + + while ((nbytes = read(0, buffer, sizeof(buffer))) > 0) { + Compressor_Process_int16(compressor, + (int16_t *)buffer, nbytes / 2); + write(1, buffer, nbytes); + } + + Compressor_delete(compressor); +} diff --git a/test/run_output.c b/test/run_output.c index 1a171198d..5028068ff 100644 --- a/test/run_output.c +++ b/test/run_output.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2009 The Music Player Daemon Project + * Copyright (C) 2003-2010 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -17,11 +17,18 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "config.h" #include "output_plugin.h" #include "output_internal.h" #include "output_control.h" #include "conf.h" #include "audio_parser.h" +#include "filter_registry.h" +#include "pcm_convert.h" +#include "event_pipe.h" +#include "idle.h" +#include "playlist.h" +#include "stdbin.h" #include <glib.h> @@ -29,12 +36,44 @@ #include <string.h> #include <unistd.h> +struct playlist g_playlist; + +void +idle_add(G_GNUC_UNUSED unsigned flags) +{ +} + +void +event_pipe_emit(G_GNUC_UNUSED enum pipe_event event) +{ +} + void pcm_convert_init(G_GNUC_UNUSED struct pcm_convert_state *state) { } -void notify_init(G_GNUC_UNUSED struct notify *notify) +void pcm_convert_deinit(G_GNUC_UNUSED struct pcm_convert_state *state) +{ +} + +const void * +pcm_convert(G_GNUC_UNUSED struct pcm_convert_state *state, + G_GNUC_UNUSED const struct audio_format *src_format, + G_GNUC_UNUSED const void *src, G_GNUC_UNUSED size_t src_size, + G_GNUC_UNUSED const struct audio_format *dest_format, + G_GNUC_UNUSED size_t *dest_size_r, + GError **error_r) { + g_set_error(error_r, pcm_convert_quark(), 0, + "Not implemented"); + return NULL; +} + +const struct filter_plugin * +filter_plugin_by_name(G_GNUC_UNUSED const char *name) +{ + assert(false); + return NULL; } static const struct config_param * @@ -77,11 +116,8 @@ load_audio_output(struct audio_output *ao, const char *name) int main(int argc, char **argv) { struct audio_output ao; - struct audio_format audio_format = { - .sample_rate = 44100, - .bits = 16, - .channels = 2, - }; + struct audio_format audio_format; + struct audio_format_string af_string; bool success; GError *error = NULL; char buffer[4096]; @@ -93,12 +129,19 @@ int main(int argc, char **argv) return 1; } + audio_format_init(&audio_format, 44100, SAMPLE_FORMAT_S16, 2); + g_thread_init(NULL); /* read configuration file (mpd.conf) */ config_global_init(); - config_read_file(argv[1]); + success = config_read_file(argv[1], &error); + if (!success) { + g_printerr("%s:", error->message); + g_error_free(error); + return 1; + } /* initialize the audio output */ @@ -108,7 +151,8 @@ int main(int argc, char **argv) /* parse the audio format */ if (argc > 3) { - success = audio_format_parse(&audio_format, argv[3], &error); + success = audio_format_parse(&audio_format, argv[3], + false, &error); if (!success) { g_printerr("Failed to parse audio format: %s\n", error->message); @@ -127,8 +171,8 @@ int main(int argc, char **argv) return 1; } - g_printerr("audio_format=%u:%u:%u\n", audio_format.sample_rate, - audio_format.bits, audio_format.channels); + g_printerr("audio_format=%s\n", + audio_format_to_string(&audio_format, &af_string)); frame_size = audio_format_frame_size(&audio_format); diff --git a/test/software_volume.c b/test/software_volume.c index 9a9fd56f6..c4de69328 100644 --- a/test/software_volume.c +++ b/test/software_volume.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2009 The Music Player Daemon Project + * Copyright (C) 2003-2010 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -23,9 +23,11 @@ * */ +#include "config.h" #include "pcm_volume.h" #include "audio_parser.h" #include "audio_format.h" +#include "stdbin.h" #include <glib.h> @@ -35,31 +37,34 @@ int main(int argc, char **argv) { GError *error = NULL; - struct audio_format audio_format = { - .sample_rate = 48000, - .bits = 16, - .channels = 2, - }; + struct audio_format audio_format; bool ret; static char buffer[4096]; ssize_t nbytes; if (argc > 2) { - g_printerr("Usage: software_voluem [FORMAT] <IN >OUT\n"); + g_printerr("Usage: software_volume [FORMAT] <IN >OUT\n"); return 1; } if (argc > 1) { - ret = audio_format_parse(&audio_format, argv[1], &error); + ret = audio_format_parse(&audio_format, argv[1], + false, &error); if (!ret) { g_printerr("Failed to parse audio format: %s\n", error->message); return 1; } - } + } else + audio_format_init(&audio_format, 48000, SAMPLE_FORMAT_S16, 2); while ((nbytes = read(0, buffer, sizeof(buffer))) > 0) { - pcm_volume(buffer, nbytes, &audio_format, PCM_VOLUME_1 / 2); + if (!pcm_volume(buffer, nbytes, &audio_format, + PCM_VOLUME_1 / 2)) { + g_printerr("pcm_volume() has failed\n"); + return 2; + } + write(1, buffer, nbytes); } } diff --git a/test/stdbin.h b/test/stdbin.h new file mode 100644 index 000000000..362605ad9 --- /dev/null +++ b/test/stdbin.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2003-2010 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_STDBIN_H +#define MPD_STDBIN_H + +#ifdef WIN32 +#include <fcntl.h> +/** set binary mode on stdin/stdout */ +int _CRT_fmode = _O_BINARY; +#endif + +#endif diff --git a/test/test_archive_bzip2.sh b/test/test_archive_bzip2.sh new file mode 100755 index 000000000..2c45076aa --- /dev/null +++ b/test/test_archive_bzip2.sh @@ -0,0 +1,10 @@ +#!/bin/sh -e + +SRC_BASE=configure +SRC="$(dirname $0)/../${SRC_BASE}" +DST="$(pwd)/test/tmp/${SRC_BASE}.bz2" + +mkdir -p test/tmp +rm -f "$DST" +bzip2 -c "$SRC" >"$DST" +./test/run_input "$DST/${SRC_BASE}" |diff "$SRC" - diff --git a/test/test_archive_iso9660.sh b/test/test_archive_iso9660.sh new file mode 100755 index 000000000..070d2da0a --- /dev/null +++ b/test/test_archive_iso9660.sh @@ -0,0 +1,10 @@ +#!/bin/sh -e + +SRC_BASE=configure +SRC="$(dirname $0)/../${SRC_BASE}" +DST="$(pwd)/test/tmp/${SRC_BASE}.iso" + +mkdir -p test/tmp +rm -f "$DST" +mkisofs -quiet -l -o "$DST" "$SRC" +./test/run_input "$DST/${SRC_BASE}" |diff "$SRC" - diff --git a/test/test_archive_zzip.sh b/test/test_archive_zzip.sh new file mode 100755 index 000000000..a8d23f6d7 --- /dev/null +++ b/test/test_archive_zzip.sh @@ -0,0 +1,10 @@ +#!/bin/sh -e + +SRC_BASE=configure +SRC="$(dirname $0)/../${SRC_BASE}" +DST="$(pwd)/test/tmp/${SRC_BASE}.zip" + +mkdir -p test/tmp +rm -f "$DST" +zip --quiet --junk-paths "$DST" "$SRC" +./test/run_input "$DST/${SRC_BASE}" |diff "$SRC" - |