Jump to content
LordJashin

How do DLL's work with SCAR?

Recommended Posts

Been having troubles with this for a long time. For Delphi:

 

How come this doesn't work, even if the file is in the directory. I also tried the full path. MSDN says it should be fine with that path tho:

 

[scar]

var

AdrDLL: HMODULE;

 

procedure OnLoadLib(const SCARExports: PExports); stdcall;

begin

Exp := SCARExports; // Do NOT remove this line!

AdrDLL := 0;

AdrDLL := LoadLibrary('audiere.dll');

end;

[/scar]

 

And how do you do Dynamic loading, it keeps saying that the export statements are in the wrong place and that it didn't expect the end. ?

 

[scar]

 

 

exports OnLoadLib;

exports OnUnloadLib;

exports OnGetFuncCount;

exports OnGetFuncInfo;

exports OnGetTypeCount;

exports OnGetTypeInfo;

exports LibArch;

 

end.

[/scar]

 

0QOB5.png

 

Been trying to use the Audiere sound library. It is licensed under LGPL or w/e. And it is located here: http://audiere.sourceforge.net/

Edited by LordJashin
Link to comment
Share on other sites

It's hard to tell from these fragments what's wrong. As for LoadLibrary, it works. But note that the local path for the plugin is the folder SCAR's in, not the folder where the plugin is located.

 

Alright I'll try messing with it. But this is all in ONE FILE except for those units. And here is the full code:

 

[scar]

//=========================================================================

// Audiere Sound System

// Version 1.9.2

// © 2002 Chad Austin

//

// This API uses principles explained at

// http://aegisknight.org/cppinterface.html

//

// This code licensed under the terms of the LGPL. See the Audiere

// license.txt.

//-------------------------------------------------------------------------

// Delphi Conversion By:

// Jarrod Davis

// Jarrod Davis Software

// http://www.jarroddavis.com - Jarrod Davis Software

// http://www.gamevisionsdk.com - Game Application Framework for Delphi

// support@jarroddavis.com - Support Email

//-------------------------------------------------------------------------

// How to use:

// * Include Audiere in your Uses statement

// * Enable or Disable the DYNAMICS compiler define

// * If Dynamic, be sure to call AdrLoadDLL before using any commands.

// the DLL will be automaticlly unloaded at termination.

// * If Static, then use as normal.

// History:

// * Initial 1.9.2 release.

// + Added dynamic loading. Use the DYNAMIC compiler define to control

// this. When enabled you can then use ArdLoadLL/AdrUnloadDLL to

// dynamiclly load/unload dll at runtime.

//=========================================================================

// DLL adapted for SCAR, all credit goes to Audiere for the system

// And this is all under the same license LGPL

// By LordJashin

 

library AudiereForSCAR;

 

{$A+}

{$Z4}

{$DEFINE DYNAMIC}

 

uses

System.SysUtils,

System.Classes,

Winapi.Windows,

SCARLibSetup in 'Units\SCARLibSetup.pas',

FastShareMem in 'Units\FastShareMem.pas',

SCARUtils in 'Units\SCARUtils.pas';

 

{$R *.res}

 

//------Audiere Code start------------------------------------------------------

 

const

DLL_NAME = 'Audiere.dll'; // probably for the main dll

 

type

 

{ TAdrSeekMode }

TAdrSeekMode = (

Adr_Seek_Begin,

Adr_Seek_Current,

Adr_Seek_End

);

 

{ TAdrSoundEffectType }

TAdrSoundEffectType = (

Adr_SoundEffectType_Single,

Adr_SoundEffectType_Multiple

);

 

{ TAdrSampleFormat }

TAdrSampleFormat = (

Adr_SampleFormat_U8,

Adr_SampleFormat_S16

);

 

{ TAdrFileFormat }

TAdrFileFormat = (

FF_AUTODETECT,

FF_WAV,

FF_OGG,

FF_FLAC,

FF_MP3,

FF_MOD

);

 

{ TAdrRefCounted }

TAdrRefCounted = class

public

