2016-08-19 6 views
1

설치 프로그램에서 내 프로그램 설치를 마칠 때 점진적으로 비디오 재생 볼륨을 페이드 아웃하려면 다음 코드를 작성했습니다. 나는 점차적으로 볼륨을 줄이기 위해 기대하고 내가 아니라 로그에 -1 , -2 ... -10000처럼 볼 수있는 코드 위Inno Setup에서 TDirectShow Player (Inno Media Player) 음량이 점차적으로 줄어 듭니다.

procedure CurPageChanged(CurPageID: Integer); 
var 
    X: Integer; 
begin 
    ... 
    if CurPageID = wpFinished then 
    begin 
    VideoHandler.Release; 
    VideoHandler.Close; 
    DSSetVolume(-0); 
    X := 0; 
    repeat 
     DSSetVolume(X); 
     Log(IntToStr(X)); 
     X = X - 1; 
    until X = -10000; 
    DSStopMediaPlay; 
    ... 
    end; 
    ... 
end; 

는 X 값을 출력합니다. 이 반복 프로세스가 시작될 때,

  • WizardForm는 일반적으로 나타납니다,하지만 아무것도의 wpFinished 페이지에 표시되지 않습니다. 빈 양식 만 표시됩니다. WizardForm.Caption을 제외한 양식에는 아무 것도 그려지지 않습니다. 반복 프로세스 (루프)가 끝날 때까지 멈춤처럼 작동합니다.

  • 볼륨이 정상적으로 감소하지 않거나 점진적으로 내림차순으로 감소하지 않습니다. 또한 일반적으로 도시 한 루프가 완료되고 로그 출력 -10000, WizardForm 정상적으로 표시 페이지 후

  • . DSStopMediaPlay으로 설정했기 때문에 볼륨이 갑자기 멈 춥니 다.

어떻게 정확하게 어떤 동결 또는 예외없이 위의 과정 (비디오 재생 사운드의 점진적 감소) 할 수 있습니까? 사용자의 시스템 사운드 Windows에서 사운드 제어판에서 20%로 설정되었을 때

UPDATE

다음 코드는 최상의 결과를 제공 할 수 있습니다.

procedure VolumeFadeTimerProc(HandleW, msg, idEvent, TimeSys: LongWord); 
begin 
    MPEGVideoVolume := MPEGVideoVolume - 15; 
    if MPEGVideoVolume < -4000 then 
    begin 
    DSStopMediaPlay; 
    KillTimer(0, TimerID); 
    KillTimer(0, VolumeFadeTimer); 
    Log('Volume Fade Timer has been reset.'); 
    end 
    else 
    begin 
    Log('MPEG Video Volume has been set to: ' + IntToStr(MPEGVideoVolume)); 
    DSSetVolume(MPEGVideoVolume); 
    end; 
end; 

볼륨 감소 금액은 15

최대 감소 볼륨 금액은 사용자의 시스템 사운드는 사운드 제어판에서 100%로 설정되었을 때 가장 좋은 결과를 줄 수있는 코드를 다음과 -4000

입니다 Windows.

procedure VolumeFadeTimerProc(HandleW, msg, idEvent, TimeSys: LongWord); 
begin 
    MPEGVideoVolume := MPEGVideoVolume - 35; 
    if MPEGVideoVolume < -10000 then 
    begin 
    DSStopMediaPlay; 
    KillTimer(0, TimerID); 
    KillTimer(0, VolumeFadeTimer); 
    Log('Volume Fade Timer has been reset.'); 
    end 
    else 
    begin 
    Log('MPEG Video Volume has been set to: ' + IntToStr(MPEGVideoVolume)); 
    DSSetVolume(MPEGVideoVolume); 
    end; 
end; 

볼륨 감소 금액은 35

최대 감소 볼륨의 양이 -10000

내가 자동으로 사용자의 시스템 사운드 설정의 양에 따라 양을 감소 볼륨 및 최대 감소 볼륨을 변경해야합니까입니다 에?

미리 감사드립니다.

답변

1

루프에서 창 메시지 펌프를 중지했기 때문에. 무엇이 창을 얼려 버리고 볼륨이 희미 해지는 것을 막을 수도 있습니다.

메시지 펌프를 정지시키지 않고 볼륨을 페이드 아웃하려면 타이머를 사용해야합니다.

타이머를 구현하려면 InnoCallback DLL을 사용하십시오.

[Files] 
Source: InnoCallback.dll; Flags: dontcopy 

[Code] 

type 
    TTimerProc = procedure(H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord); 

function SetTimer(hWnd: longword; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external '[email protected] stdcall'; 
function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord; external '[email protected]:innocallback.dll stdcall'; 

var 
    Volume: Integer; 
    VolumeFadeTimer: LongWord; 

procedure VolumeFadeTimerProc(H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord); 
begin 
    { Fade by -1000 every 100 ms } 
    Volume := Volume - 1000; 
    if Volume <= -10000 then 
    begin 
    DSStopMediaPlay; 
    KillTimer(0, VolumeFadeTimer); 
    end 
    else 
    begin 
    DSSetVolume(Volume); 
    end; 
end; 

procedure CurPageChanged(CurPageID: Integer); 
var 
    VolumeFadeCallback: LongWord; 
begin 
    if CurPageID = wpFinished then 
    begin 
    VideoHandler.Release; 
    VideoHandler.Close; 

    Volume := 0; 
    VolumeFadeCallback := WrapTimerProc(@VolumeFadeTimerProc, 4); 
    { call VolumeFadeCallback every 100 ms } 
    VolumeFadeTimer := SetTimer(0, 0, 100, VolumeFadeCallback); 
    DSSetVolume(Volume); 
    end; 
end; 
+0

감사합니다 ...... 나는'SetTimer'을 잊어 버린 이유 때문에'InnoCallback.dll '을 잊어 버렸습니다 ......... 감소량 (속도)을 조정해야합니까? 프로그램 설치자의 사용자 PC/노트북의 시스템 사운드에 따라 볼륨 및 최대 축소 가능한 볼륨 양이 자동으로? – Blueeyes789

+0

'DSSetVolume'의 논증이 실제로 무엇인지 모르겠습니다. –

+0

또한 예제 스크립트에서 이것을 읽었으며'DSSetVolume' musch ... ;--( – Blueeyes789