695 lines
31 KiB
ObjectPascal
695 lines
31 KiB
ObjectPascal
{This unit is part of United Openlibraries of Sound (uos)}
|
|
|
|
{This is the Pascal Wrapper + Dynamic loading of Opus library.
|
|
Load library with op_load() and release with op_unload().
|
|
License : modified LGPL.
|
|
Fred van Stappen / fiens@hotmail.com}
|
|
|
|
unit uos_opus;
|
|
|
|
{$mode objfpc}{$H+}
|
|
{$PACKRECORDS C}
|
|
{$PACKENUM 4}(* use 4-byte enums *)
|
|
|
|
interface
|
|
|
|
uses
|
|
dynlibs, CTypes, SysUtils;
|
|
|
|
const
|
|
OPUS_OK = 0;
|
|
OPUS_BAD_ARG = -1;
|
|
OPUS_BUFFER_TOO_SMALL = -2;
|
|
OPUS_INTERNAL_ERROR = -3;
|
|
OPUS_INVALID_PACKET = -4;
|
|
OPUS_UNIMPLEMENTED = -5;
|
|
OPUS_INVALID_STATE = -6;
|
|
OPUS_ALLOC_FAIL = -7;
|
|
|
|
OPUS_APPLICATION_VOIP = 2048;
|
|
OPUS_APPLICATION_AUDIO = 2049;
|
|
OPUS_APPLICATION_RESTRICTED_LOWDELAY = 2051;
|
|
|
|
OPUS_SIGNAL_VOICE = 3001; // Signal being encoded is voice
|
|
OPUS_SIGNAL_MUSIC = 3002; // Signal being encoded is music
|
|
|
|
OPUS_BANDWIDTH_NARROWBAND = 1101; // 4 kHz bandpass @hideinitializer
|
|
OPUS_BANDWIDTH_MEDIUMBAND = 1102; // 6 kHz bandpass @hideinitializer
|
|
OPUS_BANDWIDTH_WIDEBAND = 1103; // 8 kHz bandpass @hideinitializer
|
|
OPUS_BANDWIDTH_SUPERWIDEBAND = 1104; // 12 kHz bandpass @hideinitializer
|
|
OPUS_BANDWIDTH_FULLBAND = 1105; // 20 kHz bandpass @hideinitializer
|
|
|
|
OPUS_FRAMESIZE_ARG = 5000; // Select frame size from the argument (default)
|
|
OPUS_FRAMESIZE_2_5_MS = 5001; // Use 2.5 ms frames
|
|
OPUS_FRAMESIZE_5_MS = 5002; // Use 5 ms frames
|
|
OPUS_FRAMESIZE_10_MS = 5003; // Use 10 ms frames
|
|
OPUS_FRAMESIZE_20_MS = 5004; // Use 20 ms frames
|
|
OPUS_FRAMESIZE_40_MS = 5005; // Use 40 ms frames
|
|
OPUS_FRAMESIZE_60_MS = 5006; // Use 60 ms frames
|
|
|
|
const
|
|
OPUS_SET_APPLICATION_REQUEST = 4000;
|
|
OPUS_GET_APPLICATION_REQUEST = 4001;
|
|
OPUS_SET_BITRATE_REQUEST = 4002;
|
|
OPUS_GET_BITRATE_REQUEST = 4003;
|
|
OPUS_SET_MAX_BANDWIDTH_REQUEST = 4004;
|
|
OPUS_GET_MAX_BANDWIDTH_REQUEST = 4005;
|
|
OPUS_SET_VBR_REQUEST = 4006;
|
|
OPUS_GET_VBR_REQUEST = 4007;
|
|
OPUS_SET_BANDWIDTH_REQUEST = 4008;
|
|
OPUS_GET_BANDWIDTH_REQUEST = 4009;
|
|
OPUS_SET_COMPLEXITY_REQUEST = 4010;
|
|
OPUS_GET_COMPLEXITY_REQUEST = 4011;
|
|
OPUS_SET_INBAND_FEC_REQUEST = 4012;
|
|
OPUS_GET_INBAND_FEC_REQUEST = 4013;
|
|
OPUS_SET_PACKET_LOSS_PERC_REQUEST = 4014;
|
|
OPUS_GET_PACKET_LOSS_PERC_REQUEST = 4015;
|
|
OPUS_SET_DTX_REQUEST = 4016;
|
|
OPUS_GET_DTX_REQUEST = 4017;
|
|
OPUS_SET_VBR_CONSTRAINT_REQUEST = 4020;
|
|
OPUS_GET_VBR_CONSTRAINT_REQUEST = 4021;
|
|
OPUS_SET_FORCE_CHANNELS_REQUEST = 4022;
|
|
OPUS_GET_FORCE_CHANNELS_REQUEST = 4023;
|
|
OPUS_SET_SIGNAL_REQUEST = 4024;
|
|
OPUS_GET_SIGNAL_REQUEST = 4025;
|
|
OPUS_GET_LOOKAHEAD_REQUEST = 4027;
|
|
OPUS_RESET_STATE_REQUEST = 4028;
|
|
OPUS_GET_SAMPLE_RATE_REQUEST = 4029;
|
|
OPUS_GET_FINAL_RANGE_REQUEST = 4031;
|
|
OPUS_GET_PITCH_REQUEST = 4033;
|
|
OPUS_SET_GAIN_REQUEST = 4034;
|
|
OPUS_GET_GAIN_REQUEST = 4045;
|
|
OPUS_SET_LSB_DEPTH_REQUEST = 4036;
|
|
OPUS_GET_LSB_DEPTH_REQUEST = 4037;
|
|
OPUS_GET_LAST_PACKET_DURATION_REQUEST = 4039;
|
|
OPUS_SET_EXPERT_FRAME_DURATION_REQUEST = 4040;
|
|
OPUS_GET_EXPERT_FRAME_DURATION_REQUEST = 4041;
|
|
OPUS_SET_PREDICTION_DISABLED_REQUEST = 4042;
|
|
OPUS_GET_PREDICTION_DISABLED_REQUEST = 4043;
|
|
OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST = 5120;
|
|
OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST = 5122;
|
|
|
|
type
|
|
TOpusEncoder = Pointer;
|
|
TOpusDecoder = Pointer;
|
|
TOpusRepacketizer = Pointer;
|
|
TOpusMSDecoder = pointer;
|
|
TOpusMSEncoder = pointer;
|
|
|
|
TOpusFrames = array [0..47] of Pointer;
|
|
TOpusFrameSizes = array [0..47] of cint;
|
|
|
|
type
|
|
TRequestValueType = (orPointer, orInteger, orXY, orNoValue);
|
|
TOpusCTLRequestRecord = record
|
|
Request: Word;
|
|
case ReqType: TRequestValueType of
|
|
orPointer: (PtrValue: Pointer);
|
|
orInteger: (IntValue: cint);
|
|
orXY: (XValue: cint; YValue: pointer);
|
|
end;
|
|
|
|
var
|
|
opus_get_version_string: function(): PAnsiChar; cdecl; opus_strerror: function(error: cint): PAnsiChar; cdecl;
|
|
opus_encode: function(st: TOpusEncoder; pcm : pcfloat; frame_size: cint;
|
|
var data; max_data_bytes: cint): cint; cdecl;
|
|
opus_encode_float: function(st: TOpusEncoder; pcm : pcfloat; frame_size: cint; var data; max_data_bytes: cint): cint; cdecl;
|
|
opus_encoder_create: function(Fs: cint; channels, application: cint; out error: cint): TOpusEncoder; cdecl;
|
|
|
|
opus_encoder_ctli: function(st: TOpusEncoder; const reqrequest: word ; reqval : cint ): cint; cdecl;
|
|
opus_encoder_ctlp: function(st: TOpusEncoder; const reqrequest: word ; reqval : pointer ): cint; cdecl;
|
|
opus_encoder_ctlxy: function(st: TOpusEncoder; const reqrequest: word ; reqx : cint ; reqy : pointer ): cint; cdecl;
|
|
opus_encoder_ctln: function(st: TOpusEncoder; const reqrequest: word): cint; cdecl;
|
|
|
|
opus_encoder_destroy: procedure(st: TOpusEncoder); cdecl;
|
|
opus_encoder_get_size: function(channels: cint): cint; cdecl;
|
|
opus_encoder_init: function(st: TOpusEncoder; Fs: cint; channels, application: cint): cint; cdecl;
|
|
|
|
opus_decode: function(st: TOpusDecoder; const data; len: cint; pcm : pcfloat; frame_size, decode_fec: cint): cint; cdecl;
|
|
opus_decode_float: function(st: TOpusDecoder; const data; len: cint; pcm : pcfloat; frame_size, decode_fec: cint): cint; cdecl;
|
|
opus_decoder_create: function(fs: cint; channels: cint; out error: cint): TOpusDecoder; cdecl;
|
|
|
|
opus_decoder_ctli: function(st: TOpusDecoder; const reqrequest: word ; reqval : cint ): cint; cdecl;
|
|
opus_decoder_ctlp: function(st: TOpusDecoder; const reqrequest: word ; reqval : pointer ): cint; cdecl;
|
|
opus_decoder_ctlxy: function(st: TOpusDecoder; const reqrequest: word ; reqx : cint ; reqy : pointer ): cint; cdecl;
|
|
opus_decoder_ctln: function(st: TOpusDecoder; const reqrequest: word): cint; cdecl;
|
|
|
|
opus_decoder_destroy: procedure(st: TOpusDecoder); cdecl;
|
|
opus_decoder_get_nb_samples: function(st: TOpusDecoder; const packet; len: cint): cint; cdecl;
|
|
opus_decoder_get_size: function(channels: cint): cint; cdecl;
|
|
opus_decoder_init: function(st: TOpusDecoder; Fs: cint; channels: cint): cint; cdecl;
|
|
opus_packet_get_bandwidth: function(const packet): cint; cdecl;
|
|
opus_packet_get_nb_channels: function(const packet): cint; cdecl;
|
|
opus_packet_get_nb_frames: function(const packet; len: cint): cint; cdecl;
|
|
opus_packet_get_nb_samples: function(const packet; len, fs: cint): cint; cdecl;
|
|
opus_packet_get_samples_per_frame: function(const packet; fs: cint): cint; cdecl;
|
|
opus_packet_parse: function(const packet; var out_toc: Pointer; var frames: TOpusFrames; var size: TOpusFrameSizes; var payload_offset: cint): cint; cdecl;
|
|
opus_pcm_soft_clip: procedure(pcm : pcfloat; frame_size, channels: cint; var softclip_mem: Double); cdecl;
|
|
|
|
opus_multistream_packet_pad: function(var data; len, new_len, nb_streams: cint): cint; cdecl;
|
|
opus_multistream_packet_unpad: function(var data; len, nb_streams: cint): cint; cdecl;
|
|
opus_packet_pad: function(var data; len, new_len: cint): cint; cdecl;
|
|
opus_packet_unpad: function(var data; len: cint): cint; cdecl;
|
|
opus_repacketizer_cat: function(rp: TOpusRepacketizer; const data; len: cint): cint; cdecl;
|
|
opus_repacketizer_create: function: TOpusRepacketizer; cdecl;
|
|
opus_repacketizer_destroy: procedure(rp: TOpusRepacketizer); cdecl;
|
|
opus_repacketizer_get_nb_frames: function(rp: TOpusRepacketizer): cint; cdecl;
|
|
opus_repacketizer_get_size: function: cint; cdecl;
|
|
opus_repacketizer_init: function(rp: TOpusRepacketizer): TOpusRepacketizer; cdecl;
|
|
opus_repacketizer_out: function(rp: TOpusRepacketizer; var data; maxlen: cint): cint; cdecl;
|
|
opus_repacketizer_out_range: function(rp: TOpusRepacketizer; var data; maxlen: cint): cint; cdecl;
|
|
|
|
opus_multistream_decode: function(st: TOpusMSDecoder; const data; len: cint; pcm : pcfloat; frame_size, decode_fec: cint): cint; cdecl;
|
|
opus_multistream_decode_float: function(st: TOpusMSDecoder; const data; len: cint; pcm : pcfloat; frame_size, decode_fec: cint): cint; cdecl;
|
|
opus_multistream_decoder_create: function(fs: cint; channels, streams, coupled_streams: cint; const mapping: array of Byte; out error: cint): TOpusMSDecoder; cdecl;
|
|
|
|
opus_multistream_decoder_ctli: function(st: TOpusMSDecoder; const reqrequest: word ; reqval : cint ): cint; cdecl;
|
|
opus_multistream_decoder_ctlp: function(st: TOpusMSDecoder; const reqrequest: word ; reqval : pointer ): cint; cdecl;
|
|
opus_multistream_decoder_ctlxy: function(st: TOpusMSDecoder; const reqrequest: word ; reqx : cint ; reqy : pointer ): cint; cdecl;
|
|
opus_multistream_decoder_ctln: function(st: TOpusMSDecoder; const reqrequest: word): cint; cdecl;
|
|
|
|
opus_multistream_decoder_destroy: procedure(st: TOpusMSDecoder); cdecl;
|
|
opus_multistream_decoder_get_size: function(streams, coupled_streams: cint): cint; cdecl;
|
|
opus_multistream_decoder_init: function(st: TOpusMSDecoder; fs: cint; channels, streams, coupled_streams: cint; const mapping: array of Byte): cint; cdecl;
|
|
|
|
opus_multistream_encode: function(st: TOpusMSEncoder; pcm : pcfloat; frame_size: cint; var data; max_data_bytes: cint): cint; cdecl;
|
|
opus_multistream_encode_float: function(st: TOpusMSEncoder; pcm : pcfloat; frame_size: cint; var data; max_data_bytes: cint): cint; cdecl;
|
|
opus_multistream_encoder_create: function(Fs: cint; channels, streams, coupled_streams: cint; const mapping: array of Byte; application: cint; out error: cint): TOpusMSEncoder; cdecl;
|
|
|
|
opus_multistream_encoder_ctli: function(st: TOpusMSEncoder; const reqrequest: word ; reqval : cint ): cint; cdecl;
|
|
opus_multistream_encoder_ctlp: function(st: TOpusMSEncoder; const reqrequest: word ; reqval : pointer ): cint; cdecl;
|
|
opus_multistream_encoder_ctlxy: function(st: TOpusMSEncoder; const reqrequest: word ; reqx : cint ; reqy : pointer ): cint; cdecl;
|
|
opus_multistream_encoder_ctln: function(st: TOpusMSEncoder; const reqrequest: word ): cint; cdecl;
|
|
|
|
opus_multistream_encoder_destroy: procedure(st: TOpusMSEncoder); cdecl;
|
|
opus_multistream_encoder_get_size: function(streams, coupled_streams: cint): cint; cdecl;
|
|
opus_multistream_encoder_init: function(st: TOpusMSEncoder; fs: cint; channels, streams, coupled_streams: cint; const mapping: array of Byte; application: cint): cint; cdecl;
|
|
|
|
opus_multistream_surround_encoder_create: function(Fs: cint; channels, mapping_family, streams, coupled_streams: cint; const mapping: array of Byte; application: cint; out error: cint): TOpusMSEncoder; cdecl;
|
|
opus_multistream_surround_encoder_get_size: function(channels, mapping_family: cint): cint; cdecl;
|
|
opus_multistream_surround_encoder_init: function(st: TOpusMSEncoder; fs: cint; channels, mapping_family, streams, coupled_streams: cint; const mapping: array of Byte; application: cint): cint; cdecl;
|
|
|
|
function opus_encoder_ctl(st: TOpusEncoder; const req: TOpusCTLRequestRecord): Integer; inline;
|
|
function opus_decoder_ctl(st: TOpusdecoder; const req: TOpusCTLRequestRecord): Integer; inline;
|
|
|
|
function opus_multistream_encoder_ctl(st: TOpusMSEncoder; const req: TOpusCTLRequestRecord): cint; inline;
|
|
function opus_multistream_decoder_ctl(st: TOpusMSdecoder; const req: TOpusCTLRequestRecord): cint; inline;
|
|
|
|
// Macros for opus_encode_ctl.
|
|
function OPUS_GET_APPLICATION(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_BITRATE(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_COMPLEXITY(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_DTX(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_EXPERT_FRAME_DURATION(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_FORCE_CHANNELS(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_LOOKAHEAD(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_LSB_DEPTH(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_MAX_BANDWIDTH(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_PACKET_LOSS_PERC(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_PREDICTION_DISABLED(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_SIGNAL(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_VBR(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_VBR_CONSTRAINT(var x: cint): TOpusCTLRequestRecord; inline;
|
|
|
|
function OPUS_SET_APPLICATION(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_BANDWIDTH(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_BITRATE(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_COMPLEXITY(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_DTX(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_EXPERT_FRAME_DURATION(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_FORCE_CHANNELS(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_INBAND_FEC(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_LSB_DEPTH(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_MAX_BANDWIDTH(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_PACKET_LOSS_PERC(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_PREDICTION_DISABLED(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_SIGNAL(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_VBR(x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_VBR_CONSTRAINT(x: cint): TOpusCTLRequestRecord; inline;
|
|
|
|
// For opus_decoder_ctl and opus_encoder_ctl.
|
|
function OPUS_GET_BANDWIDTH(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_FINAL_RANGE(var x: Cardinal): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_SAMPLE_RATE(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_RESET_STATE: TOpusCTLRequestRecord; inline;
|
|
|
|
// For the opus_decode_ctl.
|
|
function OPUS_GET_GAIN(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_LAST_PACKET_DURATION(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_GET_PITCH(var x: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_SET_GAIN(x: cint): TOpusCTLRequestRecord; inline;
|
|
|
|
function OPUS_MULTISTREAM_GET_DECODER_STATE(x: cint; var y: cint): TOpusCTLRequestRecord; inline;
|
|
function OPUS_MULTISTREAM_GET_ENCODER_STATE(x: cint; var y: cint): TOpusCTLRequestRecord; inline;
|
|
|
|
var op_Handle:TLibHandle=dynlibs.NilHandle;
|
|
|
|
var ReferenceCounter : cardinal = 0;
|
|
|
|
function op_IsLoaded : boolean; inline;
|
|
|
|
Function op_Load(const libfilename:string) :boolean;
|
|
|
|
Procedure op_Unload;
|
|
|
|
implementation
|
|
|
|
function op_IsLoaded: boolean;
|
|
begin
|
|
Result := (op_Handle <> dynlibs.NilHandle);
|
|
end;
|
|
|
|
Procedure op_Unload;
|
|
begin
|
|
// < Reference counting
|
|
if ReferenceCounter > 0 then
|
|
dec(ReferenceCounter);
|
|
if ReferenceCounter > 0 then
|
|
exit;
|
|
// >
|
|
if op_IsLoaded then
|
|
begin
|
|
DynLibs.UnloadLibrary(op_Handle);
|
|
op_Handle:=DynLibs.NilHandle;
|
|
end;
|
|
end;
|
|
|
|
Function op_Load (const libfilename:string) :boolean;
|
|
begin
|
|
Result := False;
|
|
if op_Handle<>0 then
|
|
begin
|
|
Inc(ReferenceCounter);
|
|
result:=true {is it already there ?}
|
|
end else
|
|
begin {go & load the library}
|
|
if Length(libfilename) = 0 then exit;
|
|
op_Handle:=DynLibs.SafeLoadLibrary(libfilename); // obtain the handle we want
|
|
if op_Handle <> DynLibs.NilHandle then
|
|
begin {now we tie the functions to the VARs from above}
|
|
Pointer(opus_get_version_string):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_get_version_string'));
|
|
Pointer(opus_strerror):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_strerror'));
|
|
Pointer(opus_encode):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_encode'));
|
|
Pointer(opus_encode_float):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_encode_float'));
|
|
Pointer(opus_encoder_create):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_encoder_create'));
|
|
|
|
Pointer(opus_encoder_ctli):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_encoder_ctl'));
|
|
Pointer(opus_encoder_ctlp):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_encoder_ctl'));
|
|
Pointer(opus_encoder_ctlxy):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_encoder_ctl'));
|
|
Pointer(opus_encoder_ctln):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_encoder_ctl'));
|
|
|
|
Pointer(opus_encoder_destroy):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_encoder_destroy'));
|
|
Pointer(opus_encoder_get_size):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_encoder_get_size'));
|
|
Pointer(opus_encoder_init):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_encoder_init'));
|
|
Pointer(opus_decode):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_decode'));
|
|
Pointer(opus_decode_float):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_decode_float'));
|
|
Pointer(opus_decoder_create):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_decoder_create'));
|
|
|
|
Pointer(opus_decoder_ctli):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_decoder_ctl'));
|
|
Pointer(opus_decoder_ctlp):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_decoder_ctl'));
|
|
Pointer(opus_decoder_ctlxy):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_decoder_ctl'));
|
|
Pointer(opus_decoder_ctln):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_decoder_ctl'));
|
|
|
|
Pointer(opus_decoder_destroy):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_decoder_destroy'));
|
|
Pointer(opus_decoder_get_nb_samples):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_decoder_get_nb_samples'));
|
|
Pointer(opus_decoder_get_size):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_decoder_get_size'));
|
|
Pointer(opus_decoder_init):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_decoder_init'));
|
|
Pointer(opus_packet_get_bandwidth):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_packet_get_bandwidth'));
|
|
Pointer(opus_packet_get_nb_channels):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_packet_get_nb_channels'));
|
|
Pointer(opus_packet_get_nb_frames):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_packet_get_nb_frames'));
|
|
Pointer(opus_packet_get_nb_samples):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_packet_get_nb_samples'));
|
|
Pointer(opus_packet_get_samples_per_frame):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_packet_get_samples_per_frame'));
|
|
Pointer( opus_packet_parse):=DynLibs.GetProcedureAddress(OP_Handle,PChar(' opus_packet_parse'));
|
|
Pointer(opus_pcm_soft_clip):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_pcm_soft_clip'));
|
|
Pointer(opus_multistream_packet_pad):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_packet_pad'));
|
|
Pointer(opus_multistream_packet_unpad):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_packet_unpad'));
|
|
Pointer(opus_packet_pad):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_packet_pad'));
|
|
Pointer(opus_packet_unpad):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_packet_unpad'));
|
|
Pointer(opus_repacketizer_cat):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_repacketizer_cat'));
|
|
Pointer(opus_repacketizer_create):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_repacketizer_create'));
|
|
Pointer(opus_repacketizer_destroy):=DynLibs.GetProcedureAddress(OP_Handle,PChar('oopus_repacketizer_destroy'));
|
|
Pointer(opus_repacketizer_get_nb_frames):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_repacketizer_get_nb_frames'));
|
|
Pointer(opus_repacketizer_get_size):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_repacketizer_get_size'));
|
|
Pointer(opus_repacketizer_init):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_repacketizer_init'));
|
|
Pointer(opus_repacketizer_out):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_repacketizer_out'));
|
|
Pointer(opus_repacketizer_out_range):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_repacketizer_out_range'));
|
|
Pointer(opus_multistream_decode):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_decode'));
|
|
Pointer(opus_multistream_decode_float):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_decode_float'));
|
|
Pointer(opus_multistream_decoder_create):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_decoder_create'));
|
|
|
|
Pointer(opus_multistream_decoder_ctli):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_decoder_ctl'));
|
|
Pointer(opus_multistream_decoder_ctlp):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_decoder_ctl'));
|
|
Pointer(opus_multistream_decoder_ctlxy):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_decoder_ctl'));
|
|
Pointer(opus_multistream_decoder_ctln):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_decoder_ctl'));
|
|
|
|
Pointer(opus_multistream_decoder_destroy):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_decoder_destroy'));
|
|
Pointer(opus_multistream_decoder_get_size):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_decoder_get_size'));
|
|
Pointer(opus_multistream_decoder_init):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_decoder_init'));
|
|
Pointer(opus_multistream_encode):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_encode'));
|
|
Pointer(opus_multistream_encode_float):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_encode_float'));
|
|
Pointer(opus_multistream_encoder_create):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_encoder_create'));
|
|
|
|
Pointer(opus_multistream_encoder_ctli):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_encoder_ctl'));
|
|
Pointer(opus_multistream_encoder_ctlp):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_encoder_ctl'));
|
|
Pointer(opus_multistream_encoder_ctlxy):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_encoder_ctl'));
|
|
Pointer(opus_multistream_encoder_ctln):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_encoder_ctl'));
|
|
|
|
Pointer(opus_multistream_encoder_destroy):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_encoder_destroy'));
|
|
Pointer(opus_multistream_encoder_get_size):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_encoder_get_size'));
|
|
Pointer(opus_multistream_encoder_init):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_encoder_init'));
|
|
Pointer(opus_multistream_surround_encoder_create):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_surround_encoder_create'));
|
|
Pointer(opus_multistream_surround_encoder_get_size):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_surround_encoder_get_size'));
|
|
Pointer(opus_multistream_surround_encoder_init):=DynLibs.GetProcedureAddress(OP_Handle,PChar('opus_multistream_surround_encoder_init'));
|
|
|
|
end;
|
|
Result := op_IsLoaded;
|
|
ReferenceCounter:=1;
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
function OPUS_GET_APPLICATION(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_APPLICATION_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_BITRATE(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_BITRATE_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_COMPLEXITY(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_COMPLEXITY_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_DTX(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_DTX_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_EXPERT_FRAME_DURATION(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_EXPERT_FRAME_DURATION_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_FORCE_CHANNELS(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_FORCE_CHANNELS_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_LOOKAHEAD(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_LOOKAHEAD_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_LSB_DEPTH(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_LSB_DEPTH_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_MAX_BANDWIDTH(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_MAX_BANDWIDTH_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_PACKET_LOSS_PERC(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_PACKET_LOSS_PERC_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_PREDICTION_DISABLED(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_PREDICTION_DISABLED_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_SIGNAL(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_SIGNAL_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_VBR(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_VBR_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_VBR_CONSTRAINT(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_VBR_CONSTRAINT_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_SET_APPLICATION(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_APPLICATION_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_BANDWIDTH(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_BANDWIDTH_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_BITRATE(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_BITRATE_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_COMPLEXITY(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_COMPLEXITY_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_DTX(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_DTX_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_EXPERT_FRAME_DURATION(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_EXPERT_FRAME_DURATION_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_FORCE_CHANNELS(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_FORCE_CHANNELS_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_INBAND_FEC(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_INBAND_FEC_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_LSB_DEPTH(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_LSB_DEPTH_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_MAX_BANDWIDTH(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_MAX_BANDWIDTH_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_PACKET_LOSS_PERC(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_PACKET_LOSS_PERC_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_PREDICTION_DISABLED(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_PREDICTION_DISABLED_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_SIGNAL(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_SIGNAL_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_VBR(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_VBR_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_SET_VBR_CONSTRAINT(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_VBR_CONSTRAINT_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_GET_BANDWIDTH(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_BANDWIDTH_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_FINAL_RANGE(var x: Cardinal): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_BANDWIDTH_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_SAMPLE_RATE(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_BANDWIDTH_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_RESET_STATE: TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_RESET_STATE_REQUEST;
|
|
Result.ReqType := orNoValue;
|
|
end;
|
|
|
|
function OPUS_GET_GAIN(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_GAIN_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_LAST_PACKET_DURATION(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_LAST_PACKET_DURATION_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_GET_PITCH(var x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_GET_PITCH_REQUEST;
|
|
Result.ReqType := orPointer;
|
|
Result.PtrValue := @x;
|
|
end;
|
|
|
|
function OPUS_SET_GAIN(x: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_SET_GAIN_REQUEST;
|
|
Result.ReqType := orInteger;
|
|
Result.IntValue := x;
|
|
end;
|
|
|
|
function OPUS_MULTISTREAM_GET_DECODER_STATE(x: cint; var y: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST;
|
|
Result.ReqType := orXY;
|
|
Result.XValue := x;
|
|
Result.YValue := @y;
|
|
end;
|
|
|
|
function OPUS_MULTISTREAM_GET_ENCODER_STATE(x: cint; var y: cint): TOpusCTLRequestRecord; inline;
|
|
begin
|
|
Result.Request := OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST;
|
|
Result.ReqType := orXY;
|
|
Result.XValue := x;
|
|
Result.YValue := @y;
|
|
end;
|
|
|
|
function opus_encoder_ctl(st: TOpusEncoder; const req: TOpusCTLRequestRecord): Integer; inline;
|
|
begin
|
|
case req.ReqType of
|
|
orPointer: Result := opus_encoder_ctlp(st, req.Request, req.PtrValue);
|
|
orInteger: Result := opus_encoder_ctli(st, req.Request, req.IntValue);
|
|
orXY: Result := opus_encoder_ctlxy(st, req.Request, req.XValue, req.YValue);
|
|
orNoValue: Result := opus_encoder_ctln(st, req.Request);
|
|
else
|
|
Result := OPUS_BAD_ARG;
|
|
end;
|
|
end;
|
|
|
|
function opus_decoder_ctl(st: TOpusDecoder; const req: TOpusCTLRequestRecord): Integer; inline;
|
|
begin
|
|
case req.ReqType of
|
|
orPointer: Result := opus_decoder_ctlp(st, req.Request, req.PtrValue);
|
|
orInteger: Result := opus_decoder_ctli(st, req.Request, req.IntValue);
|
|
orXY: Result := opus_decoder_ctlxy(st, req.Request, req.XValue, req.YValue);
|
|
orNoValue: Result := opus_decoder_ctln(st, req.Request);
|
|
else
|
|
Result := OPUS_BAD_ARG;
|
|
end;
|
|
end;
|
|
|
|
function opus_multistream_encoder_ctl(st: TOpusMSEncoder; const req: TOpusCTLRequestRecord): Integer; inline;
|
|
begin
|
|
case req.ReqType of
|
|
orPointer: Result := opus_multistream_encoder_ctlp(st, req.Request, req.PtrValue);
|
|
orInteger: Result := opus_multistream_encoder_ctli(st, req.Request, req.IntValue);
|
|
orXY: Result := opus_multistream_encoder_ctlxy(st, req.Request, req.XValue, req.YValue);
|
|
orNoValue: Result := opus_multistream_encoder_ctln(st, req.Request);
|
|
else
|
|
Result := OPUS_BAD_ARG;
|
|
end;
|
|
end;
|
|
|
|
function opus_multistream_decoder_ctl(st: TOpusMSDecoder; const req: TOpusCTLRequestRecord): Integer; inline;
|
|
begin
|
|
case req.ReqType of
|
|
orPointer: Result := opus_multistream_decoder_ctlp(st, req.Request, req.PtrValue);
|
|
orInteger: Result := opus_multistream_decoder_ctli(st, req.Request, req.IntValue);
|
|
orXY: Result := opus_multistream_decoder_ctlxy(st, req.Request, req.XValue, req.YValue);
|
|
orNoValue: Result := opus_multistream_decoder_ctln(st, req.Request);
|
|
else
|
|
Result := OPUS_BAD_ARG;
|
|
end;
|
|
end;
|
|
|
|
end.
|