[Lunar-commits] <moonbase> wildmidi: new module
Duncan Gibson
engelsman at lunar-linux.org
Sat Sep 12 17:18:38 CEST 2009
commit 12860837aae167d8b381d3c1bf43ffab85086bdb
Author: Paul Bredbury <brebs at sent.com>
Date: Sat Aug 1 01:41:42 2009 +0200
wildmidi: new module
Integrates with mpd, to play midi files.
---
zbeta/wildmidi/BUILD | 13 ++
zbeta/wildmidi/DETAILS | 44 +++++++
zbeta/wildmidi/wildmidi-0.2.2-bigendian.patch | 11 ++
zbeta/wildmidi/wildmidi-0.2.2-cfg-abs-path.patch | 30 +++++
zbeta/wildmidi/wildmidi-0.2.2-opt.patch | 24 ++++
zbeta/wildmidi/wildmidi-0.2.2-pulseaudio.patch | 147 ++++++++++++++++++++++
6 files changed, 269 insertions(+), 0 deletions(-)
diff --git a/zbeta/wildmidi/BUILD b/zbeta/wildmidi/BUILD
new file mode 100644
index 0000000..7f0919f
--- /dev/null
+++ b/zbeta/wildmidi/BUILD
@@ -0,0 +1,13 @@
+(
+
+ # Patches from http://koji.fedoraproject.org/koji/packageinfo?packageID=4841
+ patch_it $SCRIPT_DIRECTORY/wildmidi-0.2.2-opt.patch 1 &&
+ patch_it $SCRIPT_DIRECTORY/wildmidi-0.2.2-cfg-abs-path.patch 1 &&
+ patch_it $SCRIPT_DIRECTORY/wildmidi-0.2.2-pulseaudio.patch 1 &&
+ patch_it $SCRIPT_DIRECTORY/wildmidi-0.2.2-bigendian.patch 1 &&
+
+ autoreconf -fi &&
+ OPTS+=" --disable-static --disable-werror --without-arch" &&
+ default_build
+
+) > $C_FIFO 2>&1
diff --git a/zbeta/wildmidi/DETAILS b/zbeta/wildmidi/DETAILS
new file mode 100644
index 0000000..be4d8f6
--- /dev/null
+++ b/zbeta/wildmidi/DETAILS
@@ -0,0 +1,44 @@
+ MODULE=wildmidi
+ VERSION=0.2.2
+ SOURCE=$MODULE-$VERSION.tar.gz
+ SOURCE_URL=$SFORGE_URL/$MODULE
+ SOURCE_VFY=sha1:fad33365f8aaba3afdca6bb68bc48056425176a3
+ WEB_SITE=http://wildmidi.sourceforge.net/
+ ENTERED=20090721
+ UPDATED=20090721
+ SHORT="a simple software midi player"
+
+cat << EOF
+WildMIDI is a simple software midi player which has a core softsynth
+library that can be use with other applications.
+
+WildMIDI was originally conceived in December 2001 as an experiment to
+see if MIDI files could be played using the same samples as existing
+software but with much less overhead. Coming into existence as a
+command-line player in 2002 the first versions were so successful in
+reducing the overhead that developers from Quakeforge suggested that
+WildMIDI could be turned into a library. 2003 saw the first
+implementations of the WildMIDI library, with Quakeforge being used as
+the test application. The 1st official release of WildMIDI occured in
+2004 with a couple of bug fixes following shortly after.
+
+The WildMIDI library uses Gravis Ultrasound patch files to convert MIDI
+files into audio which is then passed back to the calling application
+for further processing or output. The API of the library is designed so
+that it is easy to include WildMIDI into applications that wish to
+include MIDI file playback. With multiple MIDI file support you can
+develop applications to mix several midi files together at the same
+time, and with the next release you will be able to use a different
+patch set for each MIDI file.
+
+Currently there is a small command-line player that accompanies the
+library which gives just one example of the use of the WildMIDI
+library. The next release will also contain a "self-contained" player
+which will play midi files without the extra overhead that occurs with
+the library. This is achieved by having a core source that is shared
+between the library and "self-contained" player.
+
+The future of the project will not end with the library, but with the
+library the door is open to possibilities including a software MIDI
+device, or a graphical MIDI sequencer.
+EOF
diff --git a/zbeta/wildmidi/wildmidi-0.2.2-bigendian.patch b/zbeta/wildmidi/wildmidi-0.2.2-bigendian.patch
new file mode 100644
index 0000000..d10b4bd
--- /dev/null
+++ b/zbeta/wildmidi/wildmidi-0.2.2-bigendian.patch
@@ -0,0 +1,11 @@
+--- wildmidi-0.2.2/src/wildmidi.c.orig 2004-01-28 18:13:46.000000000 +0000
++++ wildmidi-0.2.2/src/wildmidi.c 2008-07-06 14:31:38.000000000 +0100
+@@ -442,7 +442,7 @@
+ return -1;
+ }
+
+- if (snd_pcm_hw_params_set_format (pcm, hw, SND_PCM_FORMAT_S16) < 0) {
++ if (snd_pcm_hw_params_set_format (pcm, hw, SND_PCM_FORMAT_S16_LE) < 0) {
+ printf("ALSA does not support 16bit signed audio for your soundcard\n");
+ close_alsa_output();
+ return -1;
diff --git a/zbeta/wildmidi/wildmidi-0.2.2-cfg-abs-path.patch b/zbeta/wildmidi/wildmidi-0.2.2-cfg-abs-path.patch
new file mode 100644
index 0000000..46c3373
--- /dev/null
+++ b/zbeta/wildmidi/wildmidi-0.2.2-cfg-abs-path.patch
@@ -0,0 +1,30 @@
+diff -up wildmidi-0.2.2/src/wildmidi_lib.c.abs wildmidi-0.2.2/src/wildmidi_lib.c
+--- wildmidi-0.2.2/src/wildmidi_lib.c.abs 2004-01-28 19:13:46.000000000 +0100
++++ wildmidi-0.2.2/src/wildmidi_lib.c 2007-07-14 16:54:28.000000000 +0200
+@@ -845,7 +845,7 @@ WM_LoadConfig (const char *config_file)
+ }
+ continue;
+ } else if (strncasecmp(line_buffer, "source ", 7) == 0) {
+- if (config_dir != NULL) {
++ if (config_dir != NULL && line_buffer[7] != '/') {
+ new_config = malloc(strlen(config_dir) + strlen(&line_buffer[7]) + 1);
+ if (new_config == NULL) {
+ WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse config", errno);
+@@ -1013,7 +1013,7 @@ WM_LoadConfig (const char *config_file)
+ *chr_ptr = '\0';
+ }
+ if (strncasecmp(&line_buffer[(line_ptr + strlen(&line_buffer[line_ptr]) - 5)], ".pat", 4) != 0) {
+- if (config_dir != NULL) {
++ if (config_dir != NULL && line_buffer[line_ptr] != '/') {
+ tmp_patch->filename = malloc(strlen(config_dir) + strlen(&line_buffer[line_ptr]) + 5);
+ if (tmp_patch->filename == NULL) {
+ WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, NULL, 0);
+@@ -1041,7 +1041,7 @@ WM_LoadConfig (const char *config_file)
+ }
+ strcat(tmp_patch->filename, ".pat");
+ } else {
+- if (config_dir != NULL) {
++ if (config_dir != NULL && line_buffer[line_ptr] != '/') {
+ tmp_patch->filename = malloc(strlen(config_dir) + strlen(&line_buffer[line_ptr]) + 1);
+ if (tmp_patch->filename == NULL) {
+ WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, NULL, 0);
diff --git a/zbeta/wildmidi/wildmidi-0.2.2-opt.patch b/zbeta/wildmidi/wildmidi-0.2.2-opt.patch
new file mode 100644
index 0000000..2169319
--- /dev/null
+++ b/zbeta/wildmidi/wildmidi-0.2.2-opt.patch
@@ -0,0 +1,24 @@
+diff -up wildmidi-0.2.2/configure.ac.opt wildmidi-0.2.2/configure.ac
+--- wildmidi-0.2.2/configure.ac.opt 2007-07-14 15:21:57.000000000 +0200
++++ wildmidi-0.2.2/configure.ac 2007-07-14 15:22:03.000000000 +0200
+@@ -226,6 +226,8 @@ AC_ARG_WITH(arch,
+ )
+
+ case "$arch" in
++ no)
++ ;;
+ auto)
+ case "${host_cpu}" in
+ i?86)
+diff -up wildmidi-0.2.2/configure.opt wildmidi-0.2.2/configure
+--- wildmidi-0.2.2/configure.opt 2007-07-14 15:21:54.000000000 +0200
++++ wildmidi-0.2.2/configure 2007-07-14 15:22:52.000000000 +0200
+@@ -19966,6 +19966,8 @@ else
+ fi;
+
+ case "$arch" in
++ no)
++ ;;
+ auto)
+ case "${host_cpu}" in
+ i?86)
diff --git a/zbeta/wildmidi/wildmidi-0.2.2-pulseaudio.patch b/zbeta/wildmidi/wildmidi-0.2.2-pulseaudio.patch
new file mode 100644
index 0000000..2a7ffdf
--- /dev/null
+++ b/zbeta/wildmidi/wildmidi-0.2.2-pulseaudio.patch
@@ -0,0 +1,147 @@
+diff -up wildmidi-0.2.2/src/wildmidi.c.pa wildmidi-0.2.2/src/wildmidi.c
+--- wildmidi-0.2.2/src/wildmidi.c.pa 2004-01-28 19:13:46.000000000 +0100
++++ wildmidi-0.2.2/src/wildmidi.c 2008-02-09 14:54:58.000000000 +0100
+@@ -402,12 +402,8 @@ close_mm_output ( void ) {
+ #else
+ #ifdef HAVE_ALSA
+
+-void *buffer;
+-int bps;
+ int alsa_first_time = 1;
+ static snd_pcm_t *pcm;
+-static snd_pcm_uframes_t alsa_period_size;
+-static snd_pcm_channel_area_t *areas;
+
+ int write_alsa_output (char * output_data, int output_size);
+ void close_alsa_output ( void );
+@@ -417,9 +413,8 @@ open_alsa_output(void) {
+ snd_pcm_hw_params_t *hw;
+ snd_pcm_sw_params_t *sw;
+ int err;
+- int alsa_buffer_time, bits_per_sample;
++ int alsa_buffer_time;
+ unsigned int alsa_period_time;
+- snd_pcm_uframes_t alsa_buffer_size;
+
+ if (!pcmname)
+ pcmname = "default";
+@@ -437,7 +432,7 @@ open_alsa_output(void) {
+ return -1;
+ }
+
+- if ((err = snd_pcm_hw_params_set_access(pcm, hw, SND_PCM_ACCESS_MMAP_INTERLEAVED)) < 0) {
++ if ((err = snd_pcm_hw_params_set_access(pcm, hw, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
+ printf("Cannot set mmap'ed mode: %s.\n", snd_strerror(-err));
+ return -1;
+ }
+@@ -491,28 +486,6 @@ open_alsa_output(void) {
+ return -1;
+ }
+
+-#ifdef ALSA_NEW
+- if ((err = snd_pcm_hw_params_get_buffer_size(hw, &alsa_buffer_size)) < 0)
+-#else
+- if ((err = snd_pcm_hw_params_get_buffer_size(hw)) < 0)
+-#endif
+- {
+- printf ("snd_pcm_hw_params_get_buffer_size() failed: %s\n", snd_strerror(-err));
+- return -1;
+- }
+-#ifdef ALSA_NEW
+- if ((err = snd_pcm_hw_params_get_period_size(hw, &alsa_period_size, 0)) < 0)
+-#else
+- alsa_buffer_size = err;
+- if ((err = snd_pcm_hw_params_get_period_size(hw, 0)) < 0)
+-#endif
+- {
+- printf ("snd_pcm_hw_params_get_period_size() failed: %s\n", snd_strerror(-err));
+- return -1;
+- }
+-#ifndef ALSA_NEW
+- alsa_period_size = err;
+-#endif
+ snd_pcm_sw_params_alloca(&sw);
+ snd_pcm_sw_params_current(pcm, sw);
+ if (snd_pcm_sw_params(pcm, sw) < 0)
+@@ -521,19 +494,6 @@ open_alsa_output(void) {
+ return -1;
+ }
+
+- bits_per_sample = snd_pcm_format_physical_width(SND_PCM_FORMAT_S16);
+- bps = (rate * bits_per_sample * 2) / 8000;
+-
+- buffer = malloc(alsa_period_size * bits_per_sample / 8 * 2);
+- areas = malloc(2 * sizeof(snd_pcm_channel_area_t));
+-
+- areas[0].addr = buffer;
+- areas[0].first = 0;
+- areas[0].step = 2 * bits_per_sample;
+- areas[1].addr = buffer;
+- areas[1].first = bits_per_sample;
+- areas[1].step = 2 * bits_per_sample;
+-
+ send_output = write_alsa_output;
+ close_output = close_alsa_output;
+ return 0;
+@@ -541,45 +501,23 @@ open_alsa_output(void) {
+
+ int
+ write_alsa_output (char * output_data, int output_size) {
+- int cnt = 0, err;
+- snd_pcm_uframes_t offset, frames;
+- snd_pcm_sframes_t avail;
+- const snd_pcm_channel_area_t *chan_areas = areas;
++ int err;
++ snd_pcm_uframes_t frames;
+
+ while (output_size > 0) {
+- avail = snd_pcm_avail_update(pcm);
+- if (avail == -EPIPE) {
+- if (snd_pcm_state(pcm) == SND_PCM_STATE_XRUN) {
+- if ((err = snd_pcm_prepare(pcm)) < 0)
+- printf("snd_pcm_prepare() failed.\n");
+- alsa_first_time = 1;
+- }
+- } else if (avail < 0) {
+- printf("snd_pcm_avail_update() failed: %s\n", snd_strerror(-avail));
+- avail = 0;
+- }
+- if (avail < alsa_period_size) {
+- usleep(500);
+- continue;
+- }
+ frames = snd_pcm_bytes_to_frames(pcm, output_size);
+- if ((err = snd_pcm_mmap_begin(pcm, &chan_areas, &offset, &frames)) < 0) {
+- printf("snd_pcm_mmap_begin() failed: %s\n", snd_strerror(-err));
+- }
+- cnt = snd_pcm_frames_to_bytes(pcm, frames);
+- memcpy((char*) chan_areas[0].addr + snd_pcm_frames_to_bytes(pcm, offset), output_data, cnt);
+- if ((err = snd_pcm_mmap_commit(pcm, offset, frames)) < 0) {
++ if ((err = snd_pcm_writei(pcm, output_data, frames)) < 0) {
+ if (snd_pcm_state(pcm) == SND_PCM_STATE_XRUN) {
+ if ((err = snd_pcm_prepare(pcm)) < 0)
+ printf("snd_pcm_prepare() failed.\n");
+ alsa_first_time = 1;
++ continue;
+ }
++ return err;
+ }
+- if (err != frames)
+- printf("snd_pcm_mmap_commit returned %d, expected %d\n", err, (int)frames);
+
+- output_size -= cnt;
+- output_data += cnt;
++ output_size -= snd_pcm_frames_to_bytes(pcm, err);
++ output_data += snd_pcm_frames_to_bytes(pcm, err);
+ if (alsa_first_time) {
+ alsa_first_time = 0;
+ snd_pcm_start(pcm);
+@@ -591,8 +529,6 @@ write_alsa_output (char * output_data, i
+ void
+ close_alsa_output ( void ) {
+ snd_pcm_close (pcm);
+- free(areas);
+- free(buffer);
+ }
+
+ #else
More information about the Lunar-commits
mailing list