shithub: sox

Download patch

ref: fdc0a5eee1370b1d757bcf4753d619467d124705
parent: 7ef285353e8a75f0709962e31f00bfc2dc1e88e6
author: cbagwell <cbagwell>
date: Sun May 14 23:15:26 EDT 2006

Changed way handler prototypes are exported.

--- a/src/8svx.c
+++ b/src/8svx.c
@@ -389,3 +389,22 @@
         st_writes(ft, "BODY");
         st_writedw(ft, nsamples); /* samples in file */
 }
+
+/* Amiga 8SVX */
+static char *svxnames[] = {
+  "8svx",
+  NULL
+};
+
+st_format_t st_svx_format = {
+  svxnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_svxstartread,
+  st_svxread,
+  st_svxstopread,
+  st_svxstartwrite,
+  st_svxwrite,
+  st_svxstopwrite,
+  st_format_nothing_seek
+};
--- a/src/aiff.c
+++ b/src/aiff.c
@@ -1100,3 +1100,23 @@
     else
         return f;
 }
+
+
+static char *aiffnames[] = {
+  "aiff",
+  "aif",
+  NULL
+};
+
+st_format_t st_aiff_format = {
+  aiffnames,
+  NULL,
+  ST_FILE_STEREO | ST_FILE_LOOPS | ST_FILE_SEEK,
+  st_aiffstartread,
+  st_aiffread,
+  st_aiffstopread,
+  st_aiffstartwrite,
+  st_aiffwrite,
+  st_aiffstopwrite,
+  st_aiffseek
+};
--- a/src/alsa.c
+++ b/src/alsa.c
@@ -631,4 +631,22 @@
     return 0;
 }
 
+/* /dev/snd/pcmXX */
+static char *alsanames[] = {
+  "alsa",
+  NULL
+};
+
+st_format_t st_alsa_format = {
+   alsanames,
+   NULL,
+   ST_FILE_STEREO | ST_FILE_NOSTDIO,
+   st_alsastartread,
+   st_alsaread,
+   st_alsastopread,
+   st_alsastartwrite,
+   st_alsawrite,
+   st_alsastopwrite,
+   st_format_nothing_seek
+};
 #endif /* HAVE_ALSA */
--- a/src/au.c
+++ b/src/au.c
@@ -462,3 +462,22 @@
         st_writeb(ft, 0);
 }
 
+/* SPARC .au w/header */
+static char *aunames[] = {
+  "au",
+  "snd",
+  NULL
+};
+
+st_format_t st_au_format = {
+  aunames,
+  NULL,
+  ST_FILE_STEREO | ST_FILE_SEEK,
+  st_austartread,
+  st_auread,
+  st_rawstopread,
+  st_austartwrite,
+  st_auwrite,
+  st_austopwrite,
+  st_auseek
+};
--- a/src/auto.c
+++ b/src/auto.c
@@ -196,3 +196,21 @@
         st_fail_errno(ft,ST_EFMT,"Type AUTO can only be used for input!");
         return(ST_EOF);
 }
+
+static char *autonames[] = {
+  "auto",
+  NULL
+};
+
+st_format_t st_auto_format = {
+  autonames,
+  NULL,
+  ST_FILE_STEREO,
+  st_autostartread,
+  st_format_nothing_io,
+  st_format_nothing,
+  st_autostartwrite,
+  st_format_nothing_io,
+  st_format_nothing,
+  st_format_nothing_seek
+};
--- a/src/avg.c
+++ b/src/avg.c
@@ -547,3 +547,24 @@
     return (ST_SUCCESS); /* nothing to do */
 }
 
+st_effect_t st_avg_effect = {
+  "avg",
+  NULL,
+  ST_EFF_MCHAN | ST_EFF_CHAN,
+  st_avg_getopts,
+  st_avg_start,
+  st_avg_flow,
+  st_effect_nothing_drain,
+  st_avg_stop
+};
+
+st_effect_t st_pick_effect = {
+  "pick",
+  NULL,
+  ST_EFF_MCHAN | ST_EFF_CHAN,
+  st_avg_getopts,
+  st_avg_start,
+  st_avg_flow,
+  st_effect_nothing_drain,
+  st_avg_stop
+};
--- a/src/avr.c
+++ b/src/avr.c
@@ -290,3 +290,21 @@
 
   return(ST_SUCCESS);
 }
+
+static char *avrnames[] = {
+  "avr",
+  NULL
+};
+
+st_format_t st_avr_format = {
+  avrnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_avrstartread,
+  st_rawread,
+  st_format_nothing,
+  st_avrstartwrite,
+  st_avrwrite,
+  st_avrstopwrite,
+  st_format_nothing_seek
+};
--- a/src/band.c
+++ b/src/band.c
@@ -144,3 +144,13 @@
 	return (ST_SUCCESS);	/* nothing to do */
 }
 
+st_effect_t st_band_effect = {
+   "band",
+   NULL,
+   0,
+   st_band_getopts,
+   st_band_start,
+   st_band_flow,
+   st_effect_nothing_drain,
+   st_band_stop
+};
--- a/src/bandpass.c
+++ b/src/bandpass.c
@@ -76,3 +76,14 @@
   butterworth->b [1] = (c - 1.0) * butterworth->a[0];
   return (ST_SUCCESS);
 }
+
+st_effect_t st_bandpass_effect = {
+  "bandpass",
+  NULL,
+  0,
+  st_bandpass_getopts,
+  st_bandpass_start,
+  st_butterworth_flow,
+  st_effect_nothing_drain,
+  st_effect_nothing
+};
--- a/src/breject.c
+++ b/src/breject.c
@@ -76,3 +76,14 @@
   butterworth->b [1] = (1.0 - c) * butterworth->a[0];
   return (ST_SUCCESS);
 }
+
+st_effect_t st_bandreject_effect = {
+  "bandreject",
+  NULL,
+  0,
+  st_bandreject_getopts,
+  st_bandreject_start,
+  st_butterworth_flow,
+  st_effect_nothing_drain,
+  st_effect_nothing
+};
--- a/src/cdr.c
+++ b/src/cdr.c
@@ -159,3 +159,21 @@
         }
         return(ST_SUCCESS);
 }
+
+static char *cdrnames[] = {
+  "cdr",
+  NULL
+};
+
+st_format_t st_cdr_format = {
+  cdrnames,
+  NULL,
+  ST_FILE_STEREO | ST_FILE_SEEK,
+  st_cdrstartread,
+  st_cdrread,
+  st_cdrstopread,
+  st_cdrstartwrite,
+  st_cdrwrite,
+  st_cdrstopwrite,
+  st_rawseek
+};
--- a/src/chorus.c
+++ b/src/chorus.c
@@ -348,3 +348,14 @@
         }
         return (ST_SUCCESS);
 }
+
+st_effect_t st_chorus_effect = {
+  "chorus",
+  NULL,
+  0,
+  st_chorus_getopts,
+  st_chorus_start,
+  st_chorus_flow,
+  st_chorus_drain,
+  st_chorus_stop
+};
--- a/src/compand.c
+++ b/src/compand.c
@@ -409,3 +409,14 @@
 
   return (ST_SUCCESS);
 }
+
+st_effect_t st_compand_effect = {
+   "compand",
+   NULL,
+   ST_EFF_MCHAN,
+   st_compand_getopts,
+   st_compand_start,
+   st_compand_flow,
+   st_compand_drain,
+   st_compand_stop
+};
--- a/src/copy.c
+++ b/src/copy.c
@@ -63,3 +63,14 @@
 	/* nothing to do */
     return (ST_SUCCESS);
 }
+
+st_effect_t st_copy_effect = {
+  "copy",
+  NULL,
+  ST_EFF_MCHAN,
+  st_copy_getopts,
+  st_copy_start,
+  st_copy_flow,
+  st_effect_nothing_drain,
+  st_effect_nothing
+};
--- a/src/cvsd.c
+++ b/src/cvsd.c
@@ -668,3 +668,43 @@
 }
 
 /* ---------------------------------------------------------------------- */
+
+/* Cont. Variable Slope Delta */
+static char *cvsdnames[] = {
+  "cvs",
+  "cvsd",
+  NULL
+};
+
+st_format_t st_cvsd_format = {
+  cvsdnames,
+  NULL,
+  0,
+  st_cvsdstartread,
+  st_cvsdread,
+  st_cvsdstopread,
+  st_cvsdstartwrite,
+  st_cvsdwrite,
+  st_cvsdstopwrite,
+  st_format_nothing_seek
+};
+
+/* Cont. Variable Solot Delta */
+static char *dvmsnames[] = {
+  "vms",
+  "dvms",
+  NULL
+};
+
+st_format_t st_dvms_format = {
+  dvmsnames,
+  NULL,
+  0,
+  st_dvmsstartread,
+  st_cvsdread,
+  st_cvsdstopread,
+  st_dvmsstartwrite,
+  st_cvsdwrite,
+  st_dvmsstopwrite,
+  st_format_nothing_seek
+};
--- a/src/dat.c
+++ b/src/dat.c
@@ -175,3 +175,21 @@
     return done;
 }
 
+/* Text data samples */
+static char *datnames[] = {
+  "dat",
+  NULL
+};
+
+st_format_t st_dat_format = {
+  datnames,
+  NULL,
+  0,
+  st_datstartread,
+  st_datread,
+  st_format_nothing,
+  st_datstartwrite,
+  st_datwrite,
+  st_format_nothing,
+  st_format_nothing_seek
+};
--- a/src/dcshift.c
+++ b/src/dcshift.c
@@ -212,3 +212,14 @@
     }
     return ST_SUCCESS;
 }
+
+st_effect_t st_dcshift_effect = {
+   "dcshift",
+   NULL,
+   ST_EFF_MCHAN,
+   st_dcshift_getopts,
+   st_dcshift_start,
+   st_dcshift_flow,
+   st_effect_nothing_drain,
+   st_dcshift_stop
+};
--- a/src/deemphas.c
+++ b/src/deemphas.c
@@ -202,3 +202,14 @@
      /* nothing to do */
     return (ST_SUCCESS);
 }
+
+st_effect_t st_deemph_effect = {
+  "deemph",
+  NULL,
+  ST_EFF_MCHAN,
+  st_deemph_getopts,
+  st_deemph_start,
+  st_deemph_flow,
+  st_effect_nothing_drain,
+  st_deemph_stop
+};
--- a/src/earwax.c
+++ b/src/earwax.c
@@ -184,3 +184,14 @@
 
   return (ST_SUCCESS);
 }
+
+st_effect_t st_earwax_effect = {
+  "earwax",
+  NULL,
+  ST_EFF_MCHAN,
+  st_earwax_getopts,
+  st_earwax_start,
+  st_earwax_flow,
+  st_earwax_drain,
+  st_earwax_stop
+};
--- a/src/echo.c
+++ b/src/echo.c
@@ -268,3 +268,14 @@
         echo->delay_buf = (double *) -1;   /* guaranteed core dump */
         return (ST_SUCCESS);
 }
+
+st_effect_t st_echo_effect = {
+  "echo",
+  NULL,
+  0,
+  st_echo_getopts,
+  st_echo_start,
+  st_echo_flow,
+  st_echo_drain,
+  st_echo_stop
+};
--- a/src/echos.c
+++ b/src/echos.c
@@ -273,3 +273,13 @@
         return (ST_SUCCESS);
 }
 