procedure Ref; virtual; stdcall; abstract;

procedure UnRef; virtual; stdcall; abstract;

end;

 

{ TAdrFile }

TAdrFile = class(TAdrRefCounted)

public

function Read(aBuffer: Pointer; aSize: Integer): Integer; virtual; stdcall; abstract;

function Seek(aPosition: Integer; aSeekMode: TAdrSeekMode): Boolean; virtual; stdcall; abstract;

function Tell: Integer; virtual; stdcall; abstract;

end;

 

{ TAdrSampleSource }

TAdrSampleSource = class(TAdrRefCounted)

public

procedure GetFormat(var aChannelCount: Integer; var aSampleRate: Integer; var aSampleFormat: TAdrSampleFormat); virtual; stdcall; abstract;

function Read(aFrameCount: Integer; aBuffer: Pointer): Integer; virtual; stdcall; abstract;

procedure Reset; virtual; stdcall; abstract;

function IsSeekable: Boolean; virtual; stdcall; abstract;

function GetLength: Integer; virtual; stdcall; abstract;

procedure SetPosition(Position: Integer); virtual; stdcall; abstract;

function GetPosition: Integer; virtual; stdcall; abstract;

end;

 

{ TAdrOutputStream }

TAdrOutputStream = class(TAdrRefCounted)

public

procedure Play; virtual; stdcall; abstract;

procedure Stop; virtual; stdcall; abstract;

function IsPlaying: Boolean; virtual; stdcall; abstract;

procedure Reset; virtual; stdcall; abstract;

procedure SetRepeat(aRepeat: Boolean); virtual; stdcall; abstract;

function GetRepeat: Boolean; virtual; stdcall; abstract;

procedure SetVolume(aVolume: Single); virtual; stdcall; abstract;

function GetVolume: Single; virtual; stdcall; abstract;

procedure SetPan(aPan: Single); virtual; stdcall; abstract;

function GetPan: Single; virtual; stdcall; abstract;

procedure SetPitchShift(aShift: Single); virtual; stdcall; abstract;

function GetPitchShift: Single; virtual; stdcall; abstract;

function IsSeekable: Boolean; virtual; stdcall; abstract;

function GetLength: Integer; virtual; stdcall; abstract;

procedure SetPosition(aPosition: Integer); virtual; stdcall; abstract;

function GetPosition: Integer; virtual; stdcall; abstract;

end;

 

{ TAdrAudioDevice }

TAdrAudioDevice = class(TAdrRefCounted)

public

procedure Update; virtual; stdcall; abstract;

function OpenStream(aSource: TAdrSampleSource): TAdrOutputStream; virtual; stdcall; abstract;

function OpenBuffer(aSamples: Pointer; aFrameCount, aChannelCount, aSampleRate: Integer; aSampelFormat: TAdrSampleFormat): TAdrOutputStream; virtual; stdcall; abstract;

end;

 

{ TAdrSampleBuffer }

TAdrSampleBuffer = class(TAdrRefCounted)

public

procedure GetFormat(var ChannelCount: Integer; var aSampleRate: Integer; var aSampleFormat: TAdrSampleFormat); virtual; stdcall; abstract;

function GetLength: Integer; virtual; stdcall; abstract;

function GetSamples: Pointer; virtual; stdcall; abstract;

function OpenStream: TAdrSampleSource; virtual; stdcall; abstract;

end;

 

{ TAdrSoundEffect }

TAdrSoundEffect = class(TAdrRefCounted)

public

procedure Play; virtual; stdcall; abstract;

procedure Stop; virtual; stdcall; abstract;

procedure SetVolume(aVolume: Single); virtual; stdcall; abstract;

function GetVolume: Single; virtual; stdcall; abstract;

procedure SetPan(aPan: Single); virtual; stdcall; abstract;

function GetPan: Single; virtual; stdcall; abstract;

procedure SetPitchShift(aShift: Single); virtual; stdcall; abstract;

function GetPitchShift: Single; virtual; stdcall; abstract;

end;

 

