changeset 2284:d19b53359b24

cleaned up the sndfile wav plugin, currently limiting it ONLY TO WAV PLAYBACK. if somebody is more experienced with it and wants to restore the other formats, go ahead (maybe change the name of the plugin too?).
author mf0102 <0102@gmx.at>
date Wed, 09 Jan 2008 15:41:22 +0100
parents cd57c9fe416e
children 72f340bb5ea3
files src/wav/wav-sndfile.c src/wav/wav-sndfile.h
diffstat 2 files changed, 375 insertions(+), 390 deletions(-) [+]
line wrap: on
line diff
--- a/src/wav/wav-sndfile.c	Thu Jan 03 15:48:50 2008 +0100
+++ b/src/wav/wav-sndfile.c	Wed Jan 09 15:41:22 2008 +0100
@@ -43,339 +43,327 @@
 
 #include <sndfile.h>
 
-static	SNDFILE *sndfile = NULL;
-static	SF_INFO sfinfo;
+static SNDFILE *sndfile = NULL;
+static SF_INFO sfinfo;
 
-static	int 	song_length;
-static	int 	bit_rate = 0;
-static	glong 	seek_time = -1;
+static int song_length;
+static int bit_rate = 0;
+static glong seek_time = -1;
 
 static GThread *decode_thread;
 static GMutex *decode_mutex;
 static GCond *decode_cond;
 