+st_effect_t st_echos_effect = {
+  "echos",
+  NULL,
+  0,
+  st_echos_getopts,
+  st_echos_start,
+  st_echos_flow,
+  st_echos_drain,
+  st_echos_stop
+};
--- a/src/fade.c
+++ b/src/fade.c
@@ -399,3 +399,14 @@
 
     return retval;
 }
+
+st_effect_t st_fade_effect = {
+  "fade",
+  NULL,
+  ST_EFF_MCHAN,
+  st_fade_getopts,
+  st_fade_start,
+  st_fade_flow,
+  st_fade_drain,
+  st_fade_stop
+};
--- a/src/filter.c
+++ b/src/filter.c
@@ -314,3 +314,14 @@
                 X++;
         }
 }
+
+st_effect_t st_filter_effect = {
+  "filter",
+  NULL,
+  0,
+  st_filter_getopts,
+  st_filter_start,
+  st_filter_flow,
+  st_filter_drain,
+  st_filter_stop
+};
--- a/src/flanger.c
+++ b/src/flanger.c
@@ -286,3 +286,14 @@
         flanger->lookup_tab = (int *) -1;   /* guaranteed core dump */
         return (ST_SUCCESS);
 }
+
+st_effect_t st_flanger_effect = {
+  "flanger",
+  NULL,
+  0,
+  st_flanger_getopts,
+  st_flanger_start,
+  st_flanger_flow,
+  st_flanger_drain,
+  st_flanger_stop
+};
--- a/src/gsm.c
+++ b/src/gsm.c
@@ -232,4 +232,23 @@
 
         return st_gsmstopread(ft); /* destroy handles and free buffers */
 }
+
+/* GSM 06.10 */
+static char *gsmnames[] = {
+  "gsm",
+  NULL
+};
+
+st_format_t st_gsm_format = {
+  gsmnames,
+  NULL,
+  0,
+  st_gsmstartread,
+  st_gsmread,
+  st_gsmstopread,
+  st_gsmstartwrite,
+  st_gsmwrite,
+  st_gsmstopwrite,
+  st_format_nothing_seek
+};
 #endif /* ENABLE_GSM */
--- a/src/handlers.c
+++ b/src/handlers.c
@@ -14,388 +14,67 @@
  * Sound Tools file format and effect tables.
  */
 
-/* File format handlers. */
-
-/* SGI/Apple AIFF */
-static char *aiffnames[] = {
-        "aiff",
-        "aif",
-        (char *) 0
+st_format_t st_terminator_format =
+{
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 };
 
-/* a-law byte raw */
-static char *alnames[] = {
-        "al",
-        (char *) 0
-};
-
+/* File format handlers. */
+st_format_t *st_formats[] = {
+  &st_aiff_format,
+  &st_al_format,
 #if     defined(HAVE_ALSA)
-/* /dev/snd/pcmXX */
-static char *alsanames[] = {
-        "alsa",
-        (char *) 0
-};
+  &st_alsa_format,
 #endif
-
-/* SPARC .au w/header */
-static char *aunames[] = {
-        "au",
-        "snd",
-        (char *) 0
-};
-
-static char *autonames[] = {
-        "auto",
-        (char *) 0
-};
-
-static char *avrnames[] = {
-        "avr",
-        (char *) 0
-};
-
-static char *cdrnames[] = {
-        "cdr",
-        (char *) 0
-};
-
-/* Cont. Variable Slope Delta */
-static char *cvsdnames[] = {
-        "cvs",
-        "cvsd",
-        (char *)0
-};
-
-/* Text data samples */
-static char *datnames[] = {
-        "dat",
-        (char *) 0
-};
-
-/* Cont. Variable Solot Delta */
-static char *dvmsnames[] = {
-        "vms",
-        "dvms",
-        (char *)0
-};
-
+  &st_au_format,
+  &st_auto_format,
+  &st_avr_format,
+  &st_cdr_format,
+  &st_cvsd_format,
+  &st_dat_format,
+  &st_dvms_format,
 #ifdef ENABLE_GSM
-/* GSM 06.10 */
-static char *gsmnames[] = {
-        "gsm",
-        (char *) 0
-};
+  &st_gsm_format,
 #endif
-
-/* Mac FSSD/HCOM */
-static char *hcomnames[] = {
-        "hcom",
-        (char *) 0
-};
-
-/* inverse a-law byte raw */
-static char *lanames[] = {
-        "la",
-        (char *) 0
-};
-
-/* inverse u-law byte raw */
-static char *lunames[] = {
-        "lu",
-        (char *) 0
-};
-
-/* Amiga MAUD */
-static char *maudnames[] = {
-        "maud",
-        (char *) 0,
-};
-
+  &st_hcom_format,
+  &st_la_format,
+  &st_lu_format,
+  &st_maud_format,
 #if defined(HAVE_LIBMAD) || defined(HAVE_LAME)
-/* MP3 */
-static char *mp3names[] = {
-        "mp3",
-        "mp2",
-        (char *) 0,
-};
+  &st_mp3_format,
 #endif
-
-static char *nulnames[] = {
-        "nul",
-        (char *) 0,
-};
-
+  &st_nul_format,
 #if     defined(HAVE_OSS)
-/* OSS /dev/dsp player */
-static char *ossdspnames[] = {
-        "ossdsp",
-        (char *) 0
-};
+  &st_ossdsp_format,
 #endif
-
-/* Psion .prc */
-static char *prcnames[] = {
-      "prc",
-      (char *) 0
-};
-
-static char *rawnames[] = {
-        "raw",
-        (char *) 0
-};
-
-/* raw prototypes are defined in st.h since they are used globally. */
-
-static char *sbnames[] = {
-        "sb",
-        (char *) 0
-};
-
-/* IRCAM Sound File */
-static char *sfnames[] = {
-        "sf",
-        (char *) 0
-};
-
-static char *slnames[] = {
-        "sl",
-        (char *) 0,
-};
-
-/* SampleVision sound */
-static char *smpnames[] = {
-        "smp",
-        (char *) 0,
-};
-
-/* Sndtool Sound File */
-static char *sndtnames[] = {
-        "sndt",
-        (char *) 0
-};
-
-/* NIST Sphere File */
-static char *spherenames[] = {
-        "sph",
-        (char *) 0
-};
-
+  &st_prc_format,
+  &st_raw_format,
+  &st_sb_format,
+  &st_sf_format,
+  &st_sl_format,
+  &st_smp_format,
+  &st_snd_format,
+  &st_sphere_format,
 #if     defined(HAVE_SUNAUDIO)
-/* Sun /dev/audio player */
-static char *sunnames[] = {
-        "sunau",
-        (char *) 0
-};
+  &st_sun_format,
 #endif
-
-/* Amiga 8SVX */
-static char *svxnames[] = {
-        "8svx",
-        (char *) 0
-};
-
-static char *swnames[] = {
-        "sw",
-        (char *) 0
-};
-
-/* Yamaha TX16W and SY99 waves */
-static char *txwnames[] = {
-    "txw",
-    (char *)0
-};
-
-static char *ubnames[] = {
-        "ub",
-        "sou",
-        "fssd",
-        (char *) 0
-};
-
-static char *ulnames[] = {
-        "ul",
-        (char *) 0
-};
-
-static char *uwnames[] = {
-        "uw",
-        (char *) 0
-};
-
-/* Sound Blaster .VOC */
-static char *vocnames[] = {
-        "voc",
-        (char *) 0
-};
-
+  &st_svx_format,
+  &st_sw_format,
+  &st_txw_format,
+  &st_ub_format,
+  &st_ul_format,
+  &st_uw_format,
+  &st_voc_format,
 #ifdef HAVE_LIBVORBIS
-/* Ogg Vorbis */
-static char *vorbisnames[] = {
-        "vorbis",
-        "ogg",
-        (char *) 0
-};
+  &st_vorbis_format,
 #endif
-
-static char *voxnames[] = {
-        "vox",
-        (char *) 0
+  &st_vox_format,
+  &st_wav_format,
+  &st_wve_format,
+  &st_terminator_format,
+  NULL
 };
 
-/* Microsoftt RIFF */
-static char *wavnames[] = {
-        "wav",
-        (char *) 0
-};
-
-/* Psion .wve */
-static char *wvenames[] = {
-      "wve",
-      (char *) 0
-};
-
-st_format_t st_formats[] = {
-    {aiffnames,
-        ST_FILE_STEREO | ST_FILE_LOOPS | ST_FILE_SEEK,
-        st_aiffstartread, st_aiffread, st_aiffstopread,
-        st_aiffstartwrite, st_aiffwrite, st_aiffstopwrite, st_aiffseek},
-    {alnames, ST_FILE_STEREO,
-        st_alstartread, st_rawread, st_rawstopread,
-        st_alstartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
-#ifdef HAVE_ALSA
-    {alsanames, ST_FILE_STEREO | ST_FILE_NOSTDIO,
-        st_alsastartread, st_alsaread, st_alsastopread,
-        st_alsastartwrite, st_alsawrite, st_alsastopwrite,
-        st_format_nothing_seek},
-#endif
-    {aunames, ST_FILE_STEREO | ST_FILE_SEEK,
-        st_austartread, st_auread, st_rawstopread,
-        st_austartwrite, st_auwrite, st_austopwrite,
-        st_auseek},
-    {autonames, ST_FILE_STEREO,
-        st_autostartread, st_format_nothing_io, st_format_nothing,
-        st_autostartwrite, st_format_nothing_io, st_format_nothing,
-        st_format_nothing_seek},
-    {avrnames, ST_FILE_STEREO,
-        st_avrstartread, st_rawread, st_format_nothing,
-        st_avrstartwrite, st_avrwrite, st_avrstopwrite,
-        st_format_nothing_seek},
-    {cdrnames, ST_FILE_STEREO | ST_FILE_SEEK,
-        st_cdrstartread, st_cdrread, st_cdrstopread,
-        st_cdrstartwrite, st_cdrwrite, st_cdrstopwrite,
-        st_rawseek},
-    {cvsdnames, 0,
-        st_cvsdstartread, st_cvsdread, st_cvsdstopread,
-        st_cvsdstartwrite, st_cvsdwrite, st_cvsdstopwrite,
-        st_format_nothing_seek},
-    {datnames, 0,
-        st_datstartread, st_datread, st_format_nothing,
-        st_datstartwrite, st_datwrite, st_format_nothing,
-        st_format_nothing_seek},
-    {dvmsnames, 0,
-        st_dvmsstartread, st_cvsdread, st_cvsdstopread,
-        st_dvmsstartwrite, st_cvsdwrite, st_dvmsstopwrite, st_format_nothing_seek},
-#ifdef ENABLE_GSM
-    {gsmnames, 0,
-        st_gsmstartread, st_gsmread, st_gsmstopread,
-        st_gsmstartwrite, st_gsmwrite, st_gsmstopwrite, st_format_nothing_seek},
-#endif
-    {hcomnames, 0,
-        st_hcomstartread, st_hcomread, st_hcomstopread,
-        st_hcomstartwrite, st_hcomwrite, st_hcomstopwrite, st_format_nothing_seek},
-    {lanames, ST_FILE_STEREO,
-        st_lastartread, st_rawread, st_rawstopread,
-        st_lastartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
-    {lunames, ST_FILE_STEREO,
-        st_lustartread, st_rawread, st_rawstopread,
-        st_lustartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
-    {maudnames, ST_FILE_STEREO,
-        st_maudstartread, st_maudread, st_maudstopread,
-        st_maudstartwrite, st_maudwrite, st_maudstopwrite, st_format_nothing_seek},
-#if defined(HAVE_LIBMAD) || defined(HAVE_LAME)
-    {mp3names, ST_FILE_STEREO,
-        st_mp3startread, st_mp3read, st_mp3stopread,
-        st_mp3startwrite, st_mp3write, st_mp3stopwrite, st_format_nothing_seek},
-#endif
-    {nulnames, ST_FILE_STEREO | ST_FILE_NOSTDIO,
-        st_nulstartread, st_nulread, st_nulstopread,
-        st_nulstartwrite, st_nulwrite, st_nulstopwrite, st_format_nothing_seek},
-#ifdef HAVE_OSS
-    {ossdspnames, ST_FILE_STEREO,
-        st_ossdspstartread, st_rawread, st_rawstopread,
-        st_ossdspstartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
-#endif
-    {prcnames, ST_FILE_SEEK,
-        st_prcstartread, st_prcread, st_rawstopread,
-        st_prcstartwrite, st_prcwrite, st_prcstopwrite, st_prcseek},
-    {rawnames, ST_FILE_STEREO | ST_FILE_SEEK,
-        st_rawstartread, st_rawread, st_rawstopread,
-        st_rawstartwrite, st_rawwrite, st_rawstopwrite, st_rawseek},
-    {sbnames, ST_FILE_STEREO,
-        st_sbstartread, st_rawread, st_rawstopread,
-        st_sbstartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
-    {sfnames, ST_FILE_STEREO | ST_FILE_SEEK,
-        st_sfstartread, st_rawread, st_rawstopread,
-        st_sfstartwrite, st_rawwrite, st_rawstopwrite, st_sfseek},
-    { slnames, ST_FILE_STEREO,
-        st_slstartread, st_rawread, st_rawstopread,
-        st_slstartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
-    {smpnames, ST_FILE_STEREO | ST_FILE_LOOPS | ST_FILE_SEEK,
-        st_smpstartread, st_smpread, st_smpstopread,
-        st_smpstartwrite, st_smpwrite, st_smpstopwrite, st_smpseek},
-    {sndtnames, ST_FILE_STEREO | ST_FILE_SEEK,
-        st_sndtstartread, st_rawread, st_rawstopread,
-        st_sndtstartwrite, st_sndtwrite, st_sndtstopwrite, st_sndseek},
-    {spherenames, ST_FILE_STEREO,
-        st_spherestartread, st_sphereread, st_rawstopread,
-        st_spherestartwrite, st_spherewrite, st_spherestopwrite,
-        st_format_nothing_seek},
-#ifdef HAVE_SUNAUDIO
-    {sunnames, ST_FILE_STEREO,
-        st_sunstartread, st_rawread, st_rawstopread,
-        st_sunstartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
-#endif
-    {svxnames, ST_FILE_STEREO,
-        st_svxstartread, st_svxread, st_svxstopread,
-        st_svxstartwrite, st_svxwrite, st_svxstopwrite, st_format_nothing_seek},
-    {swnames, ST_FILE_STEREO,
-        st_swstartread, st_rawread, st_rawstopread,
-        st_swstartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
-    {txwnames, 0,
-        st_txwstartread, st_txwread, st_txwstopread,
-        st_txwstartwrite, st_txwwrite, st_txwstopwrite, st_format_nothing_seek},
-    {ubnames, ST_FILE_STEREO,
-        st_ubstartread, st_rawread, st_rawstopread,
-        st_ubstartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
-    {ulnames, ST_FILE_STEREO,
-        st_ulstartread, st_rawread, st_rawstopread,
-        st_ulstartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
-    {uwnames, ST_FILE_STEREO,
-        st_uwstartread, st_rawread, st_rawstopread,
-        st_uwstartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
-    {vocnames, ST_FILE_STEREO,
-        st_vocstartread, st_vocread, st_vocstopread,
-        st_vocstartwrite, st_vocwrite, st_vocstopwrite, st_format_nothing_seek},
-#ifdef HAVE_LIBVORBIS
-    {vorbisnames, ST_FILE_STEREO,
-        st_vorbisstartread, st_vorbisread, st_vorbisstopread,
-        st_vorbisstartwrite, st_vorbiswrite, st_vorbisstopwrite,
-        st_format_nothing_seek},
-#endif
-    {voxnames, 0,
-        st_voxstartread, st_voxread, st_voxstopread,
-        st_voxstartwrite, st_voxwrite, st_voxstopwrite,
-        st_format_nothing_seek},
-    {wavnames, ST_FILE_STEREO | ST_FILE_SEEK,
-        st_wavstartread, st_wavread, st_wavstopread,
-        st_wavstartwrite, st_wavwrite, st_wavstopwrite, st_wavseek},
-    {wvenames, ST_FILE_SEEK,
-        st_wvestartread, st_wveread, st_rawstopread,
-        st_wvestartwrite, st_wvewrite, st_wvestopwrite, st_wveseek},
-    {0, 0,
-        0, 0, 0, 0, 0, 0, 0}
-};
-
 /* Effects handlers. */
 
 /*
@@ -405,134 +84,54 @@
  *
  */
 
-st_effect_t st_effects[] = {
-        {"avg", ST_EFF_MCHAN | ST_EFF_CHAN,
-                st_avg_getopts, st_avg_start, st_avg_flow,
-                st_effect_nothing_drain, st_avg_stop},
-        {"band", 0,
-                st_band_getopts, st_band_start, st_band_flow,
-                st_effect_nothing_drain, st_band_stop},
-        {"bandpass", 0,
-                st_bandpass_getopts, st_bandpass_start, st_butterworth_flow,
-                st_effect_nothing_drain, st_effect_nothing},
-        {"bandreject", 0,
-                st_bandreject_getopts, st_bandreject_start, st_butterworth_flow,
-                st_effect_nothing_drain, st_effect_nothing},
-        {"chorus", 0,
-                st_chorus_getopts, st_chorus_start, st_chorus_flow,
-                st_chorus_drain, st_chorus_stop},
-        {"compand", ST_EFF_MCHAN,
-                st_compand_getopts, st_compand_start, st_compand_flow,
-                st_compand_drain, st_compand_stop},
-        {"copy", ST_EFF_MCHAN,
-                st_copy_getopts, st_copy_start, st_copy_flow,
-                st_effect_nothing_drain, st_effect_nothing},
-        {"dcshift", ST_EFF_MCHAN,
-                st_dcshift_getopts, st_dcshift_start, st_dcshift_flow,
-                st_effect_nothing_drain, st_dcshift_stop},
-        {"deemph", ST_EFF_MCHAN,
-                st_deemph_getopts, st_deemph_start, st_deemph_flow,
-                st_effect_nothing_drain, st_deemph_stop},
-        {"earwax", ST_EFF_MCHAN,
-                st_earwax_getopts, st_earwax_start, st_earwax_flow,
-                st_earwax_drain, st_earwax_stop},
-        {"echo", 0,
-                st_echo_getopts, st_echo_start, st_echo_flow,
-                st_echo_drain, st_echo_stop},
-        {"echos", 0,
-                st_echos_getopts, st_echos_start, st_echos_flow,
-                st_echos_drain, st_echos_stop},
-        {"fade", ST_EFF_MCHAN,
-                st_fade_getopts, st_fade_start, st_fade_flow,
-                st_fade_drain, st_fade_stop},
-        { "filter", 0,
-                st_filter_getopts, st_filter_start, st_filter_flow,
-                st_filter_drain, st_filter_stop},
-        {"flanger", 0,
-                st_flanger_getopts, st_flanger_start, st_flanger_flow,
-                st_flanger_drain, st_flanger_stop},
-        {"highp", 0,
-                st_highp_getopts, st_highp_start, st_highp_flow,
-                st_effect_nothing_drain, st_highp_stop},
-        {"highpass", 0,
-                st_highpass_getopts, st_highpass_start, st_butterworth_flow,
-                st_effect_nothing_drain, st_effect_nothing},
-        {"lowp", 0,
-                st_lowp_getopts, st_lowp_start, st_lowp_flow,
-                st_effect_nothing_drain, st_lowp_stop},
-        {"lowpass", 0,
-                st_lowpass_getopts, st_lowpass_start, st_butterworth_flow,
-                st_effect_nothing_drain, st_effect_nothing},
-        {"mask", ST_EFF_MCHAN,
-                st_mask_getopts, st_effect_nothing, st_mask_flow,
-                st_effect_nothing_drain, st_effect_nothing},
-        {"mcompand", ST_EFF_MCHAN,
-                st_mcompand_getopts, st_mcompand_start, st_mcompand_flow,
-                st_mcompand_drain, st_mcompand_stop},
-        {"noiseprof", ST_EFF_MCHAN | ST_EFF_REPORT,
-                st_noiseprof_getopts, st_noiseprof_start, st_noiseprof_flow,
-                st_noiseprof_drain, st_noiseprof_stop},
-        {"noisered", ST_EFF_MCHAN,
-                st_noisered_getopts, st_noisered_start, st_noisered_flow,
-                st_noisered_drain, st_noisered_stop},
-        {"pan", ST_EFF_MCHAN | ST_EFF_CHAN,
-                st_pan_getopts, st_pan_start, st_pan_flow,
-                st_effect_nothing_drain, st_pan_stop},
-        {"phaser", 0,
-                st_phaser_getopts, st_phaser_start, st_phaser_flow,
-                st_phaser_drain, st_phaser_stop},
-        {"pick", ST_EFF_MCHAN | ST_EFF_CHAN,
-                st_avg_getopts, st_avg_start, st_avg_flow,
-                st_effect_nothing_drain, st_avg_stop},
-        {"pitch", 0,
-                st_pitch_getopts, st_pitch_start, st_pitch_flow,
-                st_pitch_drain, st_pitch_stop},
-        {"polyphase", ST_EFF_RATE,
-                st_poly_getopts, st_poly_start, st_poly_flow,
-                st_poly_drain, st_poly_stop},
-        {"rate", ST_EFF_RATE,
-                st_rate_getopts, st_rate_start, st_rate_flow,
-                st_effect_nothing_drain, st_effect_nothing},
-        {"repeat", 0,
-                st_repeat_getopts, st_repeat_start, st_repeat_flow,
-                st_repeat_drain, st_repeat_stop},
-        {"resample", ST_EFF_RATE,
-                st_resample_getopts, st_resample_start, st_resample_flow,
-                st_resample_drain, st_resample_stop},
-        {"reverb", 0,
-                st_reverb_getopts, st_reverb_start, st_reverb_flow,
-                st_reverb_drain, st_reverb_stop},
-        {"reverse", 0,
-                st_reverse_getopts, st_reverse_start,
-                st_reverse_flow, st_reverse_drain, st_reverse_stop},
-        {"silence", ST_EFF_MCHAN,
-                st_silence_getopts, st_silence_start,
-                st_silence_flow, st_silence_drain, st_silence_stop},
-        {"speed", 0,
-                st_speed_getopts, st_speed_start,
-                st_speed_flow, st_speed_drain, st_speed_stop},
-        {"stat", ST_EFF_MCHAN | ST_EFF_REPORT,
-                st_stat_getopts, st_stat_start, st_stat_flow,
-                st_stat_drain, st_stat_stop},
-        {"stretch", 0,
-                st_stretch_getopts, st_stretch_start, st_stretch_flow,
-                st_stretch_drain, st_stretch_stop},
-        {"swap", ST_EFF_MCHAN,
-                st_swap_getopts, st_swap_start, st_swap_flow,
-                st_swap_drain, st_swap_stop},
-        {"synth", ST_EFF_MCHAN,
-                st_synth_getopts, st_synth_start, st_synth_flow,
-                st_synth_drain, st_synth_stop},
-        {"trim", ST_EFF_MCHAN,
-                st_trim_getopts, st_trim_start, st_trim_flow,
-                st_effect_nothing_drain, st_effect_nothing},
-        {"vibro", 0,
-                st_vibro_getopts, st_vibro_start, st_vibro_flow,
-                st_effect_nothing_drain, st_effect_nothing},
-        {"vol", ST_EFF_MCHAN,
-                st_vol_getopts, st_vol_start, st_vol_flow,
-                st_effect_nothing_drain, st_vol_stop},
-        {0, 0, 0, 0, 0, 0, 0}
+st_effect_t st_terminator_effect =
+{
+  0, 0, 0, 0, 0, 0, 0, 0
 };
 
-
+st_effect_t *st_effects[] = {
+  &st_avg_effect,
+  &st_band_effect,
+  &st_bandpass_effect,
+  &st_bandreject_effect,
+  &st_chorus_effect,
+  &st_compand_effect,
+  &st_copy_effect,
+  &st_dcshift_effect,
+  &st_deemph_effect,
+  &st_earwax_effect,
+  &st_echo_effect,
+  &st_echos_effect,
+  &st_fade_effect,
+  &st_filter_effect,
+  &st_flanger_effect,
+  &st_highp_effect,
+  &st_highpass_effect,
+  &st_lowp_effect,
+  &st_lowpass_effect,
+  &st_mask_effect,
+  &st_mcompand_effect,
+  &st_noiseprof_effect,
+  &st_noisered_effect,
+  &st_pan_effect,
+  &st_phaser_effect,
+  &st_pick_effect,
+  &st_pitch_effect,
+  &st_polyphase_effect,
+  &st_rate_effect,
+  &st_repeat_effect,
+  &st_resample_effect,
+  &st_reverb_effect,
+  &st_reverse_effect,
+  &st_silence_effect,
+  &st_speed_effect,
+  &st_stat_effect,
+  &st_stretch_effect,
+  &st_swap_effect,
+  &st_synth_effect,
+  &st_trim_effect,
+  &st_vibro_effect,
+  &st_vol_effect,
+  &st_terminator_effect,
+  NULL
+};
--- a/src/hcom.c
+++ b/src/hcom.c
@@ -571,3 +571,22 @@
 
         return (ST_SUCCESS);
 }
+
+/* Mac FSSD/HCOM */
+static char *hcomnames[] = {
+  "hcom",
+  NULL
+};
+
+st_format_t st_hcom_format = {
+  hcomnames,
+  NULL,
+  0,
+  st_hcomstartread,
+  st_hcomread,
+  st_hcomstopread,
+  st_hcomstartwrite,
+  st_hcomwrite,
+  st_hcomstopwrite,
+  st_format_nothing_seek
+};
--- a/src/highp.c
+++ b/src/highp.c
@@ -113,3 +113,13 @@
     return (ST_SUCCESS);
 }
 
+st_effect_t st_highp_effect = {
+  "highp",
+  NULL,
+  0,
+  st_highp_getopts,
+  st_highp_start,
+  st_highp_flow,
+  st_effect_nothing_drain,
+  st_highp_stop
+};
--- a/src/highpass.c
+++ b/src/highpass.c
@@ -72,3 +72,14 @@
   butterworth->b [1] = (1.0 - sqrt(2.0) * c + c * c) * butterworth->a [0];
   return (ST_SUCCESS);
 }
+
+st_effect_t st_highpass_effect = {
+  "highpass",
+  NULL, 
+  0,
+  st_highpass_getopts,
+  st_highpass_start,
+  st_butterworth_flow,
+  st_effect_nothing_drain,
+  st_effect_nothing
+};
--- a/src/lowp.c
+++ b/src/lowp.c
@@ -106,3 +106,13 @@
     return (ST_SUCCESS);
 }
 
+st_effect_t st_lowp_effect = {
+  "lowp",
+  NULL,
+  0,
+  st_lowp_getopts,
+  st_lowp_start,
+  st_lowp_flow,
+  st_effect_nothing_drain,
+  st_lowp_stop
+};
--- a/src/lowpass.c
+++ b/src/lowpass.c
@@ -57,3 +57,14 @@
   butterworth->b [1] = (1.0 - sqrt(2.0) * c + c * c) * butterworth->a [0];
   return (ST_SUCCESS);
 }
+
+st_effect_t st_lowpass_effect = {
+  "lowpass",
+  NULL,
+  0,
+  st_lowpass_getopts,
+  st_lowpass_start,
+  st_butterworth_flow,
+  st_effect_nothing_drain,
+  st_effect_nothing
+};
--- a/src/mask.c
+++ b/src/mask.c
@@ -96,3 +96,14 @@
 	*osamp = done;
 	return (ST_SUCCESS);
 }
+
+st_effect_t st_mask_effect = {
+  "mask",
+  NULL,
+  ST_EFF_MCHAN,
+  st_mask_getopts,
+  st_effect_nothing,
+  st_mask_flow,
+  st_effect_nothing_drain,
+  st_effect_nothing
+};
--- a/src/maud.c
+++ b/src/maud.c
@@ -387,3 +387,22 @@
         st_writes(ft, "MDAT");
         st_writedw(ft, p->nsamples * ft->info.size ); /* samples in file */
 }
+
+/* Amiga MAUD */
+static char *maudnames[] = {
+  "maud",
+  NULL,
+};
+
+st_format_t st_maud_format = {
+  maudnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_maudstartread,
+  st_maudread,
+  st_maudstopread,
+  st_maudstartwrite,
+  st_maudwrite,
+  st_maudstopwrite,
+  st_format_nothing_seek
+};
--- a/src/mcompand.c
+++ b/src/mcompand.c
@@ -711,3 +711,14 @@
 
   return (ST_SUCCESS);
 }
+
+st_effect_t st_mcompand_effect = {
+  "mcompand",
+  NULL,  
+  ST_EFF_MCHAN,
+  st_mcompand_getopts,
+  st_mcompand_start,
+  st_mcompand_flow,
+  st_mcompand_drain,
+  st_mcompand_stop
+};
--- a/src/mp3.c
+++ b/src/mp3.c
@@ -520,4 +520,24 @@
   return ST_EOF;
 }
 #endif /* HAVE_LAME */
+
+/* MP3 */
+static char *mp3names[] = {
+  "mp3",
+  "mp2",
+  NULL,
+};
+
+st_format_t st_mp3_format = {
+  mp3names,
+  NULL,
+  ST_FILE_STEREO,
+  st_mp3startread,
+  st_mp3read,
+  st_mp3stopread,
+  st_mp3startwrite,
+  st_mp3write,
+  st_mp3stopwrite,
+  st_format_nothing_seek
+};
 #endif
--- a/src/noiseprof.c
+++ b/src/noiseprof.c
@@ -209,6 +209,17 @@
     return (ST_SUCCESS);
 }
 
+st_effect_t st_noiseprof_effect = {
+  "noiseprof",
+  NULL,
+  ST_EFF_MCHAN | ST_EFF_REPORT,
+  st_noiseprof_getopts,
+  st_noiseprof_start,
+  st_noiseprof_flow,
+  st_noiseprof_drain,
+  st_noiseprof_stop
+};
+
 /* For Emacs:
    Local Variables:
    c-basic-offset: 4
--- a/src/noisered.c
+++ b/src/noisered.c
@@ -343,6 +343,17 @@
     return (ST_SUCCESS);
 }
 
+st_effect_t st_noisered_effect = {
+  "noisered",
+  NULL,
+  ST_EFF_MCHAN,
+  st_noisered_getopts,
+  st_noisered_start,
+  st_noisered_flow,
+  st_noisered_drain,
+  st_noisered_stop
+};
+
 /* For Emacs:
   Local Variables:
   c-basic-offset: 4
--- a/src/nulfile.c
+++ b/src/nulfile.c
@@ -109,15 +109,20 @@
     return (ST_SUCCESS);
 }
 
+static char *nulnames[] = {
+  "nul",
+  NULL,
+};
 
-
-
-
-
-
-
-
-
-
-
-
+st_format_t st_nul_format = {
+  nulnames,
+  NULL,
+  ST_FILE_STEREO | ST_FILE_NOSTDIO,
+  st_nulstartread,
+  st_nulread,
+  st_nulstopread,
+  st_nulstartwrite,
+  st_nulwrite,
+  st_nulstopwrite,
+  st_format_nothing_seek
+};
--- a/src/oss.c
+++ b/src/oss.c
@@ -215,4 +215,23 @@
 {
     return ossdspinit(ft);
 }
+
+/* OSS /dev/dsp player */
+static char *ossdspnames[] = {
+  "ossdsp",
+  NULL
+};
+
+st_format_t st_ossdsp_format = {
+  ossdspnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_ossdspstartread,
+  st_rawread,
+  st_rawstopread,
+  st_ossdspstartwrite,
+  st_rawwrite,
+  st_rawstopwrite,
+  st_format_nothing_seek
+};
 #endif
--- a/src/pan.c
+++ b/src/pan.c
@@ -448,3 +448,14 @@
     }
     return ST_SUCCESS;
 }
+
+st_effect_t st_pan_effect = {
+  "pan",
+  NULL,
+  ST_EFF_MCHAN | ST_EFF_CHAN,
+  st_pan_getopts,
+  st_pan_start,
+  st_pan_flow,
+  st_effect_nothing_drain,
+  st_pan_stop
+};
--- a/src/phaser.c
+++ b/src/phaser.c
@@ -277,3 +277,13 @@
         return (ST_SUCCESS);
 }
 
+st_effect_t st_phaser_effect = {
+  "phaser",
+  NULL,
+  0,
+  st_phaser_getopts,
+  st_phaser_start,
+  st_phaser_flow,
+  st_phaser_drain,
+  st_phaser_stop
+};
--- a/src/pitch.c
+++ b/src/pitch.c
@@ -617,3 +617,14 @@
 
     return ST_SUCCESS;
 }
