ref: 012443916146c670f7f9a521c89a45d8b7ab0c7a
dir: /src/handlers.c/
/* * Originally created: July 5, 1991 * Copyright 1991 Lance Norskog And Sundry Contributors * This source code is freely redistributable and may be used for * any purpose. This copyright notice must be maintained. * Lance Norskog And Sundry Contributors are not responsible for * the consequences of using this software. */ #include "st_i.h" #include "btrworth.h" /* * Sound Tools file format and effect tables. */ /* File format handlers. */ /* SGI/Apple AIFF */ static char *aiffnames[] = { "aiff", "aif", (char *) 0 }; /* a-law byte raw */ static char *alnames[] = { "al", (char *) 0 }; #if defined(HAVE_ALSA) /* /dev/snd/pcmXX */ static char *alsanames[] = { "alsa", (char *) 0 }; #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 }; #ifdef ENABLE_GSM /* GSM 06.10 */ static char *gsmnames[] = { "gsm", (char *) 0 }; #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, }; #if defined(HAVE_LIBMAD) || defined(HAVE_LAME) /* MP3 */ static char *mp3names[] = { "mp3", "mp2", (char *) 0, }; #endif static char *nulnames[] = { "nul", (char *) 0, }; #if defined(HAVE_OSS) /* OSS /dev/dsp player */ static char *ossdspnames[] = { "ossdsp", (char *) 0 }; #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 }; #if defined(HAVE_SUNAUDIO) /* Sun /dev/audio player */ static char *sunnames[] = { "sunau", (char *) 0 }; #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 }; #ifdef HAVE_LIBVORBIS /* Ogg Vorbis */ static char *vorbisnames[] = { "vorbis", "ogg", (char *) 0 }; #endif static char *voxnames[] = { "vox", (char *) 0 }; /* 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. */ /* * ST_EFF_CHAN means that the number of channels can change. * ST_EFF_RATE means that the sample rate can change. * ST_EFF_MCHAN means that the effect is coded for multiple channels. * */ 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} };