2016-09-07 6 views
2

Я хочу создать две кнопки, смежные друг с другом в нижнем левом углу всех страниц, таких как перезагрузка.Как сделать остановку и приостановить/возобновить/Воспроизвести музыкальные кнопки в Inno Setup

Первая кнопка показывает Пауза и команду Резюме (если я нажму Пауза, кнопка переключения на Резюме автоматически).

Другая кнопка показывает команду Stop (если я нажму Стоп, следующая кнопка будет переключаться на Play от начала автоматически)

Этот код просто добавляет Pause/Резюме/Воспроизведение с начать * кнопка и Стоп кнопка

проблема: если я нажимаю Стоп кнопку, музыка улица ops постоянно, и . Начало формы игры кнопка никогда не появляется.

[Setup] 
AppName=Bass Audio Project 
AppVersion=1.0 
DefaultDirName={pf}\Bass Audio Project 

[Files] 
Source: Bass.dll; Flags: dontcopy 
Source: AudioFile.mp3; Flags: dontcopy 


[Code] 
const 
    BASS_SAMPLE_LOOP = 4; 
    BASS_ACTIVE_STOPPED = 0; 
    BASS_ACTIVE_PLAYING = 1; 
    BASS_ACTIVE_STALLED = 2; 
    BASS_ACTIVE_PAUSED = 3; 
    BASS_UNICODE = $80000000; 
    BASS_CONFIG_GVOL_STREAM = 5; 
const 
    #ifndef UNICODE 
    EncodingFlag = 0; 
    #else 
    EncodingFlag = BASS_UNICODE; 
    #endif 
type 
    HSTREAM = DWORD; 

function BASS_Init(device: LongInt; freq, flags: DWORD; 
    win: HWND; clsid: Cardinal): BOOL; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_StreamCreateFile(mem: BOOL; f: string; offset1: DWORD; 
    offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_Start: BOOL; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_Pause: BOOL; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_Stop(): Boolean; 
    external '[email protected]:BASS.dll stdcall delayload'; 
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_SetConfig(option: DWORD; value: DWORD): BOOL; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_ChannelIsActive(handle: DWORD): DWORD; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_Free: BOOL; 
    external '[email protected]:bass.dll stdcall'; 

var 
    SoundStream: HSTREAM; 
    PauseResumePlayButton: TNewButton; 
    StopButton: TNewButton; 

procedure ResumeButtonClick(Sender: TObject); forward; 

procedure PauseButtonClick(Sender: TObject); 
begin 
    if BASS_Pause then 
    begin 
    PauseResumePlayButton.Caption := 'Resume'; 
    PauseResumePlayButton.OnClick := @ResumeButtonClick; 
    end; 
end; 

procedure ResumeButtonClick(Sender: TObject); 
begin 
    if BASS_start then 
    begin 
    PauseResumePlayButton.Caption := 'Pause'; 
    PauseResumePlayButton.OnClick := @PauseButtonClick; 
    end; 
end; 

procedure PlayButtonClick(Sender: TObject); 
begin 
    if BASS_Start then 
    begin 
    PauseResumePlayButton.Caption := 'Pause'; 
    PauseResumePlayButton.OnClick := @PauseButtonClick; 
    end; 
end; 


procedure StopButtonClick(Sender: TObject); 
begin 
    if BASS_Stop then 
    begin 
    PauseResumePlayButton.Caption := 'Play'; 
    PauseResumePlayButton.OnClick := @PlayButtonClick; 
    end; 
     begin 
     BASS_Free; 
     end; 
end; 

procedure InitializeWizard(); 
begin 
    ExtractTemporaryFile('AudioFile.mp3'); 
    if BASS_Init(-1, 44100, 0, 0, 0) then 
    begin 
    SoundStream := 
     BASS_StreamCreateFile(
     False, ExpandConstant('{tmp}\AudioFile.mp3'), 0, 0, 0, 0, 
     EncodingFlag or BASS_SAMPLE_LOOP); 
    BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500); 
    BASS_ChannelPlay(SoundStream, False); 

    StopButton := TNewButton.Create(WizardForm); 
    StopButton.Parent := WizardForm; 
    StopButton.Left := 
     WizardForm.ClientWidth - 
     WizardForm.CancelButton.Left - WizardForm.CancelButton.Width; 
    StopButton.Top := WizardForm.CancelButton.Top; 
    StopButton.Width := WizardForm.CancelButton.Width; 
    StopButton.Height := WizardForm.CancelButton.Height; 
    StopButton.Caption := 'Stop'; 
    StopButton.OnClick := @StopButtonClick; 

    PauseResumePlayButton := TNewButton.Create(WizardForm); 
    PauseResumePlayButton.Parent := WizardForm; 
    PauseResumePlayButton.Left := 
     WizardForm.ClientWidth - 
     WizardForm.NextButton.Left - WizardForm.NextButton.Width; 
    PauseResumePlayButton.Top := WizardForm.CancelButton.Top; 
    PauseResumePlayButton.Width := WizardForm.CancelButton.Width; 
    PauseResumePlayButton.Height := WizardForm.CancelButton.Height; 
    PauseResumePlayButton.Caption := 'Pause'; 
    PauseResumePlayButton.OnClick := @PauseButtonClick; 
    end; 
end; 

procedure DeinitializeSetup; 
begin 
    BASS_Free; 
end; 
+0

Вы пробовали что-нибудь с вашей стороны. Укажите коды, которые вы пробовали. Спасибо – Biswas

