[packages/xmms-input-xmp] - XMMS plugin extracted from xmp 3.5.0 and adapted to libxmp 4.x API
qboosh
qboosh at pld-linux.org
Mon May 22 21:29:32 CEST 2017
commit d4e0cd220a47242ff202e26ed7385ec89b68c8ed
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date: Mon May 22 21:30:16 2017 +0200
- XMMS plugin extracted from xmp 3.5.0 and adapted to libxmp 4.x API
xmms-input-xmp.spec | 45 +++++++
xmp-xmms_plugin_update.patch | 304 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 349 insertions(+)
---
diff --git a/xmms-input-xmp.spec b/xmms-input-xmp.spec
new file mode 100644
index 0000000..1e3506a
--- /dev/null
+++ b/xmms-input-xmp.spec
@@ -0,0 +1,45 @@
+Summary: XMMS plugin that uses XMP library to play music modules
+Summary(pl.UTF-8): Wtyczka dla XMMS-a odtwarzająca moduły dźwiękowe z użyciem XMP
+Name: xmms-input-xmp
+Version: 3.5.0
+Release: 1
+License: GPL v2+
+Group: X11/Applications/Sound
+Source0: http://downloads.sourceforge.net/xmp/xmp-%{version}.tar.gz
+# Source0-md5: 47e54e6dfa88ce37370054d4a3ea955f
+Patch0: xmp-xmms_plugin_update.patch
+URL: http://xmp.sourceforge.net/
+BuildRequires: libxmp-devel >= 4
+BuildRequires: rpmbuild(macros) >= 1.125
+BuildRequires: xmms-devel >= 1.0.0
+Requires: libxmp >= 4
+Requires: xmms >= 1.0.0
+BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
+
+%description
+XMMS plugin that uses XMP library to play music modules.
+
+%description -l pl.UTF-8
+Wtyczka dla XMMS-a odtwarzająca moduły dźwiękowe z użyciem biblioteki
+XMP.
+
+%prep
+%setup -q -n xmp-%{version}
+%patch0 -p1
+
+%build
+%{__cc} %{rpmcflags} %{rpmcppflags} $(xmms-config --cflags) -fPIC -DVERSION='"%{version}"' -o xmms.o -c src/plugin/xmms.c
+%{__cc} %{rpmldflags} %{rpmcflags} -shared -o xmp-xmms.so xmms.o $(xmms-config --libs) -lxmp -pthread
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+install -D xmp-xmms.so $RPM_BUILD_ROOT%{xmms_input_plugindir}/xmp-xmms.so
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(644,root,root,755)
+%doc README
+%attr(755,root,root) %{xmms_input_plugindir}/xmp-xmms.so
diff --git a/xmp-xmms_plugin_update.patch b/xmp-xmms_plugin_update.patch
new file mode 100644
index 0000000..dc193d1
--- /dev/null
+++ b/xmp-xmms_plugin_update.patch
@@ -0,0 +1,304 @@
+--- xmp-3.5.0/src/plugin/xmms.c.orig 2017-05-22 16:20:23.876653755 +0200
++++ xmp-3.5.0/src/plugin/xmms.c 2017-05-22 21:14:44.933118768 +0200
+@@ -20,9 +20,7 @@
+
+ #include <gtk/gtk.h>
+
+-#include "xmp.h"
+-#include "common.h"
+-#include "driver.h"
++#include <xmp.h>
+
+ static void init (void);
+ static int is_our_file (char *);
+@@ -103,7 +101,6 @@
+ .get_song_info = get_song_info,
+ };
+
+-extern struct xmp_drv_info drv_smix;
+
+
+ static void aboutbox()
+@@ -113,8 +110,8 @@
+ GtkWidget *about_exit;
+ GtkWidget *scroll1;
+ GtkWidget *table1;
+- GtkWidget *label_fmt, *label_trk;
+- struct xmp_fmt_info *f, *fmt;
++ GtkWidget *label_fmt;
++ char **fmt;
+ int i;
+
+ if (about_window) {
+@@ -160,20 +157,16 @@
+ gtk_widget_set (scroll1, "height", 100, NULL);
+ gtk_box_pack_start(GTK_BOX(vbox1), scroll1, TRUE, TRUE, 0);
+
+- xmp_get_fmt_info(&fmt);
+- table1 = gtk_table_new(100, 2, FALSE);
+- for (i = 0, f = fmt; f; i++, f = f->next) {
+- label_fmt = gtk_label_new(f->id);
+- label_trk = gtk_label_new(f->tracker);
++ fmt = xmp_get_format_list();
++ table1 = gtk_table_new(100, 1, FALSE);
++ for (i = 0; fmt[i] != NULL; i++) {
++ label_fmt = gtk_label_new(fmt[i]);
+ gtk_label_set_justify (GTK_LABEL (label_fmt), GTK_JUSTIFY_LEFT);
+- gtk_label_set_justify (GTK_LABEL (label_trk), GTK_JUSTIFY_LEFT);
+ gtk_table_attach_defaults (GTK_TABLE (table1),
+ label_fmt, 0, 1, i, i + 1);
+- gtk_table_attach_defaults (GTK_TABLE (table1),
+- label_trk, 1, 2, i, i + 1);
+ }
+
+- gtk_table_resize (GTK_TABLE (table1), i + 1, 3);
++ gtk_table_resize (GTK_TABLE (table1), i + 1, 2);
+ gtk_object_set_data(GTK_OBJECT(table1), "table1", table1);
+
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll1),
+@@ -197,7 +190,6 @@
+ if (!playing)
+ return;
+
+- _D("*** stop!");
+ xmp_stop_module(ctx);
+
+ pthread_join(decode_thread, NULL);
+@@ -210,26 +202,8 @@
+
+ static void seek(int time)
+ {
+- int i, t;
+- struct xmp_player_context *p = &((struct xmp_context *)ctx)->p;
+-
+- _D("seek to %d, total %d", time, xmp_cfg.time);
+-
+ time *= 1000;
+- for (i = 0; i < xmp_cfg.mod_info.len; i++) {
+- t = p->m.xxo_info[i].time;
+-
+- _D("%2d: %d %d", i, time, t);
+-
+- if (t > time) {
+- int a;
+- if (i > 0)
+- i--;
+- a = xmp_ord_set(ctx, i);
+- xmp_ip.output->flush(p->m.xxo_info[i].time);
+- break;
+- }
+- }
++ xmp_seek_time(ctx, time);
+ }
+
+ static void mod_pause(short p)
+@@ -260,7 +234,6 @@
+ ConfigFile *cfg;
+ gchar *filename;
+
+- xmp_drv_register(&drv_smix);
+ ctx = xmp_create_context();
+
+ xmp_cfg.mixing_freq = 0;
+@@ -291,13 +264,12 @@
+ xmms_cfg_free(cfg);
+ }
+
+- xmp_init(ctx, 0, NULL);
+ }
+
+
+ static int is_our_file(char *filename)
+ {
+- if (xmp_test_module(ctx, filename, NULL) == 0)
++ if (xmp_test_module(filename, NULL) == 0)
+ return 1;
+
+ return 0;
+@@ -309,13 +281,11 @@
+ xmp_context ctx2;
+ int lret;
+ struct xmp_module_info mi;
+- struct xmp_options *opt;
+
+ /* Create new context to load a file and get the length */
+
+ ctx2 = xmp_create_context();
+- opt = xmp_get_options(ctx2);
+- opt->skipsmp = 1; /* don't load samples */
++ xmp_set_player(ctx2, XMP_PLAYER_SMPCTL, XMP_SMPCTL_SKIP); /* don't load samples */
+
+ pthread_mutex_lock(&load_mutex);
+ lret = xmp_load_module(ctx2, filename);
+@@ -328,7 +298,7 @@
+
+ *length = lret;
+ xmp_get_module_info(ctx2, &mi);
+- *title = g_strdup(mi.name);
++ *title = g_strdup(mi.mod->name);
+
+ xmp_release_module(ctx2);
+ xmp_free_context(ctx2);
+@@ -339,15 +309,12 @@
+ {
+ int channelcnt = 1;
+ FILE *f;
+- struct xmp_options *opt;
+ int lret;
+ AFormat fmt;
+ int nch;
++ int xmpformat = 0;
++ int freq;
+
+- opt = xmp_get_options(ctx);
+-
+- _D("play_file: %s", filename);
+-
+ stop(); /* sanity check */
+
+ if ((f = fopen(filename,"rb")) == 0) {
+@@ -359,60 +326,46 @@
+ xmp_plugin_audio_error = FALSE;
+ playing = 1;
+
+- opt->resol = 8;
+- opt->verbosity = 0;
+- opt->drv_id = "smix";
+-
+ switch (xmp_cfg.mixing_freq) {
+ case 1:
+- opt->freq = 22050; /* 1:2 mixing freq */
++ freq = 22050; /* 1:2 mixing freq */
+ break;
+ case 2:
+- opt->freq = 11025; /* 1:4 mixing freq */
++ freq = 11025; /* 1:4 mixing freq */
+ break;
+ default:
+- opt->freq = 44100; /* standard mixing freq */
++ freq = 44100; /* standard mixing freq */
+ break;
+ }
+
+- if (xmp_cfg.force8bit == 0)
+- opt->resol = 16;
++ if (xmp_cfg.force8bit)
++ xmpformat |= XMP_FORMAT_8BIT;
+
+ if (xmp_cfg.force_mono == 0) {
+ channelcnt = 2;
+- opt->outfmt &= ~XMP_FMT_MONO;
+ } else {
+- opt->outfmt |= XMP_FMT_MONO;
++ xmpformat |= XMP_FORMAT_MONO;
+ }
+
+- if (xmp_cfg.interpolation == 1)
+- opt->flags |= XMP_CTL_ITPT;
+- else
+- opt->flags &= ~XMP_CTL_ITPT;
+-
+- if (xmp_cfg.filter == 1)
+- opt->flags |= XMP_CTL_FILTER;
+- else
+- opt->flags &= ~XMP_CTL_FILTER;
+-
+- opt->mix = xmp_cfg.pan_amplitude;
++ xmp_set_player(ctx, XMP_PLAYER_INTERP, xmp_cfg.interpolation ? XMP_INTERP_LINEAR : XMP_INTERP_NEAREST);
++ xmp_set_player(ctx, XMP_PLAYER_DSP, xmp_cfg.filter ? XMP_DSP_LOWPASS : 0);
++ xmp_set_player(ctx, XMP_PLAYER_MIX, xmp_cfg.pan_amplitude);
+
+- fmt = opt->resol == 16 ? FMT_S16_NE : FMT_U8;
+- nch = opt->outfmt & XMP_FMT_MONO ? 1 : 2;
++ fmt = (!xmp_cfg.force8bit) ? FMT_S16_NE : FMT_U8;
++ nch = xmp_cfg.force_mono ? 1 : 2;
+
+ if (audio_open)
+ xmp_ip.output->close_audio();
+
+- if (!xmp_ip.output->open_audio(fmt, opt->freq, nch)) {
++ if (!xmp_ip.output->open_audio(fmt, freq, nch)) {
+ xmp_plugin_audio_error = TRUE;
+ return;
+ }
+
+ audio_open = TRUE;
+
+- xmp_open_audio(ctx);
++ xmp_start_player(ctx, freq, xmpformat);
+
+- _D("*** loading: %s", filename);
+ pthread_mutex_lock(&load_mutex);
+ lret = xmp_load_module(ctx, filename);
+ pthread_mutex_unlock(&load_mutex);
+@@ -423,14 +376,10 @@
+ return;
+ }
+
+- _D ("before panel update");
+-
+ xmp_cfg.time = lret;
+ xmp_get_module_info(ctx, &xmp_cfg.mod_info);
+
+- _D("after panel update");
+-
+- xmp_ip.set_info(xmp_cfg.mod_info.name, lret, 0, opt->freq, channelcnt);
++ xmp_ip.set_info(xmp_cfg.mod_info.mod->name, lret, 0, freq, channelcnt);
+ pthread_create(&decode_thread, NULL, play_loop, NULL);
+ }
+
+@@ -439,28 +388,26 @@
+ {
+ void *data;
+ int size;
++ struct xmp_frame_info fi;
+
+- xmp_player_start(ctx);
+- while (xmp_player_frame(ctx) == 0) {
+- xmp_get_buffer(ctx, &data, &size);
++ while (xmp_play_frame(ctx) == 0) {
++ xmp_get_frame_info(ctx, &fi);
+
+ xmp_ip.add_vis_pcm(xmp_ip.output->written_time(),
+ xmp_cfg.force8bit ? FMT_U8 : FMT_S16_NE,
+- xmp_cfg.force_mono ? 1 : 2, size, data);
++ xmp_cfg.force_mono ? 1 : 2, fi.buffer_size, fi.buffer);
+
+- while (xmp_ip.output->buffer_free() < size && playing)
++ while (xmp_ip.output->buffer_free() < fi.buffer_size && playing)
+ usleep(10000);
+
+ if (playing)
+- xmp_ip.output->write_audio(data, size);
++ xmp_ip.output->write_audio(fi.buffer, fi.buffer_size);
+ }
+- xmp_player_end(ctx);
++ xmp_end_player(ctx);
+
+ xmp_release_module(ctx);
+- xmp_close_audio(ctx);
+ playing = 0;
+
+- _D("--- pthread_exit");
+ pthread_exit(NULL);
+
+ return NULL;
+@@ -695,9 +642,6 @@
+ {
+ ConfigFile *cfg;
+ gchar *filename;
+- struct xmp_options *opt;
+-
+- opt = xmp_get_options(ctx);
+
+ if (GTK_TOGGLE_BUTTON(Res_16)->active)
+ xmp_cfg.force8bit = 0;
+@@ -723,7 +667,7 @@
+ xmp_cfg.fixloops = !!GTK_TOGGLE_BUTTON(Fixloops_Check)->active;
+
+ xmp_cfg.pan_amplitude = (guchar)GTK_ADJUSTMENT(pansep_adj)->value;
+- opt->mix = xmp_cfg.pan_amplitude;
++ xmp_set_player(ctx, XMP_PLAYER_MIX, xmp_cfg.pan_amplitude);
+
+ filename = g_strconcat(g_get_home_dir(), CONFIG_FILE, NULL);
+ cfg = xmms_cfg_open_file(filename);
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/xmms-input-xmp.git/commitdiff/d4e0cd220a47242ff202e26ed7385ec89b68c8ed
More information about the pld-cvs-commit
mailing list