Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Raf-9600,
Цитата Raf-9600:
Спасибо, но это не совсем то, в чём затык произошёл. Кроме этого функционала, нужно ещё чтобы после того как воспроизведение само завершиться (без клика пользователя по кнопке Стоп), кнопка Стоп становилась неактивной. »
вот пример. Перенёс отсюда http://programmersforum.ru/showthread.php?p=426736
попутно читал справку, чего и тебе советую, тк возможностей много, например регулировка громкости, отображение прогресса, перемотка, итд
http://www.un4seen.com/doc/#bass/BAS...reateFile.html

короче вот код конкретно по твоему вопросу:
читать дальше »
Код: Выделить весь код
[Files]
Source: bass.dll; Flags: dontcopy


[Code    ]
type
    HSYNC = DWORD;
    SYNCPROC = Longint;
    Pointer = Longint;
    HSTREAM = DWORD;
    
const
    BASS_SYNC_END       = 2;
    BASS_UNICODE        = $80000000;
    
function BASS_ChannelRemoveSync(handle: DWORD; sync: HSYNC): BOOL; external 'BASS_ChannelRemoveSync@files:bass.dll stdcall';
function BASS_ChannelSetSync(handle: DWORD; type_: DWORD; param1, param2: DWORD; proc: SYNCPROC; user: Pointer): HSYNC; external 'BASS_ChannelSetSync@files:bass.dll stdcall';
function BASS_Init(device: LongInt; freq, flags: DWORD; win: HWND; clsid: Pointer): BOOL; external 'BASS_Init@files:bass.dll stdcall';
function BASS_StreamCreateFile(mem: BOOL; f: String; offset1: DWORD; offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM;
  external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(handle: HSTREAM): BOOL; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Free(): BOOL; external 'BASS_Free@files:bass.dll stdcall';

var
    Channel: HSTREAM;
    PlaySync: DWORD;
    BassInitialized: BOOL;
    
    StopBtn, PlayBtn: TButton;

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

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

    // Покажем пользователю что файл проигран до конца...
    //MsgBox('Файл проигран!', mbInformation, MB_OK);
    StopBtn.Enabled := False;
end;

// Просто процедура которая открывает файл и проигривает его
procedure BASS_PlayFile(const FilePath: String);
begin
    if Channel = 0 then
    begin
        // Открываем файл...
        Channel := BASS_StreamCreateFile(False, FilePath, 0, 0, 0, 0,
        #ifdef UNICODE
            BASS_UNICODE
        #else
            0
        #endif
        );

        // Начинаем его воспроизведение
        BASS_ChannelPlay(Channel, False);

        // А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
        // ChannelEndSync котора будет запущена по окончанию проигривания файла
        PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
    end else
    begin
        // Если файл уже играет, то отключаем его
        BASS_ChannelRemoveSync(Channel, PlaySync);
        BASS_StreamFree(Channel);

        // Открываем файл...
        Channel := BASS_StreamCreateFile(False, FilePath, 0, 0, 0, 0,
        #ifdef UNICODE
            BASS_UNICODE
        #else
            0
        #endif
        );

        // Начинаем его воспроизведение
        BASS_ChannelPlay(Channel, False);

        // А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
        // ChannelEndSync котора будет запущена по окончанию проигривания файла
        PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
    end;
end;

function InitBass(const _hwnd: HWND): BOOL;
begin
    Result := BassInitialized;
    if not Result then
    begin
        Result := BASS_Init(-1, 44100, 0, _hwnd, 0);
        BassInitialized := Result;
    end;
end;

procedure StopAndFree();
begin
    if PlaySync <> 0 then
    begin
        BASS_ChannelRemoveSync(Channel, PlaySync);
        PlaySync := 0;
    end;
    
    // Освободим поток
    if Channel <> 0 then
    begin
        BASS_StreamFree(Channel);
        Channel := 0;
    end;
end;

function DeInitBass(): BOOL;
begin
    Result := not BassInitialized;
    if not Result then
    begin
        Result := Bass_Free();
        BassInitialized := not Result;
    end;
end;

///////////////////////////////////  demo  /////////////////////////////////



procedure BtnClick(Sender: TObject);
var
    uFilePath: String;
begin
    case TButton(Sender) of
        PlayBtn:
        begin
            uFilePath := '';
            if GetOpenFileName('Choose audio file', uFilePath, ExpandConstant('{userdesktop}'), 'mp3 files (*.mp3)|*.mp3|All files (*.*)|*.*', 'mp3') then
              if uFilePath <> '' then
                BASS_PlayFile(uFilePath);

            StopBtn.Enabled := True;
        end;
        
        StopBtn:
        begin
            StopAndFree();
            StopBtn.Enabled := False;
        end;
    end;
end;


procedure InitializeWizard();
begin
    BassInitialized := False;
    InitBass(0);
    
    //////////////////////////////////
    WizardForm.OuterNotebook.Hide;
    PlayBtn := TButton.Create(WizardForm);
    with PlayBtn do
    begin
        Parent := WizardForm;
        SetBounds(100, 100, 65, 25);
        Caption := 'Play';
        OnClick := @BtnClick;
    end;
    StopBtn := TButton.Create(WizardForm)
    with StopBtn do
    begin
        Parent := WizardForm;
        SetBounds(200, 100, 65, 25);
        Caption := 'Stop';
        OnClick := @BtnClick;
    end;
end;


procedure DeinitializeSetup();
begin
   DeInitBass();
end;
[/color]

Последний раз редактировалось Johny777, 04-12-2013 в 01:35.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:38, 03-12-2013 | #1592