decoder_plugin.h 5.17 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
struct input_stream;
struct tag;
29
struct tag_handler;
30 31 32 33 34 35 36 37 38 39 40

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

struct decoder_plugin {
	const char *name;

	/**
41 42 43 44 45 46
	 * 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
47
	 */
48
	bool (*init)(const struct config_param *param);
49 50

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

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

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

	/**
74
	 * Scan metadata of a file.
75
	 *
76
	 * @return false if the operation has failed
77
	 */
78 79 80
	bool (*scan_file)(const char *path_fs,
			  const struct tag_handler *handler,
			  void *handler_ctx);
81

82
	/**
83
	 * Scan metadata of a file.
84
	 *
85
	 * @return false if the operation has failed
86
	 */
87 88 89
	bool (*scan_stream)(struct input_stream *is,
			    const struct tag_handler *handler,
			    void *handler_ctx);
90

91 92 93 94 95 96 97 98 99 100
	/**
	 * @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
	 */
101
	char* (*container_scan)(const char *path_fs, const unsigned int tnum);
102

103 104 105 106 107
	/* last element in these arrays must always be a NULL: */
	const char *const*suffixes;
	const char *const*mime_types;
};

108 109 110
/**
 * Initialize a decoder plugin.
 *
111 112
 * @param param a configuration block for this plugin, or NULL if none
 * is configured
113 114 115 116
 * @return true if the plugin was initialized successfully, false if
 * the plugin is not available
 */
static inline bool
117 118
decoder_plugin_init(const struct decoder_plugin *plugin,
		    const struct config_param *param)
119 120
{
	return plugin->init != NULL
121
		? plugin->init(param)
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 157
		: 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.
 */
158 159 160 161
static inline bool
decoder_plugin_scan_file(const struct decoder_plugin *plugin,
			 const char *path_fs,
			 const struct tag_handler *handler, void *handler_ctx)
162
{
163 164 165
	return plugin->scan_file != NULL
		? plugin->scan_file(path_fs, handler, handler_ctx)
		: false;
166 167 168 169 170
}

/**
 * Read the tag of a stream.
 */
171 172 173 174 175
static inline bool
decoder_plugin_scan_stream(const struct decoder_plugin *plugin,
			   struct input_stream *is,
			   const struct tag_handler *handler,
			   void *handler_ctx)
176
{
177 178 179
	return plugin->scan_stream != NULL
		? plugin->scan_stream(is, handler, handler_ctx)
		: false;
180 181
}

182 183 184 185 186 187 188 189 190 191 192
/**
 * 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);
}

193 194 195 196 197 198 199 200 201 202 203 204 205 206
/**
 * 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);

207
#endif