Показать сообщение отдельно
  #3  
Старый 15.05.2011, 12:31
At3iSt At3iSt вне форума
Прохожий
 
Регистрация: 03.05.2011
Сообщения: 3
Версия Delphi: Delphi2007win32
Репутация: 10
По умолчанию

Проблему решил, и для тех, кому возможно с подобным столкнётся, выкладываю решение.

Поскольку мне было необходимо в игре реализовать фоновое звучание только трекерной музыки, то я взял библиотеку BASSMOD.dll и вот что получилось:
Код:
unit BGMusic;

interface

uses
  Classes, Windows, SysUtils, Math, BASSMOD;

type
  TMelodies = class(TThread)
  private
    { Private declarations }
    Handle: Cardinal;
    procedure Error(msg: string);
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspennded: Boolean; const idHandle: Cardinal);
    destructor  Destroy; override;
  end;

  procedure RunPlay();

implementation

{$R Melodies.res}

var
  Previous: Byte;
  MODHandle: Cardinal;
  MODPointer: Pointer;
  MODSize: Cardinal;
  PlaySync: HSYNC;

constructor TMelodies.Create(CreateSuspennded: Boolean; const idHandle: Cardinal);
begin
  inherited Create(CreateSuspennded);
  Handle := idHandle;
  if BASSMOD_GetVersion <> MAKELONG(2,0) then begin
    Error('Библиотека BASSMOD.dll не загружена!');
    self.Destroy;
    Halt;
  end;
  if not BASSMOD_Init(-1,44100,0) then begin
    Error('Не возможно инициировать устройство вывода звука');
    self.Destroy;
    Halt;
  end;
end;

destructor TMelodies.Destroy;
begin
    BASSMOD_MusicStop;
    BASSMOD_Free;
end;

procedure TMelodies.Error(msg: string);
var
	s: string;
begin
	s := msg + #13#10 + '(Error code: ' + IntToStr(BASSMOD_ErrorGetCode) + ')';
	MessageBox(Handle, PChar(s), nil, 0);
end;

// Процедура которая будет вызвана по окончанию проигривания файла
procedure ChannelEndSync(handle: HSYNC; data: DWORD; user: Pointer); stdcall;
begin
  BASSMOD_MusicStop;
  BASSMOD_MusicFree();
  RunPlay;
end;

procedure RunPlay();
var
  melody: PChar;
  number: Byte;
begin
  repeat
    Randomize;
    number := RandomRange(10, 19);
  until Previous <> number; {звучала ли мелодия только-что?}

  melody := PChar('MELODY_' + IntToStr(number));

  MODHandle:=FindResource(hInstance, melody, RT_RCDATA);
  MODPointer:=LockResource(LoadResource(hInstance, MODHandle));
  MODSize:=SizeOfResource(hInstance, MODHandle);

  BASSMOD_MusicLoad(True, MODPointer, 0, 0, BASS_MUSIC_STOPBACK);

  BASSMOD_MusicRemoveSync(PlaySync);
  PlaySync := BASSMOD_MusicSetSync(BASS_SYNC_END, 0, @ChannelEndSync, 0);

  BASSMOD_MusicPlay;
end;

procedure TMelodies.Execute;
begin
  RunPlay;
end;

end.

Сами мелодии помещены в файл ресурсов, и одна за другой проигрываются в случайном порядке.
Ответить с цитированием