diff options
author | tobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c> | 2008-02-20 17:56:12 +0000 |
---|---|---|
committer | tobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c> | 2008-02-20 17:56:12 +0000 |
commit | 0e0f6fcc1b26fdb551789b1a2d4d2dc62242ac4d (patch) | |
tree | 731fd56f61b04905976eb4d241a8926b58c32d1c /Game/Code/lib/samplerate | |
parent | b537008299a9632c501b3957c2068359c18a5b7a (diff) | |
download | usdx-0e0f6fcc1b26fdb551789b1a2d4d2dc62242ac4d.tar.gz usdx-0e0f6fcc1b26fdb551789b1a2d4d2dc62242ac4d.tar.xz usdx-0e0f6fcc1b26fdb551789b1a2d4d2dc62242ac4d.zip |
libsamplerate header-files. Ported from C to Pascal by profoX` with some minor fixes by me.
Thank you profoX`.
This might be used as a more accurate (and faster?) alternative to the SDL conversion stuff. In addition SDL does not convert 44.1kHz to 48kHz (or vice versa) at the moment, libsamplerate does. But libsamplerate does not support mono-to-stereo or multi-channel-to-stereo conversion and it just accepts float-values so we have to convert our 16-bit int-values first.
Maybe we should use the callback-style conversion of libsamplerate.
git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@874 b956fd51-792f-4845-bead-9b4dfca2ff2c
Diffstat (limited to 'Game/Code/lib/samplerate')
-rw-r--r-- | Game/Code/lib/samplerate/samplerate.pas | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/Game/Code/lib/samplerate/samplerate.pas b/Game/Code/lib/samplerate/samplerate.pas new file mode 100644 index 00000000..28f1b1bb --- /dev/null +++ b/Game/Code/lib/samplerate/samplerate.pas @@ -0,0 +1,205 @@ +{*
+** Copyright (C) 2002-2004 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+*}
+
+{*
+** API documentation is available here:
+** http://www.mega-nerd.com/SRC/api.html
+*}
+
+unit samplerate;
+
+{$IFDEF FPC}
+ {$IFNDEF win32}
+ {$LINKLIB libsamplerate}
+ {$ENDIF}
+ {$PACKRECORDS C} (* GCC/Visual C/C++ compatible record packing *)
+ {$MODE DELPHI}
+{$ENDIF}
+
+interface
+
+const
+{$IFDEF WIN32}
+ LibName = 'libsamplerate.dll';
+{$ENDIF}
+{$IFDEF LINUX}
+ LibName = 'samplerate';
+{$ENDIF}
+{$IFDEF MACOS}
+ {LibName = 'unknown';}
+{$ENDIF}
+
+{ Opaque data type SRC_STATE. }
+type
+ PSRC_STATE = ^SRC_STATE;
+ SRC_STATE = record
+ end;
+
+{ SRC_DATA is used to pass data to src_simple() and src_process(). }
+type
+ PSRC_DATA = ^SRC_DATA;
+ SRC_DATA = record
+ data_in: Pdouble;
+ data_out: Pdouble;
+ input_frames: longint;
+ output_frames: longint;
+ input_frames_used: longint;
+ output_frames_gen: longint;
+ end_of_input: integer;
+ src_ratio: double;
+ end;
+
+{ SRC_CB_DATA is used with callback based API. }
+type
+ SRC_CB_DATA = record
+ frames: longint;
+ data_in: Psingle;
+ end;
+
+type
+ PPsingle = ^Psingle;
+
+{*
+** User supplied callback function type for use with src_callback_new()
+** and src_callback_read(). First parameter is the same pointer that was
+** passed into src_callback_new(). Second parameter is pointer to a
+** pointer. The user supplied callback function must modify *data to
+** point to the start of the user supplied float array. The user supplied
+** function must return the number of frames that **data points to.
+*}
+src_callback_t = function (cb_data: pointer; data: PPsingle): longint; cdecl;
+
+{*
+** Standard initialisation function : return an anonymous pointer to the
+** internal state of the converter. Choose a converter from the enums below.
+** Error returned in *error.
+*}
+function src_new(converter_type: integer; channels: integer; error: Pinteger): PSRC_STATE; cdecl; external LibName;
+
+{*
+** Initilisation for callback based API : return an anonymous pointer to the
+** internal state of the converter. Choose a converter from the enums below.
+** The cb_data pointer can point to any data or be set to NULL. Whatever the
+** value, when processing, user supplied function "func" gets called with
+** cb_data as first parameter.
+*}
+function src_callback_new(func: src_callback_t; converter_type: integer; channels: integer;
+ error: Pinteger; cb_data: pointer): PSRC_STATE; cdecl; external LibName;
+
+{*
+** Cleanup all internal allocations.
+** Always returns NULL.
+*}
+function src_delete(state: PSRC_STATE): PSRC_STATE; cdecl; external LibName;
+
+{*
+** Standard processing function.
+** Returns non zero on error.
+*}
+function src_process(state: PSRC_STATE; data: PSRC_DATA): integer; cdecl; external LibName;
+
+{*
+** Callback based processing function. Read up to frames worth of data from
+** the converter int *data and return frames read or -1 on error.
+*}
+function src_callback_read(state: PSRC_STATE; src_ratio: double;
+ frames: longint; data: Psingle): longint; cdecl; external LibName;
+
+{*
+** Simple interface for performing a single conversion from input buffer to
+** output buffer at a fixed conversion ratio.
+** Simple interface does not require initialisation as it can only operate on
+** a single buffer worth of audio.
+*}
+function src_simple(data: PSRC_DATA; converter_type: integer; channels: integer): integer; cdecl; external LibName;
+
+{*
+** This library contains a number of different sample rate converters,
+** numbered 0 through N.
+**
+** Return a string giving either a name or a more full description of each
+** sample rate converter or NULL if no sample rate converter exists for
+** the given value. The converters are sequentially numbered from 0 to N.
+*}
+(* Const before type ignored *)
+function src_get_name(converter_type: integer): Pchar; cdecl; external LibName;
+
+(* Const before type ignored *)
+function src_get_description(converter_type: integer): Pchar; cdecl; external LibName;
+
+(* Const before type ignored *)
+function src_get_version(): Pchar; cdecl; external LibName;
+
+{*
+** Set a new SRC ratio. This allows step responses
+** in the conversion ratio.
+** Returns non zero on error.
+*}
+function src_set_ratio(state: PSRC_STATE; new_ratio: double): integer; cdecl; external LibName;
+
+{*
+** Reset the internal SRC state.
+** Does not modify the quality settings.
+** Does not free any memory allocations.
+** Returns non zero on error.
+*}
+function src_reset(state: PSRC_STATE): integer; cdecl; external LibName;
+
+{*
+** Return TRUE if ratio is a valid conversion ratio, FALSE
+** otherwise.
+*}
+function src_is_valid_ratio(ratio: double): integer; cdecl; external LibName;
+
+{*
+** Return an error number.
+*}
+function src_error(state: PSRC_STATE): integer; cdecl; external LibName;
+
+{*
+** Convert the error number into a string.
+*}
+(* Const before type ignored *)
+function src_strerror(error: integer): Pchar; cdecl; external LibName;
+
+{*
+** The following enums can be used to set the interpolator type
+** using the function src_set_converter().
+*}
+type TConverterType = {enum}integer; const
+{enum_begin TConverterType}
+ SRC_SINC_BEST_QUALITY = 0;
+ SRC_SINC_MEDIUM_QUALITY = 1;
+ SRC_SINC_FASTEST = 2;
+ SRC_ZERO_ORDER_HOLD = 3;
+ SRC_LINEAR = 4;
+{enum_end TConverterType}
+
+{*
+** Extra helper functions for converting from short to float and
+** back again.
+*}
+(* Const before type ignored *)
+procedure src_short_to_float_array(input: Psmallint; output: Psingle; len: integer); cdecl; external LibName;
+
+(* Const before type ignored *)
+procedure src_float_to_short_array(input: Psingle; output: Psmallint; len: integer); cdecl; external LibName;
+
+implementation
+
+end.
|