run_encoder.c 3.1 KB
Newer Older
1
/*
Max Kellermann's avatar
Max Kellermann committed
2
 * Copyright (C) 2003-2011 The Music Player Daemon Project
3 4 5 6 7 8 9 10 11 12 13
 * 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.
14 15 16 17
 *
 * 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.
18 19
 */

20
#include "config.h"
21 22 23 24 25
#include "encoder_list.h"
#include "encoder_plugin.h"
#include "audio_format.h"
#include "audio_parser.h"
#include "conf.h"
26
#include "stdbin.h"
27 28 29 30 31 32

#include <glib.h>

#include <stddef.h>
#include <unistd.h>

33 34 35 36 37 38
static void
encoder_to_stdout(struct encoder *encoder)
{
	size_t length;
	static char buffer[32768];

39 40 41
	while ((length = encoder_read(encoder, buffer, sizeof(buffer))) > 0) {
		G_GNUC_UNUSED ssize_t ignored = write(1, buffer, length);
	}
42 43
}

44 45 46
int main(int argc, char **argv)
{
	GError *error = NULL;
47
	struct audio_format audio_format;
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
	bool ret;
	const char *encoder_name;
	const struct encoder_plugin *plugin;
	struct encoder *encoder;
	struct config_param *param;
	static char buffer[32768];
	ssize_t nbytes;

	/* parse command line */

	if (argc > 3) {
		g_printerr("Usage: run_encoder [ENCODER] [FORMAT] <IN >OUT\n");
		return 1;
	}

	if (argc > 1)
		encoder_name = argv[1];
	else
		encoder_name = "vorbis";

68
	audio_format_init(&audio_format, 44100, SAMPLE_FORMAT_S16, 2);
69

70 71 72 73 74 75 76 77
	/* create the encoder */

	plugin = encoder_plugin_get(encoder_name);
	if (plugin == NULL) {
		g_printerr("No such encoder: %s\n", encoder_name);
		return 1;
	}

78
	param = config_new_param(NULL, -1);
79
	config_add_block_param(param, "quality", "5.0", -1);
80 81 82 83 84 85 86 87 88 89 90 91

	encoder = encoder_init(plugin, param, &error);
	if (encoder == NULL) {
		g_printerr("Failed to initialize encoder: %s\n",
			   error->message);
		g_error_free(error);
		return 1;
	}

	/* open the encoder */

	if (argc > 2) {
92 93
		ret = audio_format_parse(&audio_format, argv[2],
					 false, &error);
94 95 96 97 98 99 100 101
		if (!ret) {
			g_printerr("Failed to parse audio format: %s\n",
				   error->message);
			g_error_free(error);
			return 1;
		}
	}

102
	if (!encoder_open(encoder, &audio_format, &error)) {
103 104 105 106 107 108
		g_printerr("Failed to open encoder: %s\n",
			   error->message);
		g_error_free(error);
		return 1;
	}

109 110
	encoder_to_stdout(encoder);

111 112 113 114 115 116 117 118 119 120 121
	/* do it */

	while ((nbytes = read(0, buffer, sizeof(buffer))) > 0) {
		ret = encoder_write(encoder, buffer, nbytes, &error);
		if (!ret) {
			g_printerr("encoder_write() failed: %s\n",
				   error->message);
			g_error_free(error);
			return 1;
		}

122
		encoder_to_stdout(encoder);
123
	}
124

125
	ret = encoder_end(encoder, &error);
126 127 128 129 130 131 132 133
	if (!ret) {
		g_printerr("encoder_flush() failed: %s\n",
			   error->message);
		g_error_free(error);
		return 1;
	}

	encoder_to_stdout(encoder);
134
}