+
+st_effect_t st_pitch_effect = {
+  "pitch",
+  NULL,
+  0,
+  st_pitch_getopts,
+  st_pitch_start,
+  st_pitch_flow,
+  st_pitch_drain,
+  st_pitch_stop
+};
--- a/src/polyphas.c
+++ b/src/polyphas.c
@@ -664,3 +664,14 @@
     }
     return (ST_SUCCESS);
 }
+
+st_effect_t st_polyphase_effect = {
+  "polyphase",
+  NULL,
+  ST_EFF_RATE,
+  st_poly_getopts,
+  st_poly_start,
+  st_poly_flow,
+  st_poly_drain,
+  st_poly_stop
+};
--- a/src/prc.c
+++ b/src/prc.c
@@ -209,3 +209,22 @@
   st_writew(ft, p->length);
   st_writebuf(ft, nullbuf,1,2);
 }
+
+/* Psion .prc */
+static char *prcnames[] = {
+  "prc",
+  NULL
+};
+
+st_format_t st_prc_format = {
+  prcnames,
+  NULL,
+  ST_FILE_SEEK,
+  st_prcstartread,
+  st_prcread,
+  st_rawstopread,
+  st_prcstartwrite,
+  st_prcwrite,
+  st_prcstopwrite,
+  st_prcseek
+};
--- a/src/rate.c
+++ b/src/rate.c
@@ -336,3 +336,14 @@
     return (ST_SUCCESS);
 }
 #endif /* USE_OLD_RATE */
