unit uBass;

interface

uses  Windows,
      bass;

type  pSound = ^tSound;
      tSound = record         //переменная звука
        Stream  : HSTREAM;    //собственно звук
        Loaded  : boolean;    //загружен ли
        Playing : boolean;    //играется ли
        Volume  : single ;    //его громкость
        Time    : longint;    //время игры - на всякий
      end;

function  Init_Sounds ( hWnd : THandle ): Boolean;
procedure Kill_Sounds ( );
procedure Load_Sound  ( var Sound : TSound; FileName : string; vol : single = 1; loop : boolean = false );
procedure Play_Sound  ( var Sound : TSound );
procedure Stop_Sound  ( var Sound : TSound );
procedure Pause_Sound ( var Sound : TSound );
function  Load_Sound_URL  ( var Sound : TSound; URL : string; vol : single = 1; loop : boolean = false ): integer;
procedure Play_Sound_URL  ( var Sound : TSound );
procedure Stop_Sound_URL  ( var Sound : TSound );
procedure Pause_Sound_URL ( var Sound : TSound );
procedure Change_Sound_Volume ( Snd : pSound; Volume : byte );

implementation

Var sound_frequency : integer = 44100;   //частота
    sound_volume    : single = 1;           //громкость

function Init_Sounds ( hWnd:THandle ): boolean;  {инициализация звука}
begin
  result := True;
  if ( HIWORD( BASS_GetVersion ) <> BASSVERSION ) then begin
    result := false;   //проверка верссии длл
  end;
  if not BASS_Init( -1, sound_frequency, 0, HWnd, nil ) then begin //собственно инициализация
    result := false;
  end;
end;

procedure Kill_Sounds ( );   //деинициализация
begin
  BASS_Free();
end;

procedure Change_Sound_Volume ( Snd : pSound; Volume : byte ); //изменить громкость звука
begin
 Snd.volume:=Volume/100;
 BASS_ChannelSetAttribute( Snd.Stream, BASS_ATTRIB_VOL, Snd.volume );
end;

procedure Load_Sound(Var Sound:TSound;FileName:string;vol:single = 1;loop:boolean = false);
begin                {загрузить звук}
 Sound.Stream:= BASS_StreamCreateFile(False, PChar(FileName), 0, 0, 0);   {загрузка}
 if loop then BASS_ChannelFlags(Sound.Stream, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP);{режим воспроизведения - по кругу}
 Sound.volume:=sound_volume*vol;{звук}
 BASS_ChannelSetAttribute(Sound.Stream, BASS_ATTRIB_VOL, Sound.volume);{громкость}
 BASS_ChannelSetAttribute(Sound.Stream, BASS_ATTRIB_FREQ, sound_frequency);{частота}
 Sound.loaded:=true;       {загружен}
 Sound.playing:=false;     {не играет}
end;

procedure Play_Sound(Var Sound:TSound);  {проиграть звук}
begin
 If Sound.loaded then      
  If Sound.playing then  {если он был остановлен паузой то продолжить}
   BASS_ChannelPlay(Sound.Stream, false) else
   BASS_ChannelPlay(Sound.Stream, true); { иначе - с начала}
 Sound.playing:=true;
end;

procedure Stop_Sound(Var Sound:TSound);  {остановить проигрывание}
begin
 If Sound.loaded then
  BASS_ChannelStop(Sound.Stream);
 Sound.playing:=false;
end;

procedure Pause_Sound(Var Sound:TSound);    {притормозить проигрывание}
begin
 If Sound.loaded then
  BASS_ChannelPause(Sound.Stream);
end;

function Load_Sound_URL  ( var Sound : TSound; URL : string; vol : single = 1; loop : boolean = false ): integer;
begin
  Sound.Stream:= BASS_StreamCreateURL( PAnsiChar( url ), 0, 0, nil, nil );   {загрузка}
  if Sound.Stream = 0 then begin
    result := BASS_ErrorGetCode();
    exit;
  end else result := BASS_OK;
  
  if loop then BASS_ChannelFlags(Sound.Stream, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP);{режим воспроизведения - по кругу}
  Sound.volume:=sound_volume*vol;{звук}
  BASS_ChannelSetAttribute(Sound.Stream, BASS_ATTRIB_VOL, Sound.volume);{громкость}
  BASS_ChannelSetAttribute(Sound.Stream, BASS_ATTRIB_FREQ, sound_frequency);{частота}
  Sound.loaded:=true;       {загружен}
  Sound.playing:=false;     {не играет}
end;

procedure Play_Sound_URL  ( var Sound : TSound );
begin
  Play_Sound( Sound );
end;

procedure Stop_Sound_URL  ( var Sound : TSound );
begin
  Stop_Sound( Sound );
end;

procedure Pause_Sound_URL ( var Sound : TSound );
begin
  Pause_Sound( Sound );
end;

end.