{ --- Audiere Routines -------------------------------------------------- }

{$IFNDEF DYNAMIC}

function AdrGetVersion: PChar; stdcall; external DLL_NAME name '_AdrGetVersion@0';

function AdrGetSupportedFileFormats: PChar; stdcall; external DLL_NAME name '_AdrGetSupportedFileFormats@0';

function AdrGetSupportedAudioDevices: PChar; stdcall; external DLL_NAME name '_AdrGetSupportedAudioDevices@0';

function AdrGetSampleSize(aFormat: TAdrSampleFormat): Integer; stdcall; external DLL_NAME name '_AdrGetSampleSize@4';

function AdrOpenDevice(const aName: PChar; const aParams: PChar): TAdrAudioDevice; stdcall; external DLL_NAME name '_AdrOpenDevice@8';

function AdrOpenSampleSource(const aFilename: PChar; aFileFormat: TAdrFileFormat): TAdrSampleSource; stdcall; external DLL_NAME name '_AdrOpenSampleSource@8';

function AdrOpenSampleSourceFromFile(aFile: TAdrFile; aFileFormat: TAdrFileFormat): TAdrSampleSource; stdcall; external DLL_NAME name '_AdrOpenSampleSourceFromFile@8';

function AdrCreateTone(aFrequency: Double): TAdrSampleSource; stdcall; external DLL_NAME name '_AdrCreateTone@8';

function AdrCreateSquareWave(aFrequency: Double): TAdrSampleSource; stdcall; external DLL_NAME name '_AdrCreateSquareWave@8';

function AdrCreateWhiteNoise: TAdrSampleSource; stdcall; external DLL_NAME name '_AdrCreateWhiteNoise@0';

function AdrCreatePinkNoise: TAdrSampleSource; stdcall; external DLL_NAME name '_AdrCreatePinkNoise@0';

function AdrOpenSound(aDevice: TAdrAudioDevice; aSource: TAdrSampleSource; aStreaming: LongBool): TAdrOutputStream; stdcall; external DLL_NAME name '_AdrOpenSound@12';

function AdrCreateSampleBuffer(aSamples: Pointer; aFrameCount, aChannelCount, aSampleRate: Integer; aSampleFormat: TAdrSampleFormat): TAdrSampleBuffer; stdcall; external DLL_NAME name '_AdrCreateSampleBuffer@20';

function AdrCreateSampleBufferFromSource(aSource: TAdrSampleSource): TAdrSampleBuffer; stdcall; external DLL_NAME name '_AdrCreateSampleBufferFromSource@4';

function AdrOpenSoundEffect(aDevice: TAdrAudioDevice; aSource: TAdrSampleSource; aType: TAdrSoundEffectType): TAdrSoundEffect; stdcall; external DLL_NAME name '_AdrOpenSoundEffect@12';

{$ENDIF}

 

{$IFDEF DYNAMIC}

var

AdrGetVersion : function: PChar; stdcall = nil;

AdrGetSupportedFileFormats : function: PChar; stdcall = nil;

AdrGetSupportedAudioDevices : function : PChar; stdcall = nil;

AdrGetSampleSize : function(aFormat: TAdrSampleFormat): Integer; stdcall = nil;

AdrOpenDevice : function(const aName: PChar; const aParams: PChar): TAdrAudioDevice; stdcall = nil;

AdrOpenSampleSource : function(const aFilename: PChar; aFileFormat: TAdrFileFormat): TAdrSampleSource; stdcall = nil;

AdrOpenSampleSourceFromFile : function(aFile: TAdrFile; aFileFormat: TAdrFileFormat): TAdrSampleSource; stdcall = nil;

AdrCreateTone : function(aFrequency: Double): TAdrSampleSource; stdcall = nil;

AdrCreateSquareWave : function(aFrequency: Double): TAdrSampleSource; stdcall = nil;

AdrCreateWhiteNoise : function: TAdrSampleSource; stdcall = nil;

AdrCreatePinkNoise : function: TAdrSampleSource; stdcall = nil;