+
+st_effect_t st_rate_effect = {
+  "rate",
+  NULL, 
+  ST_EFF_RATE,
+  st_rate_getopts,
+  st_rate_start,
+  st_rate_flow,
+  st_effect_nothing_drain,
+  st_effect_nothing
+};
--- a/src/raw.c
+++ b/src/raw.c
@@ -821,3 +821,188 @@
         if (ft->info.channels == -1)
                 ft->info.channels = 1;
 }
+
+static char *rawnames[] = {
+  "raw",
+  NULL
+};
+
+st_format_t st_raw_format = {
+   rawnames,
+   NULL,
+   ST_FILE_STEREO | ST_FILE_SEEK,
+   st_rawstartread,
+   st_rawread,
+   st_rawstopread,
+   st_rawstartwrite,
+   st_rawwrite,
+   st_rawstopwrite,
+   st_rawseek
+};
+
+/* a-law byte raw */
+static char *alnames[] = {
+  "al",
+  NULL
+};
+
+st_format_t st_al_format = {
+  alnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_alstartread,
+  st_rawread,
+  st_rawstopread,
+  st_alstartwrite,
+  st_rawwrite,
+  st_rawstopwrite,
+  st_format_nothing_seek
+};
+
+/* inverse a-law byte raw */
+static char *lanames[] = {
+  "la",
+  NULL
+};
+
+st_format_t st_la_format = {
+  lanames,
+  NULL,
+  ST_FILE_STEREO,
+  st_lastartread,
+  st_rawread,
+  st_rawstopread,
+  st_lastartwrite,
+  st_rawwrite,
+  st_rawstopwrite,
+  st_format_nothing_seek
+};
+
+/* inverse u-law byte raw */
+static char *lunames[] = {
+  "lu",
+  NULL
+};
+
+st_format_t st_lu_format = {
+  lunames,
+  NULL,
+  ST_FILE_STEREO,
+  st_lustartread,
+  st_rawread,
+  st_rawstopread,
+  st_lustartwrite,
+  st_rawwrite,
+  st_rawstopwrite,
+  st_format_nothing_seek
+};
+
+static char *sbnames[] = {
+  "sb",
+  NULL
+};
+
+st_format_t st_sb_format = {
+  sbnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_sbstartread,
+  st_rawread,
+  st_rawstopread,
+  st_sbstartwrite,
+  st_rawwrite,
+  st_rawstopwrite,
+  st_format_nothing_seek
+};
+
+static char *slnames[] = {
+  "sl",
+  NULL,
+};
+
+st_format_t st_sl_format = {
+  slnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_slstartread,
+  st_rawread,
+  st_rawstopread,
+  st_slstartwrite,
+  st_rawwrite,
+  st_rawstopwrite,
+  st_format_nothing_seek
+};
+
+static char *swnames[] = {
+  "sw",
+  NULL
+};
+
+st_format_t st_sw_format = {
+  swnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_swstartread,
+  st_rawread,
+  st_rawstopread,
+  st_swstartwrite,
+  st_rawwrite,
+  st_rawstopwrite,
+  st_format_nothing_seek
+};
+
+static char *ubnames[] = {
+  "ub",
+  "sou",
+  "fssd",
+  NULL
+};
+
+st_format_t st_ub_format = {
+  ubnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_ubstartread,
+  st_rawread,
+  st_rawstopread,
+  st_ubstartwrite,
+  st_rawwrite,
+  st_rawstopwrite,
+  st_format_nothing_seek
+};
+
+static char *ulnames[] = {
+  "ul",
+  NULL
+};
+
+st_format_t st_ul_format = {
+   ulnames,
+   NULL,
+   ST_FILE_STEREO,
+   st_ulstartread,
+   st_rawread,
+   st_rawstopread,
+   st_ulstartwrite,
+   st_rawwrite,
+   st_rawstopwrite,
+   st_format_nothing_seek
+};
+
+static char *uwnames[] = {
+  "uw",
+  NULL
+};
+
+st_format_t st_uw_format = {
+  uwnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_uwstartread,
+  st_rawread,
+  st_rawstopread,
+  st_uwstartwrite,
+  st_rawwrite,
+  st_rawstopwrite,
+  st_format_nothing_seek
+};
--- a/src/repeat.c
+++ b/src/repeat.c
@@ -195,3 +195,13 @@
         return (ST_SUCCESS);
 }
 
+st_effect_t st_repeat_effect = {
+  "repeat",
+  NULL,
+  0,
+  st_repeat_getopts,
+  st_repeat_start,
+  st_repeat_flow,
+  st_repeat_drain,
+  st_repeat_stop
+};
--- a/src/resample.c
+++ b/src/resample.c
@@ -709,3 +709,14 @@
       }
    }
 }
+
+st_effect_t st_resample_effect = {
+   "resample",
+   NULL,
+   ST_EFF_RATE,
+   st_resample_getopts,
+   st_resample_start,
+   st_resample_flow,
+   st_resample_drain,
+   st_resample_stop
+};
--- a/src/reverb.c
+++ b/src/reverb.c
@@ -286,3 +286,14 @@
         reverb->reverbbuf = (float *) -1;   /* guaranteed core dump */
         return (ST_SUCCESS);
 }
+
+st_effect_t st_reverb_effect = {
+  "reverb",
+  NULL,
+  0,
+  st_reverb_getopts,
+  st_reverb_start,
+  st_reverb_flow,
+  st_reverb_drain,
+  st_reverb_stop
+};
--- a/src/reverse.c
+++ b/src/reverse.c
@@ -142,3 +142,14 @@
         fclose(reverse->fp);
         return (ST_SUCCESS);
 }
+
+st_effect_t st_reverse_effect = {
+  "reverse",
+  NULL,
+  0,
+  st_reverse_getopts,
+  st_reverse_start,
+  st_reverse_flow,
+  st_reverse_drain,
+  st_reverse_stop
+};
--- a/src/sf.c
+++ b/src/sf.c
@@ -222,3 +222,21 @@
 }
 
 /* Read and write are supplied by raw.c */
+/* IRCAM Sound File */
+static char *sfnames[] = {
+  "sf",
+  NULL
+};
+
+st_format_t st_sf_format = {
+  sfnames,
+  NULL,
+  ST_FILE_STEREO | ST_FILE_SEEK,
+  st_sfstartread,
+  st_rawread,
+  st_rawstopread,
+  st_sfstartwrite,
+  st_rawwrite,
+  st_rawstopwrite,
+  st_sfseek
+};
--- a/src/silence.c
+++ b/src/silence.c
@@ -695,3 +695,14 @@
         free(silence->stop_holdoff);
     return(ST_SUCCESS);
 }
+
+st_effect_t st_silence_effect = {
+  "silence",
+  NULL,
+  ST_EFF_MCHAN,
+  st_silence_getopts,
+  st_silence_start,
+  st_silence_flow,
+  st_silence_drain,
+  st_silence_stop
+};
--- a/src/smp.c
+++ b/src/smp.c
@@ -430,3 +430,22 @@
 
         return(ST_SUCCESS);
 }
+
+/* SampleVision sound */
+static char *smpnames[] = {
+  "smp",
+  NULL,
+};
+
+st_format_t st_smp_format = {
+  smpnames,
+  NULL,
+  ST_FILE_STEREO | ST_FILE_LOOPS | ST_FILE_SEEK,
+  st_smpstartread,
+  st_smpread,
+  st_smpstopread,
+  st_smpstartwrite,
+  st_smpwrite,
+  st_smpstopwrite,
+  st_smpseek
+};
--- a/src/sndrtool.c
+++ b/src/sndrtool.c
@@ -256,3 +256,21 @@
     st_writebuf(ft, name_buf, 1, 96);
 }
 
+/* Sndtool Sound File */
+static char *sndtnames[] = {
+  "sndt",
+  NULL
+};
+
+st_format_t st_snd_format = {
+  sndtnames,
+  NULL,
+  ST_FILE_STEREO | ST_FILE_SEEK,
+  st_sndtstartread,
+  st_rawread,
+  st_rawstopread,
+  st_sndtstartwrite,
+  st_sndtwrite,
+  st_sndtstopwrite,
+  st_sndseek
+};
--- a/src/sox.c
+++ b/src/sox.c
@@ -806,8 +806,8 @@
         {
             int i1;
             fprintf(stderr, "%s: Known effects: ",myname);
-            for (i1 = 0; st_effects[i1].name; i1++)
-                fprintf(stderr, "%s ", st_effects[i1].name);
+            for (i1 = 0; st_effects[i1]->name; i1++)
+                fprintf(stderr, "%s ", st_effects[i1]->name);
             fprintf(stderr, "\n\n");
             st_fail("Effect '%s' is not known!", argv[optind]);
         }
@@ -1591,14 +1591,14 @@
             fprintf(stderr,"gopts: -e -h -p -q -S -V\n\n");
             fprintf(stderr,"fopts: -r rate -c channels -s/-u/-U/-A/-a/-i/-g/-f -b/-w/-l/-d -v volume -x\n\n");
             fprintf(stderr, "effect: ");
-            for (i = 0; st_effects[i].name != NULL; i++) {
-                fprintf(stderr, "%s ", st_effects[i].name);
+            for (i = 0; st_effects[i]->name != NULL; i++) {
+                fprintf(stderr, "%s ", st_effects[i]->name);
             }
             fprintf(stderr, "\n\neffopts: depends on effect\n\n");
             fprintf(stderr, "Supported file formats: ");
-            for (i = 0; st_formats[i].names != NULL; i++) {
+            for (i = 0; st_formats[i]->names != NULL; i++) {
                 /* only print the first name */
-                fprintf(stderr, "%s ", st_formats[i].names[0]);
+                fprintf(stderr, "%s ", st_formats[i]->names[0]);
             }
             fputc('\n', stderr);
         }
--- a/src/speed.c
+++ b/src/speed.c
@@ -301,3 +301,14 @@
     
     return ST_SUCCESS;
 }
+
+st_effect_t st_speed_effect = {
+  "speed",
+  NULL,
+  0,
+  st_speed_getopts,
+  st_speed_start,
+  st_speed_flow,
+  st_speed_drain,
+  st_speed_stop
+};
--- a/src/sphere.c
+++ b/src/sphere.c
@@ -308,3 +308,22 @@
 
     return (ST_SUCCESS);
 }
