将WaveOut连接到Delphi

时间:2014-12-31 18:13:38

标签: delphi winapi delphi-7

我正在尝试将Delphi连接到Windows VolumeControl API以显示WaveOut声音。 我找到了以下代码,但它不起作用:

function Wave_SuportaControleVolume: boolean;
var
  Caps: TWaveOutCaps;
begin
  if WaveOutGetDevCaps(WAVE_MAPPER, @Caps,
       SizeOf(Caps)) = MMSYSERR_NOERROR then
    Result := Caps.dwSupport and WAVECAPS_VOLUME <> 0
  else
    Result := false;
end;

type
  TVolume = record
    Esquerdo: Word;
    Direito: Word;
  end;

function Wave_ObterVolume: TVolume;
begin
  waveOutGetVolume(integer(WAVE_MAPPER), @Result);
end;

procedure Wave_DefinirVolume(Volume: TVolume);
begin
  waveOutSetVolume(integer(WAVE_MAPPER), LongWord(Volume));
end; 

当我使用此代码时,无论我做什么,Wave_ObterVolume的值总是65535。

我的目标非常简单: 当我播放一些MP4或MP3文件时,我希望将声音值视为进度条。 我已经连接了布局和计时器组件,因为它应该在进度条上显示声音。事实上,我会使用一种VUMeter组件来做到这一点。

细节:使用Delphi 7。 我知道,它已经很老了,但它是我可用的工具。

那么,问题是我使用什么代码来访问WaveOut Windows VolumeControl?

2 个答案:

答案 0 :(得分:0)

documentation说:

  

值0xFFFF表示完整音量,值0x0000表示静音。

看起来音量已满。

您不会检查所有API调用的返回值。这是个错误。始终检查返回值并实施适当的错误处理。

答案 1 :(得分:0)

我担心您使用的代码无法为您提供所需的结果。为什么?

您正在使用的代码旨在以编程方式检索或设置波形输出的音量,就像您通过在混音器中移动滑块一样。

现在,为了能够获得播放声音输出的直观表示,您实际需要录制声音输出,然后从录制的数据中获取声音值。

如果您使用的是Windows XP,只需录制来自&#34;软件输出&#34;的音频即可。频道,但是如果您使用的是Windows Vista及更新版本,除非您使用的是某些非正式的软件驱动程序,否则它将不再可用。为什么?

为Windows Vista或更新版本制作的所有声音驱动程序都不得使用&#34;软件输出&#34;过去,这通常被用来传播任何数字版权保护措施。例如,Pepole只在Window Media播放器中播放受数字保护的内容,然后同时在另一个节目中录制声音输出。这意味着所有数字保护机制都已经过时了。

相关问题