-InputPlugin wav_ip = {
-    .init = plugin_init,
-    .about = wav_about,
-    .is_our_file = is_our_file,
-    .play_file = play_start,
-    .stop = play_stop,
-    .pause = play_pause,
-    .seek = file_seek,
-    .cleanup = plugin_cleanup,
-    .get_song_info = get_song_info,
-    .get_song_tuple = get_song_tuple,
-    .mseek = file_mseek,
-};
+
+
+static void
+plugin_init (void)
+{
+    seek_time = -1;
+
+    decode_mutex = g_mutex_new();
+    decode_cond = g_cond_new();
+}
+
+static void
+plugin_cleanup (void)
+{
+    g_cond_free(decode_cond);
+    g_mutex_free(decode_mutex);
+}
 
 static int
 get_song_length (char *filename)
 {
-	SNDFILE	*tmp_sndfile;
-	SF_INFO tmp_sfinfo;
-	gchar *realfn = NULL;
+    SNDFILE *tmp_sndfile;
+    SF_INFO tmp_sfinfo;
+    gchar *realfn = NULL;
 
-	realfn = g_filename_from_uri(filename, NULL, NULL);
-	tmp_sndfile = sf_open (realfn ? realfn : filename, SFM_READ, &tmp_sfinfo);
-	g_free(realfn); realfn = NULL;
+    realfn = g_filename_from_uri(filename, NULL, NULL);
+    tmp_sndfile = sf_open (realfn ? realfn : filename, SFM_READ, &tmp_sfinfo);
+    g_free(realfn); realfn = NULL;
 
-	if (!tmp_sndfile) {
-		return 0;
-	}
+    if (!tmp_sndfile) {
+        return 0;
+    }
 
-	sf_close (tmp_sndfile);
-	tmp_sndfile = NULL;
+    sf_close (tmp_sndfile);
+    tmp_sndfile = NULL;
 
-	if (tmp_sfinfo.samplerate <= 0)
-		return 0;
+    if (tmp_sfinfo.samplerate <= 0)
+        return 0;
 
-	return (int) ceil (1000.0 * tmp_sfinfo.frames / tmp_sfinfo.samplerate);
+    return (int) ceil (1000.0 * tmp_sfinfo.frames / tmp_sfinfo.samplerate);
 }
 
 static void
 fill_song_tuple (char *filename, Tuple *ti)
 {
-	SNDFILE	*tmp_sndfile;
-	SF_INFO tmp_sfinfo;
-	unsigned int lossy = 0;
-	gchar *realfn = NULL, *codec = NULL, *format, *subformat = NULL;
-	GString *codec_gs = NULL;
+    SNDFILE *tmp_sndfile;
+    SF_INFO tmp_sfinfo;
+    unsigned int lossy = 0;
+    gchar *realfn = NULL, *codec = NULL, *format, *subformat = NULL;
+    GString *codec_gs = NULL;
 
-	realfn = g_filename_from_uri(filename, NULL, NULL);
-	tmp_sndfile = sf_open (realfn ? realfn : filename, SFM_READ, &tmp_sfinfo);
-	if ( sf_get_string(tmp_sndfile, SF_STR_TITLE) == NULL)
-		aud_tuple_associate_string(ti, FIELD_TITLE, NULL, g_path_get_basename(realfn ? realfn : filename));
-	else
-		aud_tuple_associate_string(ti, FIELD_TITLE, NULL, sf_get_string(tmp_sndfile, SF_STR_TITLE));
+    realfn = g_filename_from_uri(filename, NULL, NULL);
+    tmp_sndfile = sf_open (realfn ? realfn : filename, SFM_READ, &tmp_sfinfo);
+    if ( sf_get_string(tmp_sndfile, SF_STR_TITLE) == NULL)
+        aud_tuple_associate_string(ti, FIELD_TITLE, NULL, g_path_get_basename(realfn ? realfn : filename));
+    else
+        aud_tuple_associate_string(ti, FIELD_TITLE, NULL, sf_get_string(tmp_sndfile, SF_STR_TITLE));
 
-	aud_tuple_associate_string(ti, FIELD_ARTIST, NULL, sf_get_string(tmp_sndfile, SF_STR_ARTIST));
-	aud_tuple_associate_string(ti, FIELD_COMMENT, NULL, sf_get_string(tmp_sndfile, SF_STR_COMMENT));
-	aud_tuple_associate_string(ti, FIELD_DATE, NULL, sf_get_string(tmp_sndfile, SF_STR_DATE));
-	aud_tuple_associate_string(ti, -1, "software", sf_get_string(tmp_sndfile, SF_STR_SOFTWARE));
+    aud_tuple_associate_string(ti, FIELD_ARTIST, NULL, sf_get_string(tmp_sndfile, SF_STR_ARTIST));
+    aud_tuple_associate_string(ti, FIELD_COMMENT, NULL, sf_get_string(tmp_sndfile, SF_STR_COMMENT));
+    aud_tuple_associate_string(ti, FIELD_DATE, NULL, sf_get_string(tmp_sndfile, SF_STR_DATE));
+    aud_tuple_associate_string(ti, -1, "software", sf_get_string(tmp_sndfile, SF_STR_SOFTWARE));
 
-	g_free(realfn); realfn = NULL;
+    g_free(realfn); realfn = NULL;
 
-	if (!tmp_sndfile)
-		return;
+    if (!tmp_sndfile)
+        return;
 
-	sf_close (tmp_sndfile);
-	tmp_sndfile = NULL;
+    sf_close (tmp_sndfile);
+    tmp_sndfile = NULL;
 
-	if (tmp_sfinfo.samplerate > 0)
-		aud_tuple_associate_int(ti, FIELD_LENGTH, NULL, (int) ceil (1000.0 * tmp_sfinfo.frames / tmp_sfinfo.samplerate));
+    if (tmp_sfinfo.samplerate > 0)
+        aud_tuple_associate_int(ti, FIELD_LENGTH, NULL, (int) ceil (1000.0 * tmp_sfinfo.frames / tmp_sfinfo.samplerate));
 
-	switch (tmp_sfinfo.format & SF_FORMAT_TYPEMASK)
-	{
-		case SF_FORMAT_WAV:
-		case SF_FORMAT_WAVEX:
-			format = "Microsoft WAV";
-			break;
-		case SF_FORMAT_AIFF:
-			format = "Apple/SGI AIFF";
-			break;
-		case SF_FORMAT_AU:
-			format = "Sun/NeXT AU";
-			break;
-		case SF_FORMAT_RAW:
-			format = "Raw PCM data";
-			break;
-		case SF_FORMAT_PAF:
-			format = "Ensoniq PARIS";
-			break;
-		case SF_FORMAT_SVX:
-			format = "Amiga IFF / SVX8 / SV16";
-			break;
-		case SF_FORMAT_NIST:
-			format = "Sphere NIST";
-			break;
-		case SF_FORMAT_VOC:
-			format = "Creative VOC";
-			break;
-		case SF_FORMAT_IRCAM:
-			format = "Berkeley/IRCAM/CARL";
-			break;
-		case SF_FORMAT_W64:
-			format = "Sonic Foundry's 64 bit RIFF/WAV";
-			break;
-		case SF_FORMAT_MAT4:
-			format = "Matlab (tm) V4.2 / GNU Octave 2.0";
-			break;
-		case SF_FORMAT_MAT5:
-			format = "Matlab (tm) V5.0 / GNU Octave 2.1";
-			break;
-		case SF_FORMAT_PVF:
-			format = "Portable Voice Format";
-			break;
-		case SF_FORMAT_XI:
-			format = "Fasttracker 2 Extended Instrument";
-			break;
-		case SF_FORMAT_HTK:
-			format = "HMM Tool Kit";
-			break;
-		case SF_FORMAT_SDS:
-			format = "Midi Sample Dump Standard";
-			break;
-		case SF_FORMAT_AVR:
-			format = "Audio Visual Research";
-			break;
-		case SF_FORMAT_SD2:
-			format = "Sound Designer 2";
-			break;
-		case SF_FORMAT_FLAC:
-			format = "Free Lossless Audio Codec";
-			break;
-		case SF_FORMAT_CAF:
-			format = "Core Audio File";
-			break;
-		default:
-			format = "unknown sndfile";
-	}
-	switch (tmp_sfinfo.format & SF_FORMAT_SUBMASK)
-	{
-		case SF_FORMAT_PCM_S8:
-			subformat = "signed 8 bit";
-			break;
-		case SF_FORMAT_PCM_16:
-			subformat = "signed 16 bit";
-			break;
-		case SF_FORMAT_PCM_24:
-			subformat = "signed 24 bit";
-			break;
-		case SF_FORMAT_PCM_32:
-			subformat = "signed 32 bit";
-			break;
-		case SF_FORMAT_PCM_U8:
-			subformat = "unsigned 8 bit";
-			break;
-		case SF_FORMAT_FLOAT:
-			subformat = "32 bit float";
-			break;
-		case SF_FORMAT_DOUBLE:
-			subformat = "64 bit float";
-			break;
-		case SF_FORMAT_ULAW:
-			subformat = "U-Law";
-			lossy = 1;
-			break;
-		case SF_FORMAT_ALAW:
-			subformat = "A-Law";
-			lossy = 1;
-			break;
-		case SF_FORMAT_IMA_ADPCM:
-			subformat = "IMA ADPCM";
-			lossy = 1;
-			break;
-		case SF_FORMAT_MS_ADPCM:
-			subformat = "MS ADPCM";
-			lossy = 1;
-			break;
-		case SF_FORMAT_GSM610:
-			subformat = "GSM 6.10";
-			lossy = 1;
-			break;
-		case SF_FORMAT_VOX_ADPCM:
-			subformat = "Oki Dialogic ADPCM";
-			lossy = 1;
-			break;
-		case SF_FORMAT_G721_32:
-			subformat = "32kbs G721 ADPCM";
-			lossy = 1;
-			break;
-		case SF_FORMAT_G723_24:
-			subformat = "24kbs G723 ADPCM";
-			lossy = 1;
-			break;
-		case SF_FORMAT_G723_40:
-			subformat = "40kbs G723 ADPCM";
-			lossy = 1;
-			break;
-		case SF_FORMAT_DWVW_12:
-			subformat = "12 bit Delta Width Variable Word";
-			lossy = 1;
-			break;
-		case SF_FORMAT_DWVW_16:
-			subformat = "16 bit Delta Width Variable Word";
-			lossy = 1;
-			break;
-		case SF_FORMAT_DWVW_24:
-			subformat = "24 bit Delta Width Variable Word";
-			lossy = 1;
-			break;
-		case SF_FORMAT_DWVW_N:
-			subformat = "N bit Delta Width Variable Word";
-			lossy = 1;
-			break;
-		case SF_FORMAT_DPCM_8:
-			subformat = "8 bit differential PCM";
-			break;
-		case SF_FORMAT_DPCM_16:
-			subformat = "16 bit differential PCM";
-	}
+    switch (tmp_sfinfo.format & SF_FORMAT_TYPEMASK)
+    {
+        case SF_FORMAT_WAV:
+        case SF_FORMAT_WAVEX:
+            format = "Microsoft WAV";
+            break;
+        case SF_FORMAT_AIFF:
+            format = "Apple/SGI AIFF";
+            break;
+        case SF_FORMAT_AU:
+            format = "Sun/NeXT AU";
+            break;
+        case SF_FORMAT_RAW:
+            format = "Raw PCM data";
+            break;
+        case SF_FORMAT_PAF:
+            format = "Ensoniq PARIS";
+            break;
+        case SF_FORMAT_SVX:
+            format = "Amiga IFF / SVX8 / SV16";
+            break;
+        case SF_FORMAT_NIST:
+            format = "Sphere NIST";
+            break;
+        case SF_FORMAT_VOC:
+            format = "Creative VOC";
+            break;
+        case SF_FORMAT_IRCAM:
+            format = "Berkeley/IRCAM/CARL";
+            break;
+        case SF_FORMAT_W64:
+            format = "Sonic Foundry's 64 bit RIFF/WAV";
+            break;
+        case SF_FORMAT_MAT4:
+            format = "Matlab (tm) V4.2 / GNU Octave 2.0";
+            break;
+        case SF_FORMAT_MAT5:
+            format = "Matlab (tm) V5.0 / GNU Octave 2.1";
+            break;
+        case SF_FORMAT_PVF:
+            format = "Portable Voice Format";
+            break;
+        case SF_FORMAT_XI:
+            format = "Fasttracker 2 Extended Instrument";
+            break;
+        case SF_FORMAT_HTK:
+            format = "HMM Tool Kit";
+            break;
+        case SF_FORMAT_SDS:
+            format = "Midi Sample Dump Standard";
+            break;
+        case SF_FORMAT_AVR:
+            format = "Audio Visual Research";
+            break;
+        case SF_FORMAT_SD2:
+            format = "Sound Designer 2";
+            break;
+        case SF_FORMAT_FLAC:
+            format = "Free Lossless Audio Codec";
+            break;
+        case SF_FORMAT_CAF:
+            format = "Core Audio File";
+            break;
+        default:
+            format = "unknown sndfile";
+    }
+    switch (tmp_sfinfo.format & SF_FORMAT_SUBMASK)
+    {
+        case SF_FORMAT_PCM_S8:
+            subformat = "signed 8 bit";
+            break;
+        case SF_FORMAT_PCM_16:
+            subformat = "signed 16 bit";
+            break;
+        case SF_FORMAT_PCM_24:
+            subformat = "signed 24 bit";
+            break;
+        case SF_FORMAT_PCM_32:
+            subformat = "signed 32 bit";
+            break;
+        case SF_FORMAT_PCM_U8:
+            subformat = "unsigned 8 bit";
+            break;
+        case SF_FORMAT_FLOAT:
+            subformat = "32 bit float";
+            break;
+        case SF_FORMAT_DOUBLE:
+            subformat = "64 bit float";
+            break;
+        case SF_FORMAT_ULAW:
+            subformat = "U-Law";
+            lossy = 1;
+            break;
+        case SF_FORMAT_ALAW:
+            subformat = "A-Law";
+            lossy = 1;
+            break;
+        case SF_FORMAT_IMA_ADPCM:
+            subformat = "IMA ADPCM";
+            lossy = 1;
+            break;
+        case SF_FORMAT_MS_ADPCM:
+            subformat = "MS ADPCM";
+            lossy = 1;
+            break;
+        case SF_FORMAT_GSM610:
+            subformat = "GSM 6.10";
+            lossy = 1;
+            break;
+        case SF_FORMAT_VOX_ADPCM:
+            subformat = "Oki Dialogic ADPCM";
+            lossy = 1;
+            break;
+        case SF_FORMAT_G721_32:
+            subformat = "32kbs G721 ADPCM";
+            lossy = 1;
+            break;
+        case SF_FORMAT_G723_24:
+            subformat = "24kbs G723 ADPCM";
+            lossy = 1;
+            break;
+        case SF_FORMAT_G723_40:
+            subformat = "40kbs G723 ADPCM";
+            lossy = 1;
+            break;
+        case SF_FORMAT_DWVW_12:
+            subformat = "12 bit Delta Width Variable Word";
+            lossy = 1;
+            break;
+        case SF_FORMAT_DWVW_16:
+            subformat = "16 bit Delta Width Variable Word";
+            lossy = 1;
+            break;
+        case SF_FORMAT_DWVW_24:
+            subformat = "24 bit Delta Width Variable Word";
+            lossy = 1;
+            break;
+        case SF_FORMAT_DWVW_N:
+            subformat = "N bit Delta Width Variable Word";
+            lossy = 1;
+            break;
+        case SF_FORMAT_DPCM_8:
+            subformat = "8 bit differential PCM";
+            break;
+        case SF_FORMAT_DPCM_16:
+            subformat = "16 bit differential PCM";
+    }
 
-	codec_gs = g_string_new("");
-	if (subformat != NULL)
-		g_string_append_printf(codec_gs, "%s (%s)", format, subformat);
-	else
-		g_string_append_printf(codec_gs, "%s", format);
-	codec = g_strdup(codec_gs->str);
-	g_string_free(codec_gs, TRUE);
-	aud_tuple_associate_string(ti, FIELD_CODEC, NULL, codec);
+    codec_gs = g_string_new("");
+    if (subformat != NULL)
+        g_string_append_printf(codec_gs, "%s (%s)", format, subformat);
+    else
+        g_string_append_printf(codec_gs, "%s", format);
+    codec = g_strdup(codec_gs->str);
+    g_string_free(codec_gs, TRUE);
+    aud_tuple_associate_string(ti, FIELD_CODEC, NULL, codec);
 
-	if (lossy != 0)
-		aud_tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossy");
-	else
-		aud_tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossless");
+    if (lossy != 0)
+        aud_tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossy");
+    else
+        aud_tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossless");
 }
 
 static gchar *get_title(char *filename)
 {
-	Tuple *tuple;
-	gchar *title;
-
-	tuple = aud_tuple_new_from_filename(filename);
-	fill_song_tuple(filename, tuple);
-	title = aud_tuple_formatter_make_title_string(tuple, aud_get_gentitle_format());
-	if (*title == '\0')
-	{
-		g_free(title);
-		title = g_strdup(aud_tuple_get_string(tuple, FIELD_FILE_NAME, NULL));
-	}
+    Tuple *tuple;
+    gchar *title;
 
-	aud_tuple_free(tuple);
-	return title;
-}
-
-static void
-plugin_init (void)
-{
-	seek_time = -1;
+    tuple = aud_tuple_new_from_filename(filename);
+    fill_song_tuple(filename, tuple);
+    title = aud_tuple_formatter_make_title_string(tuple, aud_get_gentitle_format());
+    if (*title == '\0')
+    {
+        g_free(title);
+        title = g_strdup(aud_tuple_get_string(tuple, FIELD_FILE_NAME, NULL));
+    }
 
-	decode_mutex = g_mutex_new();
-	decode_cond = g_cond_new();
-}
-
-static void
-plugin_cleanup (void)
-{
-	g_cond_free(decode_cond);
-	g_mutex_free(decode_mutex);
+    aud_tuple_free(tuple);
+    return title;
 }
 
 static int
 is_our_file (char *filename)
 {
-	SNDFILE	*tmp_sndfile;
-	SF_INFO tmp_sfinfo;
-	gchar *realfn = NULL; 
+    SNDFILE *tmp_sndfile;
+    SF_INFO tmp_sfinfo;
+    gchar *realfn = NULL; 
 
-	realfn = g_filename_from_uri(filename, NULL, NULL);
+    realfn = g_filename_from_uri(filename, NULL, NULL);
 
-	/* Have to open the file to see if libsndfile can handle it. */
-	tmp_sndfile = sf_open (realfn ? realfn : filename, SFM_READ, &tmp_sfinfo);
-	g_free(realfn); realfn = NULL;
+    /* Have to open the file to see if libsndfile can handle it. */
+    tmp_sndfile = sf_open (realfn ? realfn : filename, SFM_READ, &tmp_sfinfo);
+    g_free(realfn); realfn = NULL;
 
-	if (!tmp_sndfile) {
-		return FALSE;
-	}
+    if (!tmp_sndfile) {
+        return FALSE;
+    }
 
-	/* It can so close file and return TRUE. */
-	sf_close (tmp_sndfile);
-	tmp_sndfile = NULL;
+    /* It can so close file and return TRUE. */
+    sf_close (tmp_sndfile);
+    tmp_sndfile = NULL;
 
-	return TRUE;
+    return TRUE;
 }
 
 static gpointer
 play_loop (gpointer arg)
 {
-	static short buffer [BUFFER_SIZE];
-	int samples;
-	InputPlayback *playback = arg;
+    static short buffer [BUFFER_SIZE];
+    int samples;
+    InputPlayback *playback = arg;
 
-	for (;;)
- 	{
-		GTimeVal sleeptime;
+    for (;;)
+    {
+        GTimeVal sleeptime;
 
-		/* sf_read_short will return 0 for all reads at EOF. */
-		samples = sf_read_short (sndfile, buffer, BUFFER_SIZE);
+        /* sf_read_short will return 0 for all reads at EOF. */
+        samples = sf_read_short (sndfile, buffer, BUFFER_SIZE);
 
-		if (samples > 0 && playback->playing == TRUE) {
-			while ((playback->output->buffer_free () < samples) &&
+        if (samples > 0 && playback->playing == TRUE) {
+            while ((playback->output->buffer_free () < samples) &&
                    playback->playing == TRUE) {
                 g_get_current_time(&sleeptime);
                 g_time_val_add(&sleeptime, 500000);
                 g_mutex_lock(decode_mutex);
-				g_cond_timed_wait(decode_cond, decode_mutex, &sleeptime);
+                g_cond_timed_wait(decode_cond, decode_mutex, &sleeptime);
                 g_mutex_unlock(decode_mutex);
 
-				if (playback->playing == FALSE)
-					break;	
-			}
+                if (playback->playing == FALSE)
+                    break;
+            }
 
-			playback->pass_audio(playback, FMT_S16_NE, sfinfo.channels, 
-				samples * sizeof (short), buffer, &playback->playing);
-		}
-		else {
+            playback->pass_audio(playback, FMT_S16_NE, sfinfo.channels, 
+                                 samples * sizeof (short), buffer, &playback->playing);
+        }
+        else {
             while(playback->output->buffer_playing()) {
                 g_get_current_time(&sleeptime);
                 g_time_val_add(&sleeptime, 500000);
@@ -387,175 +375,182 @@
                     break;
             }
 
-			playback->eof = TRUE;
-			playback->playing = FALSE;
+            playback->eof = TRUE;
+            playback->playing = FALSE;
 
-			g_mutex_unlock(decode_mutex);
-			break;	
-		}
+            g_mutex_unlock(decode_mutex);
+            break;
+        }
 
-		/* Do seek if seek_time is valid. */
-		if (seek_time >= 0) {
-			sf_seek (sndfile, (sf_count_t)((gint64)seek_time * (gint64)sfinfo.samplerate / 1000L),
+        /* Do seek if seek_time is valid. */
+        if (seek_time >= 0) {
+            sf_seek (sndfile, (sf_count_t)((gint64)seek_time * (gint64)sfinfo.samplerate / 1000L),
                      SEEK_SET);
-			playback->output->flush (seek_time);
-			seek_time = -1;
-   		}
+            playback->output->flush (seek_time);
+            seek_time = -1;
+        }
 
-		if (playback->playing == FALSE)
-			break;	
-	}
+        if (playback->playing == FALSE)
+            break;
+    }
 
-	sf_close (sndfile);
-	sndfile = NULL;
-	seek_time = -1;
+    sf_close (sndfile);
+    sndfile = NULL;
+    seek_time = -1;
 
-	playback->output->close_audio();
+    playback->output->close_audio();
 
-	return NULL;
+    return NULL;
 }
 
 static void
 play_start (InputPlayback *playback)
 {
-	gchar *realfn = NULL;
-	int pcmbitwidth;
-	gchar *song_title;
+    gchar *realfn = NULL;
+    int pcmbitwidth;
+    gchar *song_title;
 
-	if (sndfile) /* already opened */
-		return;
+    if (sndfile) /* already opened */
+        return;
 
-	pcmbitwidth = 32;
-	song_title = get_title(playback->filename);
+    pcmbitwidth = 32;
+    song_title = get_title(playback->filename);
 
-	realfn = g_filename_from_uri(playback->filename, NULL, NULL);
-	sndfile = sf_open (realfn ? realfn : playback->filename, SFM_READ, &sfinfo);
-	g_free(realfn); realfn = NULL;
+    realfn = g_filename_from_uri(playback->filename, NULL, NULL);
+    sndfile = sf_open (realfn ? realfn : playback->filename, SFM_READ, &sfinfo);
+    g_free(realfn); realfn = NULL;
 
-	if (!sndfile)
-		return;
+    if (!sndfile)
+        return;
 
-	bit_rate = sfinfo.samplerate * pcmbitwidth;
+    bit_rate = sfinfo.samplerate * pcmbitwidth;
 
-	if (sfinfo.samplerate > 0)
-		song_length = (int) ceil (1000.0 * sfinfo.frames / sfinfo.samplerate);
-	else
-		song_length = 0;
+    if (sfinfo.samplerate > 0)
+        song_length = (int) ceil (1000.0 * sfinfo.frames / sfinfo.samplerate);
+    else
+        song_length = 0;
 
-	if (! playback->output->open_audio (FMT_S16_NE, sfinfo.samplerate, sfinfo.channels))
-	{
-		sf_close (sndfile);
-		sndfile = NULL;
-		return;
-	}
+    if (! playback->output->open_audio (FMT_S16_NE, sfinfo.samplerate, sfinfo.channels))
+    {
+        sf_close (sndfile);
+        sndfile = NULL;
+        return;
+    }
 
-	playback->set_params(playback, song_title, song_length, bit_rate, sfinfo.samplerate, sfinfo.channels);
-	g_free (song_title);
+    playback->set_params(playback, song_title, song_length, bit_rate, sfinfo.samplerate, sfinfo.channels);
+    g_free (song_title);
 
-	playback->playing = TRUE;
+    playback->playing = TRUE;
 
-	decode_thread = g_thread_self();
-	playback->set_pb_ready(playback);
-	play_loop(playback);
+    decode_thread = g_thread_self();
+    playback->set_pb_ready(playback);
+    play_loop(playback);
 }
 
 static void
 play_pause (InputPlayback *playback, gshort p)
 {
-	playback->output->pause(p);
+    playback->output->pause(p);
 }
 
 static void
 play_stop (InputPlayback *playback)
 {
-	if (decode_thread == NULL)
-		return;
+    if (decode_thread == NULL)
+        return;
 
-	g_mutex_lock(decode_mutex);
-	playback->playing = FALSE;
-	g_mutex_unlock(decode_mutex);
-	g_cond_signal(decode_cond);
+    g_mutex_lock(decode_mutex);
+    playback->playing = FALSE;
+    g_mutex_unlock(decode_mutex);
+    g_cond_signal(decode_cond);
 
-	g_thread_join (decode_thread);
+    g_thread_join (decode_thread);
 
-	sndfile = NULL;
-	decode_thread = NULL;
-	seek_time = -1;
+    sndfile = NULL;
+    decode_thread = NULL;
+    seek_time = -1;
 }
 
 static void
 file_mseek (InputPlayback *playback, gulong millisecond)
 {
-	if (! sfinfo.seekable)
-		return;
+    if (! sfinfo.seekable)
+        return;
 
-	seek_time = (glong)millisecond;
+    seek_time = (glong)millisecond;
 
-	while (seek_time != -1)
-		g_usleep (80000);
+    while (seek_time != -1)
+        g_usleep (80000);
 }
 
 static void
 file_seek (InputPlayback *playback, gint time)
 {
-	gulong millisecond = time * 1000;
-	file_mseek(playback, millisecond);
+    gulong millisecond = time * 1000;
+    file_mseek(playback, millisecond);
 }
 
 static void
 get_song_info (gchar *filename, gchar **title, gint *length)
 {
-	(*length) = get_song_length(filename);
-	(*title) = get_title(filename);
+    (*length) = get_song_length(filename);
+    (*title) = get_title(filename);
 }
 
 static Tuple*
 get_song_tuple (gchar *filename)
 {
-	Tuple *ti = aud_tuple_new_from_filename(filename);
-	fill_song_tuple(filename, ti);
-	return ti;
+    Tuple *ti = aud_tuple_new_from_filename(filename);
+    fill_song_tuple(filename, ti);
+    return ti;
 }
 
 static void wav_about(void)
 {
-	static GtkWidget *box;
-	if (!box)
-	{
-        	box = audacious_info_dialog(
-			_("About sndfile WAV support"),
-			_("Adapted for Audacious usage by Tony Vroon <chainsaw@gentoo.org>\n"
-			  "from the xmms_sndfile plugin which is:\n"
-			  "Copyright (C) 2000, 2002 Erik de Castro Lopo\n\n"
-			  "This program is free software ; you can redistribute it and/or modify \n"
-			  "it under the terms of the GNU General Public License as published by \n"
-			  "the Free Software Foundation ; either version 2 of the License, or \n"
-			  "(at your option) any later version. \n \n"
-			  "This program is distributed in the hope that it will be useful, \n"
-			  "but WITHOUT ANY WARRANTY ; without even the implied warranty of \n"
-			  "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  \n"
-			  "See the GNU General Public License for more details. \n\n"
-			  "You should have received a copy of the GNU General Public \n"
-			  "License along with this program ; if not, write to \n"
-			  "the Free Software Foundation, Inc., \n"
-			  "51 Franklin Street, Fifth Floor, \n"
-			  "Boston, MA  02110-1301  USA"),
-			_("Ok"), FALSE, NULL, NULL);
-		g_signal_connect(G_OBJECT(box), "destroy",
-			(GCallback)gtk_widget_destroyed, &box);
-	}
+    static GtkWidget *box;
+    if (!box)
+    {
+        box = audacious_info_dialog(_("About sndfile WAV support"),
+                                    _("Adapted for Audacious usage by Tony Vroon <chainsaw@gentoo.org>\n"
+                                      "from the xmms_sndfile plugin which is:\n"
+                                      "Copyright (C) 2000, 2002 Erik de Castro Lopo\n\n"
+                                      "This program is free software ; you can redistribute it and/or modify \n"
+                                      "it under the terms of the GNU General Public License as published by \n"
+                                      "the Free Software Foundation ; either version 2 of the License, or \n"
+                                      "(at your option) any later version. \n \n"
+                                      "This program is distributed in the hope that it will be useful, \n"
+                                      "but WITHOUT ANY WARRANTY ; without even the implied warranty of \n"
+                                      "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  \n"
+                                      "See the GNU General Public License for more details. \n\n"
+                                      "You should have received a copy of the GNU General Public \n"
+                                      "License along with this program ; if not, write to \n"
+                                      "the Free Software Foundation, Inc., \n"
+                                      "51 Franklin Street, Fifth Floor, \n"
+                                      "Boston, MA  02110-1301  USA"),
+                                    _("Ok"), FALSE, NULL, NULL);
+        g_signal_connect(G_OBJECT(box), "destroy",
+                         (GCallback)gtk_widget_destroyed, &box);
+    }
 }
 
-void init(void)
-{
-        wav_ip.description = g_strdup_printf(_("sndfile WAV plugin"));
-}
+static gchar *fmts[] = { "wav", NULL };
 
-void fini(void)
-{
-	g_free(wav_ip.description);
-}
+InputPlugin wav_ip = {
+    .description = "sndfile WAV plugin",
+    .init = plugin_init,
+    .about = wav_about,
+    .is_our_file = is_our_file,
+    .play_file = play_start,
+    .stop = play_stop,
+    .pause = play_pause,
+    .seek = file_seek,
+    .cleanup = plugin_cleanup,
+    .get_song_info = get_song_info,
+    .get_song_tuple = get_song_tuple,
+    .vfs_extensions = fmts,
+    .mseek = file_mseek,
+};
 
 InputPlugin *wav_iplist[] = { &wav_ip, NULL };
 
-DECLARE_PLUGIN(wav-sndfile, init, fini, wav_iplist, NULL, NULL, NULL, NULL, NULL)
+SIMPLE_INPUT_PLUGIN(wav-sndfile, wav_iplist)
--- a/src/wav/wav-sndfile.h	Thu Jan 03 15:48:50 2008 +0100
+++ b/src/wav/wav-sndfile.h	Wed Jan 09 15:41:22 2008 +0100
@@ -22,18 +22,8 @@
 #ifndef WAV_SNDFILE_H
 #define WAV_SNDFILE_H
 
-#define BUFFER_SIZE 			8192
+#define BUFFER_SIZE 8192
 
-static	void 	plugin_init (void);
-static	void 	plugin_cleanup (void);
-static	int	is_our_file (char *filename);
-static	void 	play_start (InputPlayback *playback);
-static	void 	play_stop (InputPlayback *playback);
-static	void 	file_seek (InputPlayback *playback, gint time);
-static	void 	get_song_info (gchar *filename, gchar **title, gint *length);
-static	Tuple*  get_song_tuple (gchar *filename);
-static  void    wav_about (void);
-static	void	play_pause (InputPlayback *playback, gshort p);
-static  void file_mseek (InputPlayback *playback, gulong millisecond);
+extern InputPlugin wav_ip;
 
 #endif