+
+/* NIST Sphere File */
+static char *spherenames[] = {
+  "sph",
+  NULL
+};
+
+st_format_t st_sphere_format = {
+  spherenames,
+  NULL,
+  ST_FILE_STEREO,
+  st_spherestartread,
+  st_sphereread,
+  st_rawstopread,
+  st_spherestartwrite,
+  st_spherewrite,
+  st_spherestopwrite,
+  st_format_nothing_seek
+};
--- a/src/st.h
+++ b/src/st.h
@@ -166,6 +166,7 @@
 
 typedef struct st_format {
     char         **names;
+    char         *usage;
     unsigned int flags;
     int          (*startread)(ft_t ft);
     st_ssize_t   (*read)(ft_t ft, st_sample_t *buf, st_ssize_t len);
@@ -203,7 +204,7 @@
     char   priv[ST_MAX_FILE_PRIVSIZE]; /* format's private data area */
 };
 
-extern st_format_t st_formats[];
+extern st_format_t *st_formats[];
 
 /* file flags field */
 #define ST_FILE_STEREO  1  /* does file format support stereo? */
@@ -258,6 +259,7 @@
 typedef struct
 {
     char    *name;                  /* effect name */
+    char    *usage;
     unsigned int flags;
 
     int (*getopts)(eff_t effp, int argc, char **argv);
@@ -286,7 +288,7 @@
     char priv[ST_MAX_EFFECT_PRIVSIZE]; /* private area for effect */
 };
 
-extern st_effect_t st_effects[]; /* declared in handlers.c */
+extern st_effect_t *st_effects[]; /* declared in handlers.c */
 
 extern ft_t st_open_read(const char *path, const st_signalinfo_t *info, 
                          const char *filetype);
--- a/src/st_i.h
+++ b/src/st_i.h
@@ -147,128 +147,57 @@
  *=============================================================================
  */
 
