diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2010-06-12 10:52:27 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2010-06-12 10:52:27 +0200 |
commit | b50208c96cc68f6ae1f20d1c4d250572fb0637c4 (patch) | |
tree | 5b6903664bdfc5607407348baa0c2aa2739dcf02 /plugins/mms | |
parent | 351f99ab8d80f1c97864d8e17a88eeb00c7c9164 (diff) |
added libmms plugin to stream Microsoft Media Server radio
Diffstat (limited to 'plugins/mms')
-rw-r--r-- | plugins/mms/Makefile.am | 9 | ||||
-rw-r--r-- | plugins/mms/mms.c | 138 |
2 files changed, 147 insertions, 0 deletions
diff --git a/plugins/mms/Makefile.am b/plugins/mms/Makefile.am new file mode 100644 index 00000000..c6a06fdb --- /dev/null +++ b/plugins/mms/Makefile.am @@ -0,0 +1,9 @@ +if HAVE_MMS +mmsdir = $(libdir)/$(PACKAGE) +pkglib_LTLIBRARIES = mms.la +mms_la_SOURCES = mms.c +mms_la_LDFLAGS = -module + +mms_la_LIBADD = $(LDADD) $(LIBMMS_LIBS) +AM_CFLAGS = $(CFLAGS) -std=c99 +endif diff --git a/plugins/mms/mms.c b/plugins/mms/mms.c new file mode 100644 index 00000000..617b16f2 --- /dev/null +++ b/plugins/mms/mms.c @@ -0,0 +1,138 @@ +/* + 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 "deadbeef.h" +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <string.h> +#include <libmms/mmsx.h> + +static DB_functions_t *deadbeef; +typedef struct { + DB_vfs_t *vfs; + mmsx_t *stream; + const mms_io_t *io; +} MMS_FILE; + +static DB_vfs_t plugin; + +const uint32_t mms_bandwidths[]={14400,19200,28800,33600,34430,57600, + 115200,262200,393216,524300,1544000,10485800}; + + +const char * mms_bandwidth_strs[]={"14.4 Kbps (Modem)", "19.2 Kbps (Modem)", + "28.8 Kbps (Modem)", "33.6 Kbps (Modem)", + "34.4 Kbps (Modem)", "57.6 Kbps (Modem)", + "115.2 Kbps (ISDN)", "262.2 Kbps (Cable/DSL)", + "393.2 Kbps (Cable/DSL)","524.3 Kbps (Cable/DSL)", + "1.5 Mbps (T1)", "10.5 Mbps (LAN)", NULL}; + + + +static DB_FILE * +mms_open (const char *fname) { + MMS_FILE *fp = malloc (sizeof (MMS_FILE)); + fp->io = mms_get_default_io_impl(); + fp->stream = mmsx_connect ((mms_io_t *)fp->io, fp, fname, 1544000); + if (!fp->stream) { + free (fp); + return NULL; + } + fp->vfs = &plugin; + return (DB_FILE*)fp; +} + +static void +mms_close (DB_FILE *stream) { + assert (stream); + mmsx_close (((MMS_FILE *)stream)->stream); + free (stream); +} + +static size_t +mms_read (void *ptr, size_t size, size_t nmemb, DB_FILE *stream) { + assert (stream); + assert (ptr); + MMS_FILE *fp = (MMS_FILE *)stream; + int res = mmsx_read ((mms_io_t *)fp->io, fp->stream, ptr, size * nmemb); + return res; +} + +static int +mms_seek (DB_FILE *stream, int64_t offset, int whence) { + assert (stream); + MMS_FILE *fp = (MMS_FILE *)stream; + return mmsx_seek ((mms_io_t *)fp->io, fp->stream, offset, whence); +} + +static int64_t +mms_tell (DB_FILE *stream) { + assert (stream); + return mmsx_get_current_pos (((MMS_FILE *)stream)->stream); +} + +static void +mms_rewind (DB_FILE *stream) { + assert (stream); + // FIXME + return; +} + +static int64_t +mms_getlength (DB_FILE *stream) { + assert (stream); + MMS_FILE *f = (MMS_FILE *)stream; + return mmsx_get_length (f->stream); +} + +const char * +mms_get_content_type (DB_FILE *stream) { + return "audio/wma"; +} + +static const char *scheme_names[] = { "mms://", "mmsh://", NULL }; + +static DB_vfs_t plugin = { + DB_PLUGIN_SET_API_VERSION + .plugin.version_major = 0, + .plugin.version_minor = 1, + .plugin.type = DB_PLUGIN_VFS, + .plugin.name = "mms vfs", + .plugin.descr = "MMS streaming plugin based on libmms", + .plugin.author = "Alexey Yakovenko", + .plugin.email = "waker@users.sourceforge.net", + .plugin.website = "http://deadbeef.sf.net", + .open = mms_open, + .close = mms_close, + .read = mms_read, + .seek = mms_seek, + .tell = mms_tell, + .rewind = mms_rewind, + .getlength = mms_getlength, + .get_content_type = mms_get_content_type, + .scheme_names = scheme_names, + .streaming = 1 +}; + +DB_plugin_t * +mms_load (DB_functions_t *api) { + deadbeef = api; + return DB_PLUGIN (&plugin); +} + |