changeset 2285:72f340bb5ea3

automated branch merge
author mf0102 <0102@gmx.at>
date Wed, 09 Jan 2008 15:41:59 +0100
parents d19b53359b24 (diff) 689bdfacb10c (current diff)
children 4f84615468b7
files
diffstat 2 files changed, 375 insertions(+), 390 deletions(-) [+]
line wrap: on
line diff
--- a/src/wav/wav-sndfile.c	Fri Jan 04 16:47:32 2008 -0600
+++ b/src/wav/wav-sndfile.c	Wed Jan 09 15:41:59 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	Fri Jan 04 16:47:32 2008 -0600
+++ b/src/wav/wav-sndfile.h	Wed Jan 09 15:41:59 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