-/* The following functions can be used to simply return success if
- * a file handler or effect doesn't need to do anything special
- */
-int st_format_nothing(ft_t ft);
-st_ssize_t st_format_nothing_io(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_format_nothing_seek(ft_t ft, st_size_t offset);
-int st_effect_nothing(eff_t effp);
-int st_effect_nothing_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-
-int st_aiffstartread(ft_t ft);
-st_ssize_t st_aiffread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_aiffstopread(ft_t ft);
-int st_aiffstartwrite(ft_t ft);
-st_ssize_t st_aiffwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_aiffstopwrite(ft_t ft);
-int st_aiffseek(ft_t ft, st_size_t offset);
-
-int st_alstartread(ft_t ft);
-int st_alstartwrite(ft_t ft);
-
+st_format_t st_svx_format;
+st_format_t st_aiff_format;
 #ifdef HAVE_ALSA
-int st_alsastartread(ft_t ft);
-st_ssize_t st_alsaread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_alsastopread(ft_t ft);
-int st_alsastartwrite(ft_t ft);
-st_ssize_t st_alsawrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_alsastopwrite(ft_t ft);
+st_format_t st_alsa_format;
 #endif
-
-int st_austartread(ft_t ft);
-st_ssize_t st_auread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_austartwrite(ft_t ft);
-st_ssize_t st_auwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_austopwrite(ft_t ft);
-int st_auseek(ft_t ft, st_size_t offset);
-
-int st_autostartread(ft_t ft);
-int st_autostartwrite(ft_t ft);
-
-int st_avrstartread(ft_t ft);
-int st_avrstartwrite(ft_t ft);
-st_ssize_t st_avrwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_avrstopwrite(ft_t ft);
-
-int st_cdrstartread(ft_t ft);
-st_ssize_t st_cdrread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_cdrstopread(ft_t ft);
-int st_cdrstartwrite(ft_t ft);
-st_ssize_t st_cdrwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_cdrstopwrite(ft_t ft);
-
-int st_cvsdstartread(ft_t ft);
-st_ssize_t st_cvsdread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_cvsdstopread(ft_t ft);
-int st_cvsdstartwrite(ft_t ft);
-st_ssize_t st_cvsdwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_cvsdstopwrite(ft_t ft);
-
-int st_datstartread(ft_t ft);
-st_ssize_t st_datread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_datstartwrite(ft_t ft);
-st_ssize_t st_datwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-
-int st_dvmsstartread(ft_t ft);
-int st_dvmsstartwrite(ft_t ft);
-int st_dvmsstopwrite(ft_t ft);
-
+st_format_t st_au_format;
+st_format_t st_auto_format;
+st_format_t st_avr_format;
+st_format_t st_cdr_format;
+st_format_t st_cvsd_format;
+st_format_t st_dvms_format;
+st_format_t st_dat_format;
 #ifdef ENABLE_GSM
-int st_gsmstartread(ft_t ft);
-st_ssize_t st_gsmread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_gsmstopread(ft_t ft);
-int st_gsmstartwrite(ft_t ft);
-st_ssize_t st_gsmwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_gsmstopwrite(ft_t ft);
+st_format_t st_gsm_format;
 #endif
-
-int st_hcomstartread(ft_t ft);
-st_ssize_t st_hcomread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_hcomstopread(ft_t ft);
-int st_hcomstartwrite(ft_t ft);
-st_ssize_t st_hcomwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_hcomstopwrite(ft_t ft);
-
-int st_lastartread(ft_t ft);
-int st_lastartwrite(ft_t ft);
-
-int st_lustartread(ft_t ft);
-int st_lustartwrite(ft_t ft);
-
-int st_maudstartread(ft_t ft);
-st_ssize_t st_maudread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_maudstopread(ft_t ft);
-st_ssize_t st_maudwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_maudstartwrite(ft_t ft);
-int st_maudstopwrite(ft_t ft);
-
-int st_mp3startread(ft_t ft);
-st_ssize_t st_mp3read(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_mp3stopread(ft_t ft);
-st_ssize_t st_mp3write(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_mp3startwrite(ft_t ft);
-int st_mp3stopwrite(ft_t ft);
-
-int st_nulstartread(ft_t ft);
-st_ssize_t st_nulread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_nulstopread(ft_t ft);
-int st_nulstartwrite(ft_t ft);
-st_ssize_t st_nulwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_nulstopwrite(ft_t ft);
-
+st_format_t st_hcom_format;
+st_format_t st_maud_format;
+st_format_t st_mp3_format;
+st_format_t st_nul_format;
 #ifdef HAVE_OSS
-int st_ossdspstartread(ft_t ft);
-int st_ossdspstartwrite(ft_t ft);
+st_format_t st_ossdsp_format;
 #endif
+st_format_t st_prc_format;
+st_format_t st_raw_format;
+st_format_t st_al_format;
+st_format_t st_la_format;
+st_format_t st_lu_format;
+st_format_t st_sb_format;
+st_format_t st_sl_format;
+st_format_t st_sw_format;
+st_format_t st_ub_format;
+st_format_t st_ul_format;
+st_format_t st_uw_format;
+st_format_t st_sf_format;
+st_format_t st_smp_format;
+st_format_t st_snd_format;
+st_format_t st_sphere_format;
+#ifdef HAVE_SUNAUDIO
+st_format_t st_sun_format;
+#endif
+st_format_t st_txw_format;
+st_format_t st_voc_format;
+#ifdef HAVE_LIBVORBIS
+st_format_t st_vorbis_format;
+#endif
+st_format_t st_vox_format;
+st_format_t st_wav_format;
+st_format_t st_wve_format;
 
-int st_prcstartread(ft_t ft);
-st_ssize_t st_prcread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_prcstartwrite(ft_t ft);
-st_ssize_t st_prcwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_prcstopwrite(ft_t ft);
-int st_prcseek(ft_t ft, st_size_t offset);
-
+/* Raw I/O
+ */
 int st_rawstartread(ft_t ft);
 st_ssize_t st_rawread(ft_t ft, st_sample_t *buf, st_ssize_t nsamp);
 int st_rawstopread(ft_t ft);
@@ -277,365 +206,67 @@
 int st_rawstopwrite(ft_t ft);
 int st_rawseek(ft_t ft, st_size_t offset);
 
-int st_sbstartread(ft_t ft);
-int st_sbstartwrite(ft_t ft);
+/* The following functions can be used to simply return success if
+ * a file handler or effect doesn't need to do anything special
+ */
+int st_format_nothing(ft_t ft);
+st_ssize_t st_format_nothing_io(ft_t ft, st_sample_t *buf, st_ssize_t len);
+int st_format_nothing_seek(ft_t ft, st_size_t offset);
+int st_effect_nothing(eff_t effp);
+int st_effect_nothing_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
 
-int st_sfstartread(ft_t ft);
-int st_sfstartwrite(ft_t ft);
-int st_sfseek(ft_t ft, st_size_t offset);
-
-int st_slstartread(ft_t ft);
-int st_slstartwrite(ft_t ft);
-
-int st_smpstartread(ft_t ft);
-st_ssize_t st_smpread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_smpstopread(ft_t ft);
-int st_smpstartwrite(ft_t ft);
-st_ssize_t st_smpwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_smpstopwrite(ft_t ft);
-int st_smpseek(ft_t ft, st_size_t offset);
-
-int st_sndtstartread(ft_t ft);
-int st_sndtstartwrite(ft_t ft);
-st_ssize_t st_sndtwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_sndtstopwrite(ft_t ft);
-int st_sndseek(ft_t ft, st_size_t offset);
-
-int st_spherestartread(ft_t ft);
-st_ssize_t st_sphereread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_spherestartwrite(ft_t ft);
-st_ssize_t st_spherewrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_spherestopwrite(ft_t ft);
-
-#ifdef HAVE_SUNAUDIO
-int st_sunstartread(ft_t ft);
-int st_sunstartwrite(ft_t ft);
-#endif
-
-int st_svxstartread(ft_t ft);
-st_ssize_t st_svxread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_svxstopread(ft_t ft);
-int st_svxstartwrite(ft_t ft);
-st_ssize_t st_svxwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_svxstopwrite(ft_t ft);
-
-int st_swstartread(ft_t ft);
-int st_swstartwrite(ft_t ft);
-
-int st_txwstartread(ft_t ft);
-st_ssize_t st_txwread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_txwstopread(ft_t ft);
-int st_txwstartwrite(ft_t ft);
-st_ssize_t st_txwwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_txwstopwrite(ft_t ft);
-
-int st_ubstartread(ft_t ft);
-int st_ubstartwrite(ft_t ft);
-
-int st_ulstartread(ft_t ft);
-int st_ulstartwrite(ft_t ft);
-
-int st_uwstartread(ft_t ft);
-int st_uwstartwrite(ft_t ft);
-
-int st_vocstartread(ft_t ft);
-st_ssize_t st_vocread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_vocstopread(ft_t ft);
-int st_vocstartwrite(ft_t ft);
-st_ssize_t st_vocwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_vocstopwrite(ft_t ft);
-
-#ifdef HAVE_LIBVORBIS
-int st_vorbisstartread(ft_t ft);
-st_ssize_t st_vorbisread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_vorbisstopread(ft_t ft);
-int st_vorbisstartwrite(ft_t ft);
-st_ssize_t st_vorbiswrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_vorbisstopwrite(ft_t ft);
-#endif
-
-int st_voxstartread(ft_t ft);
-st_ssize_t st_voxread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_voxstopread(ft_t ft);
-int st_voxstartwrite(ft_t ft);
-st_ssize_t st_voxwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_voxstopwrite(ft_t ft);
-
-int st_wavstartread(ft_t ft);
-st_ssize_t st_wavread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_wavstopread(ft_t ft);
-int st_wavstartwrite(ft_t ft);
-st_ssize_t st_wavwrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_wavstopwrite(ft_t ft);
-int st_wavseek(ft_t ft, st_size_t offset);
-
-int st_wvestartread(ft_t ft);
-st_ssize_t st_wveread(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_wvestartwrite(ft_t ft);
-st_ssize_t st_wvewrite(ft_t ft, st_sample_t *buf, st_ssize_t len);
-int st_wvestopwrite(ft_t ft);
-int st_wveseek(ft_t ft, st_size_t offset);
-
 /*=============================================================================
  * Effects
  *=============================================================================
  */
-int st_avg_getopts(eff_t effp, int argc, char **argv);
-int st_avg_start(eff_t effp);
-int st_avg_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                st_size_t *isamp, st_size_t *osamp);
-int st_avg_stop(eff_t effp);
 
-int st_band_getopts(eff_t effp, int argc, char **argv);
-int st_band_start(eff_t effp);
-int st_band_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                 st_size_t *isamp, st_size_t *osamp);
-int st_band_stop(eff_t effp);
-int st_bandpass_getopts(eff_t effp, int argc, char **argv);
-int st_bandpass_start(eff_t effp);
+st_effect_t st_avg_effect;
+st_effect_t st_pick_effect;
+st_effect_t st_band_effect;
+st_effect_t st_bandpass_effect;
+st_effect_t st_bandreject_effect;
+st_effect_t st_chorus_effect;
+st_effect_t st_compand_effect;
+st_effect_t st_copy_effect;
+st_effect_t st_dcshift_effect;
+st_effect_t st_deemph_effect;
+st_effect_t st_earwax_effect;
+st_effect_t st_echo_effect;
+st_effect_t st_echos_effect;
+st_effect_t st_fade_effect;
+st_effect_t st_filter_effect;
+st_effect_t st_flanger_effect;
+st_effect_t st_highp_effect;
+st_effect_t st_highpass_effect;
+st_effect_t st_lowp_effect;
+st_effect_t st_lowpass_effect;
+st_effect_t st_mask_effect;
+st_effect_t st_mcompand_effect;
+st_effect_t st_noiseprof_effect;
+st_effect_t st_noisered_effect;
+st_effect_t st_pan_effect;
+st_effect_t st_phaser_effect;
+st_effect_t st_pitch_effect;
+st_effect_t st_polyphase_effect;
+st_effect_t st_rate_effect;
+st_effect_t st_repeat_effect;
+st_effect_t st_resample_effect;
+st_effect_t st_reverb_effect;
+st_effect_t st_reverse_effect;
+st_effect_t st_silence_effect;
+st_effect_t st_speed_effect;
+st_effect_t st_stat_effect;
+st_effect_t st_stretch_effect;
+st_effect_t st_swap_effect;
+st_effect_t st_synth_effect;
+st_effect_t st_trim_effect;
+st_effect_t st_vibro_effect;
+st_effect_t st_vol_effect;
 
-int st_bandreject_getopts(eff_t effp, int argc, char **argv);
-int st_bandreject_start(eff_t effp);
-
-int st_chorus_getopts(eff_t effp, int argc, char **argv);
-int st_chorus_start(eff_t effp);
-int st_chorus_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                   st_size_t *isamp, st_size_t *osamp);
-int st_chorus_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_chorus_stop(eff_t effp);
-
-int st_compand_getopts(eff_t effp, int argc, char **argv);
-int st_compand_start(eff_t effp);
-int st_compand_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                    st_size_t *isamp, st_size_t *osamp);
-int st_compand_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_compand_stop(eff_t effp);
-
-int st_copy_getopts(eff_t effp, int argc, char **argv);
-int st_copy_start(eff_t effp);
-int st_copy_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                 st_size_t *isamp, st_size_t *osamp);
-int st_copy_stop(eff_t effp);
-
-int st_dcshift_getopts(eff_t effp, int argc, char **argv);
-int st_dcshift_start(eff_t effp);
-int st_dcshift_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                    st_size_t *isamp, st_size_t *osamp);
-int st_dcshift_stop(eff_t effp);
-
-int st_deemph_getopts(eff_t effp, int argc, char **argv);
-int st_deemph_start(eff_t effp);
-int st_deemph_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                   st_size_t *isamp, st_size_t *osamp);
-int st_deemph_stop(eff_t effp);
-
-int st_earwax_getopts(eff_t effp, int argc, char **argv);
-int st_earwax_start(eff_t effp);
-int st_earwax_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                   st_size_t *isamp, st_size_t *osamp);
-int st_earwax_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_earwax_stop(eff_t effp);
-
-int st_echo_getopts(eff_t effp, int argc, char **argv);
-int st_echo_start(eff_t effp);
-int st_echo_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                 st_size_t *isamp, st_size_t *osamp);
-int st_echo_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_echo_stop(eff_t effp);
-
-int st_echos_getopts(eff_t effp, int argc, char **argv);
-int st_echos_start(eff_t effp);
-int st_echos_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                  st_size_t *isamp, st_size_t *osamp);
-int st_echos_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_echos_stop(eff_t effp);
-
-int st_fade_getopts(eff_t effp, int argc, char **argv);
-int st_fade_start(eff_t effp);
-int st_fade_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                 st_size_t *isamp, st_size_t *osamp);
-int st_fade_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_fade_stop(eff_t effp);
-
-int st_filter_getopts(eff_t effp, int argc, char **argv);
-int st_filter_start(eff_t effp);
-int st_filter_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                   st_size_t *isamp, st_size_t *osamp);
-int st_filter_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_filter_stop(eff_t effp);
-
-int st_flanger_getopts(eff_t effp, int argc, char **argv);
-int st_flanger_start(eff_t effp);
-int st_flanger_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                    st_size_t *isamp, st_size_t *osamp);
-int st_flanger_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_flanger_stop(eff_t effp);
-
-int st_highp_getopts(eff_t effp, int argc, char **argv);
-int st_highp_start(eff_t effp);
-int st_highp_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                  st_size_t *isamp, st_size_t *osamp);
-int st_highp_stop(eff_t effp);
-
-int st_highpass_getopts(eff_t effp, int argc, char **argv);
-int st_highpass_start(eff_t effp);
-
-int st_lowp_getopts(eff_t effp, int argc, char **argv);
-int st_lowp_start(eff_t effp);
-int st_lowp_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                 st_size_t *isamp, st_size_t *osamp);
-int st_lowp_stop(eff_t effp);
-
-int st_lowpass_getopts(eff_t effp, int argc, char **argv);
-int st_lowpass_start(eff_t effp);
-
-int st_mask_getopts(eff_t effp, int argc, char **argv);
-int st_mask_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                 st_size_t *isamp, st_size_t *osamp);
-
-int st_mcompand_getopts(eff_t effp, int argc, char **argv);
-int st_mcompand_start(eff_t effp);
-int st_mcompand_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                     st_size_t *isamp, st_size_t *osamp);
-int st_mcompand_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_mcompand_stop(eff_t effp);
-
-int st_noiseprof_getopts(eff_t effp, int argc, char **argv);
-int st_noiseprof_start(eff_t effp);
-int st_noiseprof_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                     st_size_t *isamp, st_size_t *osamp);
-int st_noiseprof_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_noiseprof_stop(eff_t effp);
-
-int st_noisered_getopts(eff_t effp, int argc, char **argv);
-int st_noisered_start(eff_t effp);
-int st_noisered_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                     st_size_t *isamp, st_size_t *osamp);
-int st_noisered_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_noisered_stop(eff_t effp);
-
-int st_pan_getopts(eff_t effp, int argc, char **argv);
-int st_pan_start(eff_t effp);
-int st_pan_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                st_size_t *isamp, st_size_t *osamp);
-int st_pan_stop(eff_t effp);
-
-int st_phaser_getopts(eff_t effp, int argc, char **argv);
-int st_phaser_start(eff_t effp);
-int st_phaser_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                   st_size_t *isamp, st_size_t *osamp);
-int st_phaser_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_phaser_stop(eff_t effp);
-
-int st_pitch_getopts(eff_t effp, int argc, char **argv);
-int st_pitch_start(eff_t effp);
-int st_pitch_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                  st_size_t *isamp, st_size_t *osamp);
-int st_pitch_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_pitch_stop(eff_t effp);
-
-int st_poly_getopts(eff_t effp, int argc, char **argv);
-int st_poly_start(eff_t effp);
-int st_poly_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                 st_size_t *isamp, st_size_t *osamp);
-int st_poly_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_poly_stop(eff_t effp);
-
-int st_rate_getopts(eff_t effp, int argc, char **argv);
-int st_rate_start(eff_t effp);
-int st_rate_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                 st_size_t *isamp, st_size_t *osamp);
-int st_rate_stop(eff_t effp);
-
-int st_repeat_getopts(eff_t effp, int argc, char **argv);
-int st_repeat_start(eff_t effp);
-int st_repeat_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                     st_size_t *isamp, st_size_t *osamp);
-int st_repeat_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_repeat_stop(eff_t effp);
-
-int st_resample_getopts(eff_t effp, int argc, char **argv);
-int st_resample_start(eff_t effp);
-int st_resample_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                     st_size_t *isamp, st_size_t *osamp);
-int st_resample_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_resample_stop(eff_t effp);
-
-int st_reverb_getopts(eff_t effp, int argc, char **argv);
-int st_reverb_start(eff_t effp);
-int st_reverb_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                   st_size_t *isamp, st_size_t *osamp);
-int st_reverb_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_reverb_stop(eff_t effp);
-
-int st_reverse_getopts(eff_t effp, int argc, char **argv);
-int st_reverse_start(eff_t effp);
-int st_reverse_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                    st_size_t *isamp, st_size_t *osamp);
-int st_reverse_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_reverse_stop(eff_t effp);
-
-int st_silence_getopts(eff_t effp, int argc, char **argv);
-int st_silence_start(eff_t effp);
-int st_silence_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                    st_size_t *isamp, st_size_t *osamp);
-int st_silence_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_silence_stop(eff_t effp);
-
-int st_speed_getopts(eff_t effp, int argc, char **argv);
-int st_speed_start(eff_t effp);
-int st_speed_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                  st_size_t *isamp, st_size_t *osamp);
-int st_speed_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_speed_stop(eff_t effp);
-
-int st_stat_getopts(eff_t effp, int argc, char **argv);
-int st_stat_start(eff_t effp);
-int st_stat_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                 st_size_t *isamp, st_size_t *osamp);
-int st_stat_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_stat_stop(eff_t effp);
-
-int st_stretch_getopts(eff_t effp, int argc, char **argv);
-int st_stretch_start(eff_t effp);
-int st_stretch_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                    st_size_t *isamp, st_size_t *osamp);
-int st_stretch_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_stretch_stop(eff_t effp);
-
-int st_swap_getopts(eff_t effp, int argc, char **argv);
-int st_swap_start(eff_t effp);
-int st_swap_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                 st_size_t *isamp, st_size_t *osamp);
-int st_swap_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_swap_stop(eff_t effp);
-
-int st_synth_getopts(eff_t effp, int argc, char **argv);
-int st_synth_start(eff_t effp);
-int st_synth_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                  st_size_t *isamp, st_size_t *osamp);
-int st_synth_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
-int st_synth_stop(eff_t effp);
-
-int st_trim_getopts(eff_t effp, int argc, char **argv);
-int st_trim_start(eff_t effp);
-int st_trim_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                 st_size_t *isamp, st_size_t *osamp);
-int st_trim_stop(eff_t effp);
+/* Needed in sox.c
+ */
 st_size_t st_trim_get_start(eff_t effp);
 void st_trim_clear_start(eff_t effp);