AdrOpenSound : function(aDevice: TAdrAudioDevice; aSource: TAdrSampleSource; aStreaming: LongBool): TAdrOutputStream; stdcall = nil;

AdrCreateSampleBuffer : function(aSamples: Pointer; aFrameCount, aChannelCount, aSampleRate: Integer; aSampleFormat: TAdrSampleFormat): TAdrSampleBuffer; stdcall = nil;

AdrCreateSampleBufferFromSource: function(aSource: TAdrSampleSource): TAdrSampleBuffer; stdcall = nil;

AdrOpenSoundEffect : function(aDevice: TAdrAudioDevice; aSource: TAdrSampleSource; aType: TAdrSoundEffectType): TAdrSoundEffect; stdcall = nil;

 

function AdrLoadDLL: Boolean; stdcall;

procedure AdrUnloadDLL; stdcall;

{$ENDIF}

 

{$IFDEF DYNAMIC}

 

var

AdrDLL: HMODULE;

 

function AdrLoadDLL: Boolean;

begin

AdrDLL := 0;

Result := False;

 

AdrDLL := LoadLibrary('audiere.dll');

if(AdrDLL = 0) then

begin

Exit;

end;

 

@AdrGetVersion := GetProcAddress(AdrDLL, '_AdrGetVersion@0');

@AdrGetSupportedFileFormats := GetProcAddress(AdrDLL, '_AdrGetSupportedFileFormats@0');

@AdrGetSupportedAudioDevices := GetProcAddress(AdrDLL, '_AdrGetSupportedAudioDevices@0');

@AdrGetSampleSize := GetProcAddress(AdrDLL, '_AdrGetSampleSize@4');

@AdrOpenDevice := GetProcAddress(AdrDLL, '_AdrOpenDevice@8');

@AdrOpenSampleSource := GetProcAddress(AdrDLL, '_AdrOpenSampleSource@8');

@AdrOpenSampleSourceFromFile := GetProcAddress(AdrDLL, '_AdrOpenSampleSourceFromFile@8');

@AdrCreateTone := GetProcAddress(AdrDLL, '_AdrCreateTone@8');

@AdrCreateSquareWave := GetProcAddress(AdrDLL, '_AdrCreateSquareWave@8');

@AdrCreateWhiteNoise := GetProcAddress(AdrDLL, '_AdrCreateWhiteNoise@0');

@AdrCreatePinkNoise := GetProcAddress(AdrDLL, '_AdrCreatePinkNoise@0');

@AdrOpenSound := GetProcAddress(AdrDLL, '_AdrOpenSound@12');

@AdrCreateSampleBuffer := GetProcAddress(AdrDLL, '_AdrCreateSampleBuffer@20');

@AdrCreateSampleBufferFromSource := GetProcAddress(AdrDLL, '_AdrCreateSampleBufferFromSource@4');

@AdrOpenSoundEffect := GetProcAddress(AdrDLL, '_AdrOpenSoundEffect@12');

 

if not Assigned(AdrGetVersion) then Exit;

if not Assigned(AdrGetSupportedFileFormats) then Exit;

if not Assigned(AdrGetSupportedAudioDevices) then Exit;

if not Assigned(AdrGetSampleSize) then Exit;

if not Assigned(AdrOpenDevice) then Exit;

if not Assigned(AdrOpenSampleSource) then Exit;

if not Assigned(AdrOpenSampleSourceFromFile) then Exit;

if not Assigned(AdrCreateTone) then Exit;

if not Assigned(AdrCreateSquareWave) then Exit;

if not Assigned(AdrCreateWhiteNoise) then Exit;

if not Assigned(AdrCreatePinkNoise) then Exit;

if not Assigned(AdrOpenSound) then Exit;

if not Assigned(AdrCreateSampleBuffer) then Exit;

if not Assigned(AdrCreateSampleBufferFromSource) then Exit;

if not Assigned(AdrOpenSoundEffect) then Exit;

 

Result := True;

end;

 

procedure AdrUnloadDLL;

begin

if AdrDLL <> 0 then

begin

