diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/dump_playlist.c | 141 | ||||
-rw-r--r-- | test/read_conf.c | 10 | ||||
-rw-r--r-- | test/read_mixer.c | 70 | ||||
-rw-r--r-- | test/read_tags.c | 28 | ||||
-rw-r--r-- | test/run_convert.c | 86 | ||||
-rw-r--r-- | test/run_decoder.c | 37 | ||||
-rw-r--r-- | test/run_encoder.c | 14 | ||||
-rw-r--r-- | test/run_filter.c | 186 | ||||
-rw-r--r-- | test/run_input.c | 8 | ||||
-rw-r--r-- | test/run_normalize.c | 79 | ||||
-rw-r--r-- | test/run_output.c | 54 | ||||
-rw-r--r-- | test/software_volume.c | 22 |
12 files changed, 697 insertions, 38 deletions
diff --git a/test/dump_playlist.c b/test/dump_playlist.c new file mode 100644 index 000000000..fba9498a7 --- /dev/null +++ b/test/dump_playlist.c @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2003-2009 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; + bool stream_open = false; + 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 */ + + success = input_stream_open(&is, uri); + if (!success) { + g_printerr("input_stream_open() failed\n"); + return 2; + } + + while (!is.ready) { + int ret = input_stream_buffer(&is); + if (ret < 0) + /* error */ + return 2; + + if (ret == 0) + /* nothing was buffered - wait */ + g_usleep(10000); + } + + stream_open = true; + + /* 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->tag != NULL) + tag_save(stdout, song->tag); + + song_free(song); + } + + /* deinitialize everything */ + + playlist_plugin_close(playlist); + if (stream_open) + 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..45e4bea88 100644 --- a/test/read_conf.c +++ b/test/read_conf.c @@ -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..60a63da00 100644 --- a/test/read_mixer.c +++ b/test/read_mixer.c @@ -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..647f7eacf 100644 --- a/test/read_tags.c +++ b/test/read_tags.c @@ -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. */ @@ -114,11 +129,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 +148,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); diff --git a/test/run_convert.c b/test/run_convert.c new file mode 100644 index 000000000..8e82ba52f --- /dev/null +++ b/test/run_convert.c @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2003-2009 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 <glib.h> + +#include <stddef.h> +#include <unistd.h> + +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; + static char buffer[4096]; + 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; + } + + 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; + } + + pcm_convert_init(&state); + + while ((nbytes = read(0, buffer, sizeof(buffer))) > 0) { + output = pcm_convert(&state, &in_audio_format, buffer, nbytes, + &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..dd1ecdb67 100644 --- a/test/run_decoder.c +++ b/test/run_decoder.c @@ -17,17 +17,38 @@ * 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 <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,11 +74,13 @@ 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; } @@ -115,6 +138,7 @@ decoder_tag(G_GNUC_UNUSED struct decoder *decoder, int main(int argc, char **argv) { + GError *error = NULL; bool ret; const char *decoder_name; struct decoder decoder; @@ -127,7 +151,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); diff --git a/test/run_encoder.c b/test/run_encoder.c index 8cb1c6d1d..bb73e7b6e 100644 --- a/test/run_encoder.c +++ b/test/run_encoder.c @@ -17,6 +17,7 @@ * 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" @@ -41,11 +42,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 +63,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 +74,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 +87,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..c1fb50879 --- /dev/null +++ b/test/run_filter.c @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2003-2009 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 <glib.h> + +#include <assert.h> +#include <string.h> +#include <errno.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); +} + +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_input.c b/test/run_input.c index 5d74473e3..bd66a1b1a 100644 --- a/test/run_input.c +++ b/test/run_input.c @@ -18,6 +18,7 @@ */ #include "config.h" +#include "input_init.h" #include "input_stream.h" #include "tag_pool.h" #include "tag_save.h" @@ -90,6 +91,7 @@ dump_input_stream(struct input_stream *is) int main(int argc, char **argv) { + GError *error = NULL; struct input_stream is; int ret; @@ -112,7 +114,11 @@ 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 */ diff --git a/test/run_normalize.c b/test/run_normalize.c new file mode 100644 index 000000000..979be9201 --- /dev/null +++ b/test/run_normalize.c @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2003-2009 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 "normalize.h" +#include "audio_parser.h" +#include "audio_format.h" +#include "conf.h" + +#include <glib.h> + +#include <stddef.h> +#include <unistd.h> +#include <string.h> + +bool +config_get_bool(const char *name, bool default_value) +{ + if (strcmp(name, CONF_VOLUME_NORMALIZATION) == 0) + return true; + else + return default_value; +} + +int main(int argc, char **argv) +{ + GError *error = NULL; + struct audio_format audio_format; + bool ret; + 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); + + initNormalization(); + + while ((nbytes = read(0, buffer, sizeof(buffer))) > 0) { + normalizeData(buffer, nbytes, &audio_format); + write(1, buffer, nbytes); + } + + finishNormalization(); +} diff --git a/test/run_output.c b/test/run_output.c index 1a171198d..9ae4e4c4b 100644 --- a/test/run_output.c +++ b/test/run_output.c @@ -17,11 +17,15 @@ * 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 <glib.h> @@ -29,12 +33,37 @@ #include <string.h> #include <unistd.h> +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 +106,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 +119,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 +141,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 +161,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..11345764d 100644 --- a/test/software_volume.c +++ b/test/software_volume.c @@ -23,6 +23,7 @@ * */ +#include "config.h" #include "pcm_volume.h" #include "audio_parser.h" #include "audio_format.h" @@ -35,31 +36,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); } } |