Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.05.2011, 23:42
At3iSt At3iSt вне форума
Прохожий
 
Регистрация: 03.05.2011
Сообщения: 3
Версия Delphi: Delphi2007win32
Репутация: 10
Вопрос BASS.dll и MOD-файл: не удаётся распознать окончание звучания трека

Здравствуйте!

Никак не получается распознать момент завершения трека:
Код:
unit BGMusic;

interface

uses
  Classes, Windows, SysUtils, BASS;

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

implementation

var
  MODFile: PChar;
  Melody: HMUSIC;
  PlaySync: HSYNC;

constructor TMelodies.Create(CreateSuspennded: Boolean; const idHandle: Cardinal; const idPath: string);
begin
 inherited Create(CreateSuspennded);
 Handle := idHandle;
 Folder := idPath;
	// 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, Handle, nil) then
		Error('Error initializing audio!');

  BASS_Start();
end;

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

// Процедура которая будет вызвана по окончанию проигривания файла
procedure ChannelEndSync(handle: HSYNC; Stream, data: DWORD; user: Pointer); stdcall;
begin
  // Вот здесь обрабатывайте окончание!
  // Когда Channel доиграет до конца, то будет вызвана эта процедура
  // Например освободим этот поток который проигрался
  // Сперва удалим обработку
  BASS_ChannelRemoveSync(Stream, handle);
  // Освободим поток
  BASS_MusicFree(handle);

  // Очистим переменные
  Melody := 0;
  PlaySync := 0;

  // Покажем пользователю что файл проигран до конца...
	MessageBox(Handle, PChar('Файл проигран!'), nil, 0);
end;

procedure TMelodies.RunPlay();
begin
  MODFile := PChar(Folder + 'music.mod');
  Melody := BASS_MusicLoad(False, MODFile, 0, 0, 0, 0);

  BASS_ChannelRemoveSync(Melody, PlaySync);
  PlaySync := BASS_ChannelSetSync(Melody, BASS_SYNC_END, 0, @ChannelEndSync, nil);

  if not BASS_ChannelPlay(Melody, False) then
			Error('Error playing music!');
end;

procedure TMelodies.Execute;
begin
  { Place thread code here }
//  while not Terminated do
  Synchronize(RunPlay);
end;

end.
по идее, при завершении трека, управление должно передаваться процедуре ChannelEndSync... однако этого не происходит.

Прошу Вашей помощи.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:33.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025