FreeLibrary(AdrDLL);

AdrDLL := 0;

end;

end;

 

{$ENDIF}

 

//------Audiere Code End------------------------------------------------------

 

var

Device1: TAdrAudioDevice;

Source1: TAdrSampleSource;

Sound1 : TAdrOutputStream;

 

function PlaySoundEx(Path: string): Boolean; stdcall;

begin

Result := False;

// MessageBox(0, AdrGetVersion, 'Info', MB_OK);

if Sound1.IsPlaying then

begin

Sound1.Stop;

Sound1.unref;

Device1.unref;

Source1.UnRef;

end;

Device1 := AdrOpenDevice('', '');

Source1 := AdrOpenSampleSource(PWideChar(Path), FF_AUTODETECT);

 

 

Sound1 := AdrOpenSound(Device1, Source1, True);

Sound1.Play;

Result := True;

end;

 

//var

//AdrDLL: HMODULE;

 

procedure OnLoadLib(const SCARExports: PExports); stdcall;

begin

Exp := SCARExports; // Do NOT remove this line!

AdrDLL := 0;

AdrDLL := LoadLibrary('audiere.dll');

end;

 

procedure OnUnloadLib; stdcall;

begin

// Called when the library is unloaded

FreeLibrary(AdrDLL);

end;

 

// - Function exports

function OnGetFuncCount: Integer; stdcall;

begin

Result := 1;

end;

 

function OnGetFuncInfo(const Idx: Integer; out ProcAddr: Pointer; out ProcDef: PAnsiChar;

out CallConv: TCallConv): Integer; stdcall;

begin

Result := Idx;

case Idx of

0: begin

ProcAddr := @PlaySoundEx;

ProcDef := 'function PlaySoundEx(Path: string): Boolean;';

CallConv := ccStdCall;

end

else Result := -1;

end;

end;

 

// - Type exports

function OnGetTypeCount: Integer; stdcall;

begin

Result := 0;

end;

 

function OnGetTypeInfo(const Idx: Integer; out TypeName, TypeDef: PAnsiChar): Integer; stdcall;

begin

Result := Idx;

case Idx of

0: begin

{TypeName := 'DIKeyboard';

TypeDef := 'record';}

end

else Result := -1;

end;

end;

 

// - Library architecture

// Do NOT change this!

const

LIBRARY_ARCHITECTURE_LEGACY = 1;

LIBRARY_ARCHITECTURE_MAIN = 2;

 

function LibArch: Integer; stdcall;

begin

Result := LIBRARY_ARCHITECTURE_MAIN;

end;

 

exports OnLoadLib;

exports OnUnloadLib;

exports OnGetFuncCount;

exports OnGetFuncInfo;

exports OnGetTypeCount;

exports OnGetTypeInfo;

exports LibArch;

 

end.

[/scar]

 

EDIT: OKAY I got the LoadLibrary issue fixed. But I am getting an access error when I run the PlaySoundEx function I made.

 

Now I just need to tweak it constantly.

Edited by LordJashin
Link to comment
Share on other sites

Trying to use it with SCAR, and I almost have it working! Just needs to be fine tuned a bit... I think the Delphi bindings were on an older build of the Audiere plugin so I need to update my function i think

 

About audiere -

 

Braindead easy API

Supported file formats: Uncompressed WAV*, Uncompressed AIFF*, Ogg Vorbis*, FLAC*, MP3, MOD, S3M, IT, XM (* supports seeking)

Streaming and buffered audio

Volume, pan, and pitch shift modification

Flat tone, square wave, white noise, and pink noise generation

Runtime enumeration of audio devices and supported file formats

Custom file streams

Python, Delphi, Java, XPCOM (JavaScript in Mozilla) bindings

Link to comment
Share on other sites

Nvm, that library "Audiere" isn't even for the latest Delphi. It probably works with Delphi 2009 or earlier. I tried it with 2010 and couldn't get the program, or DLL to work with Delphi. All over the internet there are threads about it being unstable and crap.

 

