summaryrefslogtreecommitdiff
path: root/plugins/wildmidi/wildmidiplug.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/wildmidi/wildmidiplug.c')
-rw-r--r--plugins/wildmidi/wildmidiplug.c170
1 files changed, 170 insertions, 0 deletions
diff --git a/plugins/wildmidi/wildmidiplug.c b/plugins/wildmidi/wildmidiplug.c
new file mode 100644
index 00000000..3c5e4d81
--- /dev/null
+++ b/plugins/wildmidi/wildmidiplug.c
@@ -0,0 +1,170 @@
+/*
+ DeaDBeeF - ultimate music player for GNU/Linux systems with X11
+ Copyright (C) 2009-2010 Alexey Yakovenko <waker@users.sourceforge.net>
+
+ 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 <stdlib.h>
+#include <string.h>
+#include "../../deadbeef.h"
+#include "wildmidi_lib.h"
+
+extern DB_decoder_t wmidi_plugin;
+
+#define trace(...) { fprintf(stderr, __VA_ARGS__); }
+//#define trace(fmt,...)
+
+static DB_functions_t *deadbeef;
+
+#define min(x,y) ((x)<(y)?(x):(y))
+#define max(x,y) ((x)>(y)?(x):(y))
+
+typedef struct {
+ DB_fileinfo_t info;
+ midi *m;
+} wmidi_info_t;
+
+DB_fileinfo_t *
+wmidi_open (void) {
+ DB_fileinfo_t *_info = (DB_fileinfo_t *)malloc (sizeof (wmidi_info_t));
+ memset (_info, 0, sizeof (wmidi_info_t));
+ return _info;
+}
+
+int
+wmidi_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
+ wmidi_info_t *info = (wmidi_info_t *)_info;
+
+ info->m = WildMidi_Open (it->fname);
+ if (!info->m) {
+ fprintf (stderr, "wmidi: failed to open %s\n", it->fname);
+ return -1;
+ }
+
+ _info->plugin = &wmidi_plugin;
+ _info->channels = 2;
+ _info->bps = 16;
+ _info->samplerate = 44100;
+ _info->readpos = 0;
+
+ return 0;
+}
+
+void
+wmidi_free (DB_fileinfo_t *_info) {
+ wmidi_info_t *info = (wmidi_info_t *)_info;
+ if (info) {
+ if (info->m) {
+ WildMidi_Close (info->m);
+ info->m = NULL;
+ }
+ free (info);
+ }
+}
+
+int
+wmidi_read (DB_fileinfo_t *_info, char *bytes, int size) {
+ wmidi_info_t *info = (wmidi_info_t *)_info;
+ int bufferused = WildMidi_GetOutput (info->m, (char *)bytes, size);
+ if (bufferused < 0) {
+ fprintf (stderr, "WildMidi_GetOutput returned %d\n", bufferused);
+ return 0;
+ }
+
+ return bufferused;
+}
+
+int
+wmidi_seek_sample (DB_fileinfo_t *_info, int sample) {
+ wmidi_info_t *info = (wmidi_info_t *)_info;
+ unsigned long int s = sample;
+ WildMidi_SampledSeek (info->m, &s);
+ return 0;
+}
+
+int
+wmidi_seek (DB_fileinfo_t *_info, float time) {
+ return wmidi_seek_sample (_info, time * 44100);
+}
+
+DB_playItem_t *
+wmidi_insert (DB_playItem_t *after, const char *fname) {
+ DB_playItem_t *it = NULL;
+
+ midi *m = WildMidi_Open (fname);
+ if (!m) {
+ fprintf (stderr, "wmidi: failed to open %s\n", fname);
+ return NULL;
+ }
+
+ struct _WM_Info *inf = WildMidi_GetInfo (m);
+ it = deadbeef->pl_item_alloc ();
+ it->decoder_id = deadbeef->plug_get_decoder_id (wmidi_plugin.plugin.id);
+ it->fname = strdup (fname);
+ deadbeef->pl_add_meta (it, "title", NULL);
+ deadbeef->pl_set_item_duration (it, inf->approx_total_samples / 44100.f);
+ it->filetype = "MID";
+ after = deadbeef->pl_insert_item (after, it);
+ deadbeef->pl_item_unref (it);
+ WildMidi_Close (m);
+ return after;
+}
+
+int
+wmidi_start (void) {
+ WildMidi_Init ("/etc/timidity++/timidity-freepats.cfg", 44100, 0);
+ return 0;
+}
+
+int
+wmidi_stop (void) {
+ WildMidi_Shutdown ();
+ return 0;
+}
+
+DB_plugin_t *
+wildmidi_load (DB_functions_t *api) {
+ deadbeef = api;
+ return DB_PLUGIN (&wmidi_plugin);
+}
+
+static const char *exts[] = { "mid",NULL };
+const char *filetypes[] = { "MID", NULL };
+
+// define plugin interface
+DB_decoder_t wmidi_plugin = {
+ DB_PLUGIN_SET_API_VERSION
+ .plugin.type = DB_PLUGIN_DECODER,
+ .plugin.version_major = 0,
+ .plugin.version_minor = 1,
+ .plugin.name = "WildMidi player",
+ .plugin.descr = "MIDI player based on WildMidi library",
+ .plugin.author = "Alexey Yakovenko",
+ .plugin.email = "waker@users.sourceforge.net",
+ .plugin.website = "http://deadbeef.sf.net",
+ .plugin.start = wmidi_start,
+ .plugin.stop = wmidi_stop,
+ .plugin.id = "wmidi",
+ .open = wmidi_open,
+ .init = wmidi_init,
+ .free = wmidi_free,
+ .read_int16 = wmidi_read,
+ .seek = wmidi_seek,
+ .seek_sample = wmidi_seek_sample,
+ .insert = wmidi_insert,
+ .exts = exts,
+ .filetypes = filetypes,
+};