+0

код указан выше извините, что не размещал код раньше –

+0

@TLama помогите мне пожалуйста –

ответ

1

Это не очень хорошая идея, чтобы осуществить это с помощью одного OnClick обработчика.

Изменение OnClick обработчика на лету, по мере необходимости, для более простой код:

const 
    BASS_SAMPLE_LOOP = 4; 
    BASS_ACTIVE_STOPPED = 0; 
    BASS_ACTIVE_PLAYING = 1; 
    BASS_ACTIVE_STALLED = 2; 
    BASS_ACTIVE_PAUSED = 3; 
    BASS_UNICODE = $80000000; 
    BASS_CONFIG_GVOL_STREAM = 5; 
const 
    #ifndef UNICODE 
    EncodingFlag = 0; 
    #else 
    EncodingFlag = BASS_UNICODE; 
    #endif 
type 
    HSTREAM = DWORD; 

function BASS_Init(device: LongInt; freq, flags: DWORD; 
    win: HWND; clsid: Cardinal): Boolean; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_StreamCreateFile(mem: Boolean; f: string; offset1: DWORD; 
    offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_ChannelPlay(handle: DWORD; restart: Boolean): Boolean; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_ChannelPause(handle: DWORD): Boolean; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_SetConfig(option: DWORD; value: DWORD): Boolean; 
    external '[email protected]:bass.dll stdcall'; 
function BASS_ChannelIsActive(handle: DWORD): DWORD; 
    external '[email protected]:bass.dll stdcall'; 

var 
    SoundStream: HSTREAM; 
    PauseResumePlayButton: TNewButton; 
    StopButton: TNewButton; 

procedure ResumeButtonClick(Sender: TObject); forward; 

procedure PauseButtonClick(Sender: TObject); 
begin 
    if BASS_ChannelPause(SoundStream) then 
    begin 
    PauseResumePlayButton.Caption := 'Resume'; 
    PauseResumePlayButton.OnClick := @ResumeButtonClick; 
    end; 
end; 

procedure ResumeButtonClick(Sender: TObject); 
begin 
    if BASS_ChannelPlay(SoundStream, False) then 
    begin 
    PauseResumePlayButton.Caption := 'Pause'; 
    PauseResumePlayButton.OnClick := @PauseButtonClick; 
    end; 
end; 

procedure PlayButtonClick(Sender: TObject); 
begin 
    if BASS_ChannelPlay(SoundStream, True) then 
    begin 
    PauseResumePlayButton.Caption := 'Pause'; 
    PauseResumePlayButton.OnClick := @PauseButtonClick; 
    end; 
end; 

procedure StopButtonClick(Sender: TObject); 
begin 
    if (BASS_ChannelIsActive(SoundStream) = BASS_ACTIVE_PAUSED) or 
    BASS_ChannelPause(SoundStream) then 
    begin 
    PauseResumePlayButton.Caption := 'Play'; 
    PauseResumePlayButton.OnClick := @PlayButtonClick; 
    end; 
end; 

procedure InitializeWizard(); 
begin 
    ExtractTemporaryFile('AudioFile.mp3'); 

    if BASS_Init(-1, 44100, 0, 0, 0) then 
    begin 
    SoundStream := 
     BASS_StreamCreateFile(
     False, ExpandConstant('{tmp}\AudioFile.mp3'), 0, 0, 0, 0, 
     EncodingFlag or BASS_SAMPLE_LOOP); 

    if SoundStream <> 0 then 
    begin 
     BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500); 

     if BASS_ChannelPlay(SoundStream, False) then 
     begin 
     StopButton := TNewButton.Create(WizardForm); 
     StopButton.Parent := WizardForm; 
     StopButton.Left := 
      WizardForm.ClientWidth - 
      WizardForm.CancelButton.Left - WizardForm.CancelButton.Width; 
     StopButton.Top := WizardForm.CancelButton.Top; 
     StopButton.Width := WizardForm.CancelButton.Width; 
     StopButton.Height := WizardForm.CancelButton.Height; 
     StopButton.Caption := 'Stop'; 
     StopButton.OnClick := @StopButtonClick; 

     PauseResumePlayButton := TNewButton.Create(WizardForm); 
     PauseResumePlayButton.Parent := WizardForm; 
     PauseResumePlayButton.Left := 
      WizardForm.ClientWidth - 
      WizardForm.NextButton.Left - WizardForm.NextButton.Width; 
     PauseResumePlayButton.Top := WizardForm.CancelButton.Top; 
     PauseResumePlayButton.Width := WizardForm.CancelButton.Width; 
     PauseResumePlayButton.Height := WizardForm.CancelButton.Height; 
     PauseResumePlayButton.Caption := 'Pause'; 
     PauseResumePlayButton.OnClick := @PauseButtonClick; 
     end; 
    end; 
    end; 
end; 
  • Обратите внимание, что вы назвали BASS_StreamCreateFile, BASS_SetConfig и BASS_ChannelPlay дважды с теми же аргументами. Это не имеет смысла. Я удалил второй набор.
  • Я также настроил размещение кнопок.

Music control buttons

+0

Можете ли вы предоставить мне полный код, пожалуйста? –

+0

См. Мой обновленный ответ. –

+0

ResumeButtonClick не проблема, это StopButtonClick, если я нажимаю кнопку остановки, музыка останавливается, а затем бежит мгновенно, вызывая щелчок на кнопке воспроизведения ** см. Мой обновленный код ** –