So I resorted to the best thing out that I could find. Pretty obvious: THE BASS LIBRARY.

 

Very easy to do, I just wanted to know how to get a library into SCAR correctly and finally got something workin:

 

EDIT: i take that back this library looks better and allows commercial use http://www.libsdl.org/

maybe OpenGL is better though. The Unreal gaming engine uses it.

 

[scar]

program New;

{$L BassForSCAR.dll}

begin

PlaySoundEx('I:\Music\Music\Chevelle - The Red.mp3');

end.

[/scar]

 

plugin code was simple enough too:

 

[scar]

library BassForSCAR;

 

uses

System.SysUtils,

System.Classes,

Winapi.Windows,

SCARLibSetup in 'Units\SCARLibSetup.pas',

FastShareMem in 'Units\FastShareMem.pas',

SCARUtils in 'Units\SCARUtils.pas',

bass in 'bass.pas';

 

{$R *.res}

var

strs: array[0..128] of HSTREAM;

strc: Integer;

 

function PlaySoundEx(Path: string): Boolean; stdcall;

begin

Result := False;

strs[strc] := BASS_StreamCreateFile(False, PChar(Path), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});

BASS_ChannelPlay(strs[strc], False);

if strs[strc] <> 0 then Inc(strc);

end;

 

var

BassAwesomeDLL: HMODULE;

 

procedure OnLoadLib(const SCARExports: PExports); stdcall; export;

begin

Exp := SCARExports; // Do NOT remove this line!

// Called when the library is loaded

BassAwesomeDLL := LoadLibrary('bass.dll');

 

// check the correct BASS was loaded

if (HIWORD(BASS_GetVersion) <> BASSVERSION) then

begin

MessageBox(0,'An incorrect version of BASS.DLL was loaded',nil,MB_ICONERROR);

Halt;

end;

// Initialize audio - default device, 44100hz, stereo, 16 bits

if not BASS_Init(-1, 44100, 0, 0, nil) then

