2016-08-19 19 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以外のフォームには何も描画されていません。繰り返し処理(ループ)が終了するまでフリーズ動作をします。

  • ボリュームは、通常、または徐々に降順に減少しません。また、通常示すループが終了し、ログ出力-10000WizardFormディスプレイ通常、ページ後

  • 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

最大は、次のコード-4000

ですユーザのシステムサウンドがサウンドコントロールパネルの中100%に設定されている場合、最良の結果を与えることができます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

これもExample Scriptで読んでいて、 'DSSetVolume' musch ... ;--( – Blueeyes789