00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MPD_OUTPUT_PLUGIN_H
00021 #define MPD_OUTPUT_PLUGIN_H
00022
00023 #include <glib.h>
00024
00025 #include <stdbool.h>
00026 #include <stddef.h>
00027
00028 struct config_param;
00029 struct audio_format;
00030 struct tag;
00031
00035 struct audio_output_plugin {
00039 const char *name;
00040
00045 bool (*test_default_device)(void);
00046
00060 void *(*init)(const struct audio_format *audio_format,
00061 const struct config_param *param,
00062 GError **error);
00063
00067 void (*finish)(void *data);
00068
00077 bool (*open)(void *data, struct audio_format *audio_format,
00078 GError **error);
00079
00083 void (*close)(void *data);
00084
00089 void (*send_tag)(void *data, const struct tag *tag);
00090
00098 size_t (*play)(void *data, const void *chunk, size_t size,
00099 GError **error);
00100
00105 void (*cancel)(void *data);
00106
00118 bool (*pause)(void *data);
00119
00126 const struct mixer_plugin *mixer_plugin;
00127 };
00128
00129 static inline bool
00130 ao_plugin_test_default_device(const struct audio_output_plugin *plugin)
00131 {
00132 return plugin->test_default_device != NULL
00133 ? plugin->test_default_device()
00134 : false;
00135 }
00136
00137 static inline void *
00138 ao_plugin_init(const struct audio_output_plugin *plugin,
00139 const struct audio_format *audio_format,
00140 const struct config_param *param,
00141 GError **error)
00142 {
00143 return plugin->init(audio_format, param, error);
00144 }
00145
00146 static inline void
00147 ao_plugin_finish(const struct audio_output_plugin *plugin, void *data)
00148 {
00149 plugin->finish(data);
00150 }
00151
00152 static inline bool
00153 ao_plugin_open(const struct audio_output_plugin *plugin,
00154 void *data, struct audio_format *audio_format,
00155 GError **error)
00156 {
00157 return plugin->open(data, audio_format, error);
00158 }
00159
00160 static inline void
00161 ao_plugin_close(const struct audio_output_plugin *plugin, void *data)
00162 {
00163 plugin->close(data);
00164 }
00165
00166 static inline void
00167 ao_plugin_send_tag(const struct audio_output_plugin *plugin,
00168 void *data, const struct tag *tag)
00169 {
00170 if (plugin->send_tag != NULL)
00171 plugin->send_tag(data, tag);
00172 }
00173
00174 static inline size_t
00175 ao_plugin_play(const struct audio_output_plugin *plugin,
00176 void *data, const void *chunk, size_t size,
00177 GError **error)
00178 {
00179 return plugin->play(data, chunk, size, error);
00180 }
00181
00182 static inline void
00183 ao_plugin_cancel(const struct audio_output_plugin *plugin, void *data)
00184 {
00185 if (plugin->cancel != NULL)
00186 plugin->cancel(data);
00187 }
00188
00189 static inline bool
00190 ao_plugin_pause(const struct audio_output_plugin *plugin, void *data)
00191 {
00192 return plugin->pause != NULL
00193 ? plugin->pause(data)
00194 : false;
00195 }
00196
00197 #endif