MessageBox(0, PChar('Error initializing audio!' + #13#10 + '(Error code: ' + IntToStr(BASS_ErrorGetCode) + ')'), nil, 0);

strc := 0; // stream count

 

end;

 

procedure OnUnloadLib; stdcall;

var

a: Integer;

begin

if strc > 0 then

for a := 0 to strc - 1 do

BASS_StreamFree(strs[a]);

 

BASS_Free;

FreeLibrary(BassAwesomeDLL);

// Called when the library is unloaded

end;

 

// - Function exports

function OnGetFuncCount: Integer; stdcall;

begin

Result := 1;

end;

 

function OnGetFuncInfo(const Idx: Integer; out ProcAddr: Pointer; out ProcDef: PAnsiChar;

out CallConv: TCallConv): Integer; stdcall;

begin

Result := Idx;

case Idx of

0: begin

ProcAddr := @PlaySoundEx;

ProcDef := 'function PlaySoundEx(Path: string): Boolean;';

CallConv := ccStdCall;

end

else Result := -1;

end;

end;

 

// - Type exports

function OnGetTypeCount: Integer; stdcall;

begin

Result := 0;

end;

 

function OnGetTypeInfo(const Idx: Integer; out TypeName, TypeDef: PAnsiChar): Integer; stdcall;

begin

Result := Idx;

case Idx of

0: begin

{TypeName := 'DIKeyboard';

TypeDef := 'record';}

end

else Result := -1;

end;

end;

 

// - Library architecture

// Do NOT change this!

const

LIBRARY_ARCHITECTURE_LEGACY = 1;

LIBRARY_ARCHITECTURE_MAIN = 2;

 

function LibArch: Integer; stdcall;

begin

Result := LIBRARY_ARCHITECTURE_MAIN;

end;

 

exports OnLoadLib;

exports OnUnloadLib;

exports OnGetFuncCount;

exports OnGetFuncInfo;

exports OnGetTypeCount;

exports OnGetTypeInfo;

exports LibArch;

 

end.

 

 

[/scar]

 

If i spam that code in scar. It'll just keep playing the song again and again. Then when I close SCAR they all stop. This bass library is awesome...

 

could make myself a music player:

 

Too bad this can't be included with SCAR, because of the license. But nothing says I can't make it a plugin for scar...that is open source...

 


   Samples
   Support for WAV/AIFF/MP3/MP2/MP1/OGG and custom generated samples
   Sample streams
   Stream any sample data in 8/16/32 bit, with both "push" and "pull" systems
   File streams
   MP3/MP2/MP1/OGG/WAV/AIFF file streaming
   Internet file streaming
   Stream data from HTTP and FTP servers (inc. Shoutcast, Icecast & Icecast2), with IDN and proxy server support and adjustable buffering
   Custom file streaming
   Stream data from anywhere using any delivery method, with both "push" and "pull" systems
   OS codecs
   ACM, Media Foundation and CoreAudio codec support for additional audio formats
   Multi-channel streaming
   Support for more than plain stereo, including multi-channel OGG/WAV/AIFF files
   MOD music
   Uses the same engine as XMPlay (very accurate, efficient, high quality reproduction), with full support for all effects, filters, stereo samples, DMO effects, etc...
   MO3 music
   MOD music with MP3 or OGG compressed samples (vastly reduced file size with virtually identical sound quality), MO3s are created using the MO3 encoder
   Multiple outputs
   Simultaneously use multiple soundcards, and move channels between them
   Recording
   Flexible recording system, with multiple device support and input selection, (WMA encoding & broadcasting via the add-on, and other formats via BASSenc)
   Decode without playback
   Streams and MOD musics can be outputted in any way you want (encoded, written to disk, streamed across a network, etc...)
   Speaker assignment
   Assign streams and MOD musics to specific speakers to take advantage of hardware capable of more than plain stereo (up to 4 separate stereo outputs with a 7.1 soundcard)
   High precision synchronization
   Synchronize events in your software to the streams and MOD musics, synchronize playback of multiple channels together
   Effects
   Chorus / compressor / distortion / echo / flanger / gargle / parametric eq / reverb
   Custom DSP
   Apply any effects that you want, in any order you want
   32 bit floating-point decoding and processing
   Floating-point decoding/rendering, DSP/FX, and recording
   3D sound
   Play samples/streams/musics in any 3D position
   Flexible
   Small buffers for realtime performance, large buffers for stability, automatic and manual buffer updating, configurable threading, configurable SRC quality
   Expandable
   Add-on system for additional format support and effects (C/C++ API available on request), dynamic plugin loading system, access to underlying DirectSound objects 

Edited by LordJashin
Link to comment
Share on other sites

O.o, yeah i thought i saw bass.dll in there xD.

 

Yeah i think OpenAL is the way to go - http://en.wikipedia.org/wiki/OpenAL

 

I'm gonna try to make a library with that instead. Most parts of it are LGPL...BASS has this little statement in there info:

BASS is free for non-commercial use.

Your products must be end-user products, eg. not components used by other products.

Link to comment
Share on other sites

O.o, yeah i thought i saw bass.dll in there xD.

 

Yeah i think OpenAL is the way to go - http://en.wikipedia.org/wiki/OpenAL

 

I'm gonna try to make a library with that instead. Most parts of it are LGPL...BASS has this little statement in there info:

 

I'm not entirely sure that means you can't make it a SCAR plugin, I think it's more aimed toward component libraries, but I suppose it might cover it. I removed it from SCAR because my old implementation of the library caused some issues and it's not really relevant to SCAR itself anyway.

Link to comment
Share on other sites

It specifically says non comercial though. So ill go with openal.

 

OpenGL is amazing. But I think I want to continue the TPAGod project till i get a better undestanding of thread and drawing

 

Also looked at DirectX and they have have bindings for Delphi too. I wonder if the unreal engine is free for commercial doubt it lol

 

You can debate if SCAR is commercial, but i think under general terms it is. If any paid scripts are made using SCAR and SCAR uses things that are supposively non commercial, that is a problem...

Edited by LordJashin
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
  • Create New...