📄 _sndlib.h
字号:
#ifndef SNDLIB_H#define SNDLIB_H#define SNDLIB_VERSION 20#define SNDLIB_REVISION 0#define SNDLIB_DATE "28-Mar-06"#include <stdio.h>#include <mus-config.h>#if HAVE_UNISTD_H && (!(defined(_MSC_VER))) #include <unistd.h>#endif#include <sys/types.h>#ifndef __cplusplus#if HAVE_STDBOOL_H #include <stdbool.h>#else#ifndef true #define bool int #define true 1 #define false 0#endif#endif#endif#if (defined(SIZEOF_OFF_T) && (SIZEOF_OFF_T > 4)) || (defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS == 64)) #if (SIZEOF_OFF_T == SIZEOF_LONG) #define OFF_TD "%ld" #else #define OFF_TD "%lld" #endif#else #define OFF_TD "%d"#endif#ifndef MUS_LITTLE_ENDIAN #if WORDS_BIGENDIAN #define MUS_LITTLE_ENDIAN 0 #else #define MUS_LITTLE_ENDIAN 1 #endif#endif#ifndef c__FUNCTION__#if (HAVE___FUNC__) || (defined(__STDC__) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) #define c__FUNCTION__ __func__#else#ifdef __GNUC__ #define c__FUNCTION__ __FUNCTION__#else #define c__FUNCTION__ ""#endif#endif#endif#if (!defined(M_PI)) #define M_PI 3.14159265358979323846264338327 #define M_PI_2 (M_PI / 2.0)#endif#define POWER_OF_2_P(x) ((((x) - 1) & (x)) == 0)/* from sys/param.h */#ifndef SEEK_SET #define SEEK_SET 0 #define SEEK_END 2#endif#if (!SNDLIB_USE_FLOATS) #define mus_sample_t int #ifndef MUS_SAMPLE_BITS #define MUS_SAMPLE_BITS 24 #endif #define MUS_SAMPLE_0 0 #define MUS_BYTE_TO_SAMPLE(n) ((mus_sample_t)((n) << (MUS_SAMPLE_BITS - 8))) #define MUS_SAMPLE_TO_BYTE(n) ((n) >> (MUS_SAMPLE_BITS - 8)) #define MUS_SHORT_TO_SAMPLE(n) ((mus_sample_t)((n) << (MUS_SAMPLE_BITS - 16))) #define MUS_SAMPLE_TO_SHORT(n) ((short)((n) >> (MUS_SAMPLE_BITS - 16))) #if (MUS_SAMPLE_BITS < 24) #define MUS_INT24_TO_SAMPLE(n) ((mus_sample_t)((n) >> (24 - MUS_SAMPLE_BITS))) #define MUS_SAMPLE_TO_INT24(n) ((int)((n) << (24 - MUS_SAMPLE_BITS))) #else #define MUS_INT24_TO_SAMPLE(n) ((mus_sample_t)((n) << (MUS_SAMPLE_BITS - 24))) #define MUS_SAMPLE_TO_INT24(n) ((int)((n) >> (MUS_SAMPLE_BITS - 24))) #endif #define MUS_INT_TO_SAMPLE(n) ((mus_sample_t)(n)) #define MUS_SAMPLE_TO_INT(n) ((int)(n)) /* these are for direct read/write (no cross-image assumption is made about 32 bit int scaling) */ #define MUS_FLOAT_TO_FIX ((MUS_SAMPLE_BITS < 32) ? (1 << (MUS_SAMPLE_BITS - 1)) : 0x7fffffff) #define MUS_FIX_TO_FLOAT (1.0 / (float)(MUS_FLOAT_TO_FIX)) #define MUS_FLOAT_TO_SAMPLE(n) ((mus_sample_t)((n) * MUS_FLOAT_TO_FIX)) #define MUS_SAMPLE_TO_FLOAT(n) ((float)((n) * MUS_FIX_TO_FLOAT)) #define MUS_DOUBLE_TO_SAMPLE(n) ((mus_sample_t)((n) * MUS_FLOAT_TO_FIX)) #define MUS_SAMPLE_TO_DOUBLE(n) ((double)((n) * MUS_FIX_TO_FLOAT)) #define MUS_SAMPLE_MAX ((mus_sample_t)((MUS_SAMPLE_BITS < 32) ? (MUS_FLOAT_TO_FIX - 1) : 0x7fffffff)) #define MUS_SAMPLE_MIN ((mus_sample_t)((MUS_SAMPLE_BITS < 32) ? (-(MUS_FLOAT_TO_FIX)) : -0x7fffffff)) #define mus_sample_abs(Sample) abs(Sample)#else #define mus_sample_t Float #ifndef MUS_SAMPLE_BITS #define MUS_SAMPLE_BITS 24 #endif #define MUS_SAMPLE_0 0.0 #define MUS_BYTE_TO_SAMPLE(n) ((mus_sample_t)((Float)(n) / (Float)(1 << 7))) #define MUS_SHORT_TO_SAMPLE(n) ((mus_sample_t)((Float)(n) / (Float)(1 << 15))) #define MUS_INT_TO_SAMPLE(n) ((mus_sample_t)((Float)(n) / (Float)(1 << (MUS_SAMPLE_BITS - 1)))) #define MUS_INT24_TO_SAMPLE(n) ((mus_sample_t)((Float)(n) / (Float)(1 << 23))) #define MUS_FLOAT_TO_FIX 1.0 #define MUS_FIX_TO_FLOAT 1.0 #define MUS_FLOAT_TO_SAMPLE(n) ((mus_sample_t)(n)) #define MUS_DOUBLE_TO_SAMPLE(n) ((mus_sample_t)(n)) #define MUS_SAMPLE_TO_FLOAT(n) ((Float)(n)) #define MUS_SAMPLE_TO_DOUBLE(n) ((double)(n)) #define MUS_SAMPLE_TO_INT(n) ((int)((n) * (1 << (MUS_SAMPLE_BITS - 1)))) #define MUS_SAMPLE_TO_INT24(n) ((int)((n) * (1 << 23))) #define MUS_SAMPLE_TO_SHORT(n) ((short)((n) * (1 << 15))) #define MUS_SAMPLE_TO_BYTE(n) ((char)((n) * (1 << 7))) #define MUS_SAMPLE_MAX 0.99999 #define MUS_SAMPLE_MIN (-1.0) #define mus_sample_abs(Sample) fabs(Sample)#endifenum {MUS_UNSUPPORTED, MUS_NEXT, MUS_AIFC, MUS_RIFF, MUS_BICSF, MUS_NIST, MUS_INRS, MUS_ESPS, MUS_SVX, MUS_VOC, MUS_SNDT, MUS_RAW, MUS_SMP, MUS_AVR, MUS_IRCAM, MUS_SD1, MUS_SPPACK, MUS_MUS10, MUS_HCOM, MUS_PSION, MUS_MAUD, MUS_IEEE, MUS_MATLAB, MUS_ADC, MUS_MIDI, MUS_SOUNDFONT, MUS_GRAVIS, MUS_COMDISCO, MUS_GOLDWAVE, MUS_SRFS, MUS_MIDI_SAMPLE_DUMP, MUS_DIAMONDWARE, MUS_ADF, MUS_SBSTUDIOII, MUS_DELUSION, MUS_FARANDOLE, MUS_SAMPLE_DUMP, MUS_ULTRATRACKER, MUS_YAMAHA_SY85, MUS_YAMAHA_TX16W, MUS_DIGIPLAYER, MUS_COVOX, MUS_AVI, MUS_OMF, MUS_QUICKTIME, MUS_ASF, MUS_YAMAHA_SY99, MUS_KURZWEIL_2000, MUS_AIFF, MUS_PAF, MUS_CSL, MUS_FILE_SAMP, MUS_PVF, MUS_SOUNDFORGE, MUS_TWINVQ, MUS_AKAI4, MUS_IMPULSETRACKER, MUS_KORG, MUS_NVF, MUS_MAUI, MUS_SDIF, MUS_OGG, MUS_FLAC, MUS_SPEEX, MUS_MPEG, MUS_SHORTEN, MUS_TTA, MUS_WAVPACK, MUS_NUM_HEADER_TYPES};#if defined(__GNUC__) && (!(defined(__cplusplus))) #define MUS_HEADER_TYPE_OK(n) ({ int _sndlib_h_0 = n; ((_sndlib_h_0 > MUS_UNSUPPORTED) && (_sndlib_h_0 <= MUS_MAUI)); })#else #define MUS_HEADER_TYPE_OK(n) (((n) > MUS_UNSUPPORTED) && ((n) <= MUS_MAUI))#endifenum {MUS_UNKNOWN, MUS_BSHORT, MUS_MULAW, MUS_BYTE, MUS_BFLOAT, MUS_BINT, MUS_ALAW, MUS_UBYTE, MUS_B24INT, MUS_BDOUBLE, MUS_LSHORT, MUS_LINT, MUS_LFLOAT, MUS_LDOUBLE, MUS_UBSHORT, MUS_ULSHORT, MUS_L24INT, MUS_BINTN, MUS_LINTN, MUS_BFLOAT_UNSCALED, MUS_LFLOAT_UNSCALED, MUS_BDOUBLE_UNSCALED, MUS_LDOUBLE_UNSCALED, MUS_NUM_DATA_FORMATS};/* MUS_LINTN and MUS_BINTN refer to 32 bit ints with 31 bits of "fraction" -- the data is "left justified" *//* "unscaled" means the float value is used directly (i.e. not as -1.0 to 1.0, but (probably) -32768.0 to 32768.0) */#if defined(__GNUC__) && (!(defined(__cplusplus))) #define MUS_DATA_FORMAT_OK(n) ({ int _sndlib_h_1 = n; ((_sndlib_h_1 > MUS_UNKNOWN) && (_sndlib_h_1 < MUS_NUM_DATA_FORMATS)); })#else #define MUS_DATA_FORMAT_OK(n) (((n) > MUS_UNKNOWN) && ((n) < MUS_NUM_DATA_FORMATS))#endif#if MUS_MAC_OSX #if MUS_LITTLE_ENDIAN #define MUS_AUDIO_COMPATIBLE_FORMAT MUS_LFLOAT #else #define MUS_AUDIO_COMPATIBLE_FORMAT MUS_BFLOAT #endif#else #if MUS_LITTLE_ENDIAN #define MUS_AUDIO_COMPATIBLE_FORMAT MUS_LSHORT #else #define MUS_AUDIO_COMPATIBLE_FORMAT MUS_BSHORT #endif#endif#define MUS_NIST_SHORTPACK 2#define MUS_AIFF_IMA_ADPCM 99#define MUS_AUDIO_PACK_SYSTEM(n) ((n) << 16)#define MUS_AUDIO_SYSTEM(n) (((n) >> 16) & 0xffff)#define MUS_AUDIO_DEVICE(n) ((n) & 0xffff)enum {MUS_AUDIO_DEFAULT, MUS_AUDIO_DUPLEX_DEFAULT, MUS_AUDIO_ADAT_IN, MUS_AUDIO_AES_IN, MUS_AUDIO_LINE_OUT, MUS_AUDIO_LINE_IN, MUS_AUDIO_MICROPHONE, MUS_AUDIO_SPEAKERS, MUS_AUDIO_DIGITAL_IN, MUS_AUDIO_DIGITAL_OUT, MUS_AUDIO_DAC_OUT, MUS_AUDIO_ADAT_OUT, MUS_AUDIO_AES_OUT, MUS_AUDIO_DAC_FILTER, MUS_AUDIO_MIXER, MUS_AUDIO_LINE1, MUS_AUDIO_LINE2, MUS_AUDIO_LINE3, MUS_AUDIO_AUX_INPUT, MUS_AUDIO_CD, MUS_AUDIO_AUX_OUTPUT, MUS_AUDIO_SPDIF_IN, MUS_AUDIO_SPDIF_OUT, MUS_AUDIO_AMP, MUS_AUDIO_SRATE, MUS_AUDIO_CHANNEL, MUS_AUDIO_FORMAT, MUS_AUDIO_IMIX, MUS_AUDIO_IGAIN, MUS_AUDIO_RECLEV, MUS_AUDIO_PCM, MUS_AUDIO_PCM2, MUS_AUDIO_OGAIN, MUS_AUDIO_LINE, MUS_AUDIO_SYNTH, MUS_AUDIO_BASS, MUS_AUDIO_TREBLE, MUS_AUDIO_PORT, MUS_AUDIO_SAMPLES_PER_CHANNEL, MUS_AUDIO_DIRECTION};/* Snd's recorder uses MUS_AUDIO_DIRECTION to find the size of this list */#if defined(__GNUC__) && (!(defined(__cplusplus))) #define MUS_AUDIO_DEVICE_OK(a) ({ int _sndlib_h_2 = a; ((_sndlib_h_2 >= MUS_AUDIO_DEFAULT) && (_sndlib_h_2 <= MUS_AUDIO_DIRECTION)); })#else #define MUS_AUDIO_DEVICE_OK(a) (((a) >= MUS_AUDIO_DEFAULT) && ((a) <= MUS_AUDIO_DIRECTION))#endif#define MUS_ERROR -1enum {MUS_NO_ERROR, MUS_NO_FREQUENCY, MUS_NO_PHASE, MUS_NO_GEN, MUS_NO_LENGTH, MUS_NO_FREE, MUS_NO_DESCRIBE, MUS_NO_DATA, MUS_NO_SCALER, MUS_MEMORY_ALLOCATION_FAILED, MUS_UNSTABLE_TWO_POLE_ERROR, MUS_CANT_OPEN_FILE, MUS_NO_SAMPLE_INPUT, MUS_NO_SAMPLE_OUTPUT, MUS_NO_SUCH_CHANNEL, MUS_NO_FILE_NAME_PROVIDED, MUS_NO_LOCATION, MUS_NO_CHANNEL, MUS_NO_SUCH_FFT_WINDOW, MUS_UNSUPPORTED_DATA_FORMAT, MUS_HEADER_READ_FAILED, MUS_UNSUPPORTED_HEADER_TYPE, MUS_FILE_DESCRIPTORS_NOT_INITIALIZED, MUS_NOT_A_SOUND_FILE, MUS_FILE_CLOSED, MUS_WRITE_ERROR, MUS_HEADER_WRITE_FAILED, MUS_CANT_OPEN_TEMP_FILE, MUS_INTERRUPTED, MUS_BAD_ENVELOPE, MUS_AUDIO_CHANNELS_NOT_AVAILABLE, MUS_AUDIO_SRATE_NOT_AVAILABLE, MUS_AUDIO_FORMAT_NOT_AVAILABLE, MUS_AUDIO_NO_INPUT_AVAILABLE, MUS_AUDIO_CONFIGURATION_NOT_AVAILABLE, MUS_AUDIO_NO_LINES_AVAILABLE, MUS_AUDIO_WRITE_ERROR, MUS_AUDIO_SIZE_NOT_AVAILABLE, MUS_AUDIO_DEVICE_NOT_AVAILABLE, MUS_AUDIO_CANT_CLOSE, MUS_AUDIO_CANT_OPEN, MUS_AUDIO_READ_ERROR, MUS_AUDIO_AMP_NOT_AVAILABLE, MUS_AUDIO_CANT_WRITE, MUS_AUDIO_CANT_READ, MUS_AUDIO_NO_READ_PERMISSION, MUS_CANT_CLOSE_FILE, MUS_ARG_OUT_OF_RANGE, MUS_MIDI_OPEN_ERROR, MUS_MIDI_READ_ERROR, MUS_MIDI_WRITE_ERROR, MUS_MIDI_CLOSE_ERROR, MUS_MIDI_INIT_ERROR, MUS_MIDI_MISC_ERROR, MUS_NO_CHANNELS, MUS_NO_HOP, MUS_NO_WIDTH, MUS_NO_FILE_NAME, MUS_NO_RAMP, MUS_NO_RUN, MUS_NO_INCREMENT, MUS_NO_OFFSET, MUS_NO_XCOEFF, MUS_NO_YCOEFF, MUS_NO_XCOEFFS, MUS_NO_YCOEFFS, MUS_NO_RESET, MUS_INITIAL_ERROR_TAG};/* keep this list in sync with mus_error_names in sound.c and snd-test.scm|rb */#if MUS_DEBUGGING #define CALLOC(a, b) mem_calloc((a), (b), c__FUNCTION__, __FILE__, __LINE__) #define MALLOC(a) mem_malloc((a), c__FUNCTION__, __FILE__, __LINE__)#ifndef __cplusplus #define FREE(a) a = mem_free(a, c__FUNCTION__, __FILE__, __LINE__)#else #define FREE(a) mem_free(a, c__FUNCTION__, __FILE__, __LINE__)#endif #define REALLOC(a, b) mem_realloc(a, (b), c__FUNCTION__, __FILE__, __LINE__)#else #define CALLOC(a, b) calloc((size_t)(a), (size_t)(b)) #define MALLOC(a) malloc((size_t)(a)) #define FREE(a) free(a) #define REALLOC(a, b) realloc(a, (size_t)(b))#endif#if MUS_WINDOZE #ifdef FOPEN #undef FOPEN #endif #if USE_SND #define OPEN(File, Flags, Mode) snd_open((File), (Flags), 0) #else #define OPEN(File, Flags, Mode) open((File), (Flags)) #endif#else #if USE_SND #define OPEN(File, Flags, Mode) snd_open((File), (Flags), (Mode)) #else #define OPEN(File, Flags, Mode) open((File), (Flags), (Mode)) #endif#endif#if USE_SND #define FOPEN(File, Flags) snd_fopen((File), (Flags)) #define CREAT(File, Flags) snd_creat((File), (Flags)) #define REMOVE(OldF) snd_remove(OldF, IGNORE_CACHE) #define STRERROR(Err) snd_io_strerror() #define CLOSE(Fd, Name) snd_close(Fd, Name) #define FCLOSE(Fd, Name) snd_fclose(Fd, Name)#else #define FOPEN(File, Flags) fopen((File), (Flags)) #define CREAT(File, Flags) creat((File), (Flags)) #define REMOVE(OldF) remove(OldF) #define STRERROR(Err) strerror(Err) #define CLOSE(Fd, Name) close(Fd) #define FCLOSE(Fd, Name) fclose(Fd)#endif#ifndef S_setB #if HAVE_RUBY #define S_setB "set_" #endif #if HAVE_SCHEME #define S_setB "set! " #endif #if HAVE_FORTH #define S_setB "set-" #endif #if (!HAVE_EXTENSION_LANGUAGE) #define S_setB "set-" #endif#endif#define MUS_LOOP_INFO_SIZE 8#ifndef Float #define Float float#endif#ifdef __cplusplusextern "C" {#endif/* -------- sound.c -------- */#ifdef __GNUC__ int mus_error(int error, const char *format, ...) __attribute__ ((format (printf, 2, 3))); void mus_print(const char *format, ...) __attribute__ ((format (printf, 1, 2))); char *mus_format(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -