3

我有一个播放声音的小程序,我正在使用Trackbar 控件(实际上是 Delphi 的 VCL 包装器)来调整该声音的音量。由于可以在其他地方调整音量级别,例如:Windows 7 Mixer 小程序,我正在WAVE_MAPPER使用 Windows 计时器轮询设备的音量级别以设置适当的轨迹栏位置:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  GetVolume;
end;

procedure TForm1.GetVolume;
var
  Error: MMRESULT;
  Volume: TVolume;
begin
  {$WARN BOUNDS_ERROR OFF}
  Error := waveOutGetVolume(WAVE_MAPPER, @Volume.Volume);
  {$WARN BOUNDS_ERROR DEFAULT}
  waveOutCheck(Error);
  {$IFDEF DEBUG}
  OutputDebugString(PChar(Format('Volume = %.8x', [Volume.Volume])));
  {$ENDIF}
  TrackBar1.Position := (Volume.Left + Volume.Right) div 2;
end;

备注:在上面的代码片段中,TVolume结构仅有助于将左右声道WORD大小的音量值打包成DWORD预期的值waveOutGetVolumewaveOutCheck函数有助于检查参数MMSYSERR_NOERROR并在其他情况下抛出异常。

因此,当我在 Windows 7 Mixer 小程序中移动轨迹栏时,我的应用程序中的轨迹栏反映了实际的音量级别,但是当我在描述反馈中断的 Mixer 小程序中将音量级别设置为 0 时,我的应用程序不再反映 Mixer 音量级别并保持静音。事实上,无论 Mixer 小程序中设置的级别如何,都会waveOutGetVolume不断报告。0x00000000有人可以启发那里发生的事情吗?为什么在 Mixer 小程序中将音量设置为 0 会永远将 waveOut 设备音量锁定在 0 级?

不确定它是否相关,但我也注意到当我在混音器小程序中按下“静音”按钮时,我的应用程序没有感觉到音量的变化。

4

0 回答 0