decoder_plugin.h 4.88 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 21 22 23
 */

#ifndef MPD_DECODER_PLUGIN_H
#define MPD_DECODER_PLUGIN_H

#include <stdbool.h>
24
#include <stddef.h>
25

26
struct config_param;
27 28 29 30 31 32 33 34 35 36 37 38 39
struct input_stream;
struct tag;

/**
 * Opaque handle which the decoder plugin passes to the functions in
 * this header.
 */
struct decoder;

struct decoder_plugin {
	const char *name;

	/**
40 41 42 43 44 45
	 * Initialize the decoder plugin.  Optional method.
	 *
	 * @param param a configuration block for this plugin, or NULL
	 * if none is configured
	 * @return true if the plugin was initialized successfully,
	 * false if the plugin is not available
46
	 */
47
	bool (*init)(const struct config_param *param);
48 49

	/**
50 51
	 * Deinitialize a decoder plugin which was initialized
	 * successfully.  Optional method.
52 53 54 55
	 */
	void (*finish)(void);

	/**
56
	 * Decode a stream (data read from an #input_stream object).
57
	 *
58 59 60
	 * Either implement this method or file_decode().  If
	 * possible, it is recommended to implement this method,
	 * because it is more versatile.
61
	 */
62 63
	void (*stream_decode)(struct decoder *decoder,
			      struct input_stream *is);
64 65

	/**
66
	 * Decode a local file.
67
	 *
68
	 * Either implement this method or stream_decode().
69
	 */
70
	void (*file_decode)(struct decoder *decoder, const char *path_fs);
71 72

	/**
73 74 75
	 * Read the tags of a local file.
	 *
	 * @return NULL if the operation has failed
76
	 */
77
	struct tag *(*tag_dup)(const char *path_fs);
78

79 80 81 82 83 84 85
	/**
	 * Read the tags of a stream.
	 *
	 * @return NULL if the operation has failed
	 */
	struct tag *(*stream_tag)(struct input_stream *is);

86 87 88 89 90 91 92 93 94 95
	/**
	 * @brief Return a "virtual" filename for subtracks in
	 * container formats like flac
	 * @param const char* pathname full pathname for the file on fs
	 * @param const unsigned int tnum track number
	 *
	 * @return NULL if there are no multiple files
	 * a filename for every single track according to tnum (param 2)
	 * do not include full pathname here, just the "virtual" file
	 */
96
	char* (*container_scan)(const char *path_fs, const unsigned int tnum);
97

98 99 100 101 102
	/* last element in these arrays must always be a NULL: */
	const char *const*suffixes;
	const char *const*mime_types;
};

103 104 105
/**
 * Initialize a decoder plugin.
 *
106 107
 * @param param a configuration block for this plugin, or NULL if none
 * is configured
108 109 110 111
 * @return true if the plugin was initialized successfully, false if
 * the plugin is not available
 */
static inline bool
112 113
decoder_plugin_init(const struct decoder_plugin *plugin,
		    const struct config_param *param)
114 115
{
	return plugin->init != NULL
116
		? plugin->init(param)
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
		: true;
}

/**
 * Deinitialize a decoder plugin which was initialized successfully.
 */
static inline void
decoder_plugin_finish(const struct decoder_plugin *plugin)
{
	if (plugin->finish != NULL)
		plugin->finish();
}

/**
 * Decode a stream.
 */
static inline void
decoder_plugin_stream_decode(const struct decoder_plugin *plugin,
			     struct decoder *decoder, struct input_stream *is)
{
	plugin->stream_decode(decoder, is);
}

/**
 * Decode a file.
 */
static inline void
decoder_plugin_file_decode(const struct decoder_plugin *plugin,
			   struct decoder *decoder, const char *path_fs)
{
	plugin->file_decode(decoder, path_fs);
}

/**
 * Read the tag of a file.
 */
static inline struct tag *
decoder_plugin_tag_dup(const struct decoder_plugin *plugin,
		       const char *path_fs)
{
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
	return plugin->tag_dup != NULL
		? plugin->tag_dup(path_fs)
		: NULL;
}

/**
 * Read the tag of a stream.
 */
static inline struct tag *
decoder_plugin_stream_tag(const struct decoder_plugin *plugin,
			  struct input_stream *is)
{
	return plugin->stream_tag != NULL
		? plugin->stream_tag(is)
		: NULL;
172 173
}

174 175 176 177 178 179 180 181 182 183 184
/**
 * return "virtual" tracks in a container
 */
static inline char *
decoder_plugin_container_scan(	const struct decoder_plugin *plugin,
				const char* pathname,
				const unsigned int tnum)
{
	return plugin->container_scan(pathname, tnum);
}

185 186 187 188 189 190 191 192 193 194 195 196 197 198
/**
 * Does the plugin announce the specified file name suffix?
 */
bool
decoder_plugin_supports_suffix(const struct decoder_plugin *plugin,
			       const char *suffix);

/**
 * Does the plugin announce the specified MIME type?
 */
bool
decoder_plugin_supports_mime_type(const struct decoder_plugin *plugin,
				  const char *mime_type);

199
#endif