-
-int st_vibro_getopts(eff_t effp, int argc, char **argv);
-int st_vibro_start(eff_t effp);
-int st_vibro_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                  st_size_t *isamp, st_size_t *osamp);
-int st_vibro_stop(eff_t effp);
-
-int st_vol_getopts(eff_t effp, int argc, char **argv);
-int st_vol_start(eff_t effp);
-int st_vol_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
-                st_size_t *isamp, st_size_t *osamp);
-int st_vol_stop(eff_t effp);
 
 #ifdef __cplusplus
 } /* end of extern "C" */
--- a/src/stat.c
+++ b/src/stat.c
@@ -501,3 +501,14 @@
 
    return ST_SUCCESS;
 }
+
+st_effect_t st_stat_effect = {
+  "stat",
+  NULL,
+  ST_EFF_MCHAN | ST_EFF_REPORT,
+  st_stat_getopts,
+  st_stat_start,
+  st_stat_flow,
+  st_stat_drain,
+  st_stat_stop
+};
--- a/src/stretch.c
+++ b/src/stretch.c
@@ -421,3 +421,14 @@
 
     return ST_SUCCESS;
 }
+
+st_effect_t st_stretch_effect = {
+  "stretch",
+  NULL,
+  0,
+  st_stretch_getopts,
+  st_stretch_start,
+  st_stretch_flow,
+  st_stretch_drain,
+  st_stretch_stop
+};
--- a/src/sunaudio.c
+++ b/src/sunaudio.c
@@ -313,4 +313,22 @@
     return (ST_SUCCESS);
 }
 
+/* Sun /dev/audio player */
+static char *sunnames[] = {
+  "sunau",
+  NULL
+};
+
+st_format_t st_sun_format = {
+  sunnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_sunstartread,
+  st_rawread,
+  st_rawstopread,
+  st_sunstartwrite,
+  st_rawwrite,
+  st_rawstopwrite,
+  st_format_nothing_seek
+};
 #endif
--- a/src/swap.c
+++ b/src/swap.c
@@ -196,3 +196,14 @@
         /* nothing to do */
     return (ST_SUCCESS);
 }
+
+st_effect_t st_swap_effect = {
+  "swap",
+  NULL,
+  ST_EFF_MCHAN,
+  st_swap_getopts,
+  st_swap_start,
+  st_swap_flow,
+  st_swap_drain,
+  st_swap_stop
+};
--- a/src/synth.c
+++ b/src/synth.c
@@ -756,6 +756,17 @@
     /* nothing to do */
     return (ST_SUCCESS);
 }
+
+st_effect_t st_synth_effect = {
+  "synth",
+  NULL,
+  ST_EFF_MCHAN,
+  st_synth_getopts,
+  st_synth_start,
+  st_synth_flow,
+  st_synth_drain,
+  st_synth_stop
+};
 /*-------------------------------------------------------------- end of file */
 
 
--- a/src/trim.c
+++ b/src/trim.c
@@ -218,3 +218,14 @@
     trim_t trim = (trim_t)effp->priv;
     trim->start = 0;
 }
+
+st_effect_t st_trim_effect = {
+  "trim",
+  NULL,
+  ST_EFF_MCHAN,
+  st_trim_getopts,
+  st_trim_start,
+  st_trim_flow,
+  st_effect_nothing_drain,
+  st_effect_nothing
+};
--- a/src/tx16w.c
+++ b/src/tx16w.c
@@ -375,3 +375,22 @@
 
     return(ST_SUCCESS);
 }
+
+/* Yamaha TX16W and SY99 waves */
+static char *txwnames[] = {
+  "txw",
+  NULL
+};
+
+st_format_t st_txw_format = {
+   txwnames,
+   NULL,
+   0,
+   st_txwstartread,
+   st_txwread,
+   st_txwstopread,
+   st_txwstartwrite,
+   st_txwwrite,
+   st_txwstopwrite,
+   st_format_nothing_seek
+};
--- a/src/util.c
+++ b/src/util.c
@@ -140,8 +140,8 @@
                           "Filetype was not specified");
                 return(ST_EFMT);
         }
-        for(i = 0; st_formats[i].names; i++) {
-                for(list = st_formats[i].names; *list; list++) {
+        for(i = 0; st_formats[i]->names; i++) {
+                for(list = st_formats[i]->names; *list; list++) {
                         char *s1 = *list, *s2 = formp->filetype;
                         if (! strcmpcase(s1, s2))
                                 break;  /* not a match */
@@ -149,7 +149,7 @@
                 if (! *list)
                         continue;
                 /* Found it! */
-                formp->h = &st_formats[i];
+                formp->h = st_formats[i];
                 return ST_SUCCESS;
         }
         st_fail_errno(formp, ST_EFMT, "File type '%s' is not known",
@@ -167,9 +167,9 @@
 {
         int i, optind;
 
-        for(i = 0; st_effects[i].name; i++)
+        for(i = 0; st_effects[i]->name; i++)
         {
-            char *s1 = st_effects[i].name, *s2 = argv[0];
+            char *s1 = st_effects[i]->name, *s2 = argv[0];
 
             while(*s1 && *s2 && (tolower(*s1) == tolower(*s2)))
                 s1++, s2++;
@@ -177,16 +177,16 @@
                 continue;       /* not a match */
 
             /* Found it! */
-            effp->name = st_effects[i].name;
-            effp->h = &st_effects[i];
+            effp->name = st_effects[i]->name;
+            effp->h = st_effects[i];
 
             optind = 1;
 
             while (optind < argc)
             {
-                for (i = 0; st_effects[i].name; i++)
+                for (i = 0; st_effects[i]->name; i++)
                 {
-                    char *s1 = st_effects[i].name, *s2 = argv[optind];
+                    char *s1 = st_effects[i]->name, *s2 = argv[optind];
                     while (*s1 && *s2 && (tolower(*s1) == tolower(*s2)))
                     s1++, s2++;
                     if (*s1 || *s2)
@@ -218,8 +218,8 @@
 {
         int i;
 
-        for(i = 0; st_effects[i].name; i++) {
-                char *s1 = st_effects[i].name, *s2 = effect_name;
+        for(i = 0; st_effects[i]->name; i++) {
+                char *s1 = st_effects[i]->name, *s2 = effect_name;
 
                 while(*s1 && *s2 && (tolower(*s1) == tolower(*s2)))
                         s1++, s2++;
@@ -227,8 +227,8 @@
                         continue;       /* not a match */
 
                 /* Found it! */
-                effp->name = st_effects[i].name;
-                effp->h = &st_effects[i];
+                effp->name = st_effects[i]->name;
+                effp->h = st_effects[i];
 
                 return ST_SUCCESS;
         }
@@ -245,9 +245,8 @@
 {
         int i;
 
-        for(i = 0; st_effects[i].name; i++) {
-                char *s1 = st_effects[i].name, *s2 = effect_name;
-
+        for(i = 0; st_effects[i]->name; i++) {
+                char *s1 = st_effects[i]->name, *s2 = effect_name;
                 while(*s1 && *s2 && (tolower(*s1) == tolower(*s2)))
                         s1++, s2++;
                 if (*s1 || *s2)
--- a/src/vibro.c
+++ b/src/vibro.c
@@ -136,3 +136,13 @@
     return (ST_SUCCESS);
 }
 
+st_effect_t st_vibro_effect = {
+  "vibro",
+  NULL,
+  0,
+  st_vibro_getopts,
+  st_vibro_start,
+  st_vibro_flow,
+  st_effect_nothing_drain,
+  st_effect_nothing
+};
--- a/src/voc.c
+++ b/src/voc.c
@@ -816,3 +816,22 @@
                 st_writeb(ft, (int)datum); /* high byte of length */
         }
 }
+
+/* Sound Blaster .VOC */
+static char *vocnames[] = {
+  "voc",
+  NULL
+};
+
+st_format_t st_voc_format = {
+  vocnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_vocstartread,
+  st_vocread,
+  st_vocstopread,
+  st_vocstartwrite,
+  st_vocwrite,
+  st_vocstopwrite,
+  st_format_nothing_seek
+};
--- a/src/vol.c
+++ b/src/vol.c
@@ -219,3 +219,14 @@
     }
     return ST_SUCCESS;
 }
+
+st_effect_t st_vol_effect = {
+  "vol",
+  NULL,
+  ST_EFF_MCHAN,
+  st_vol_getopts,
+  st_vol_start,
+  st_vol_flow,
+  st_effect_nothing_drain,
+  st_vol_stop
+};
--- a/src/vorbis.c
+++ b/src/vorbis.c
@@ -458,4 +458,23 @@
         return (ST_SUCCESS);
 }
 
+static char *vorbisnames[] = {
+  "vorbis",
+  "ogg",
+  NULL
+};
+
+st_format_t st_vorbis_format = {
+  vorbisnames,
+  NULL,
+  ST_FILE_STEREO,
+  st_vorbisstartread,
+  st_vorbisread,
+  st_vorbisstopread,
+  st_vorbisstartwrite,
+  st_vorbiswrite,
+  st_vorbisstopwrite,
+  st_format_nothing_seek
+};
+
 #endif /* HAVE_LIBVORBIS */
--- a/src/vox.c
+++ b/src/vox.c
@@ -442,3 +442,20 @@
         return (sample);
       }
 
+static char *voxnames[] = {
+  "vox",
+  NULL
+};
+
+st_format_t st_vox_format = {
+  voxnames,
+  NULL,
+  0,
+  st_voxstartread,
+  st_voxread,
+  st_voxstopread,
+  st_voxstartwrite,
+  st_voxwrite,
+  st_voxstopwrite,
+  st_format_nothing_seek
+};
--- a/src/wav.c
+++ b/src/wav.c
@@ -1778,3 +1778,22 @@
 
     return(ft->st_errno);
 }
+
+/* Microsoftt RIFF */
+static char *wavnames[] = {
+  "wav",
+  NULL
+};
+
+st_format_t st_wav_format = {
+  wavnames,
+  NULL,
+  ST_FILE_STEREO | ST_FILE_SEEK,
+  st_wavstartread,
+  st_wavread,
+  st_wavstopread,
+  st_wavstartwrite,
+  st_wavwrite,
+  st_wavstopwrite,
+  st_wavseek
+};
--- a/src/wve.c
+++ b/src/wve.c
@@ -231,3 +231,22 @@
     st_writew(ft, zero);
     st_writew(ft, zero);
 }
+
+/* Psion .wve */
+static char *wvenames[] = {
+  "wve",
+  NULL
+};
+
+st_format_t st_wve_format = {
+  wvenames,
+  NULL,
+  ST_FILE_SEEK,
+  st_wvestartread,
+  st_wveread,
+  st_rawstopread,
+  st_wvestartwrite,
+  st_wvewrite,
+  st_wvestopwrite,
+  st_wveseek
+};