在过去的几天里,我一直在玩耍并学习如何使用 winmm.dll,并且有一个大部分工作的程序,但遇到了一个我无法找到解决方案的问题。我遇到的问题是,在搜索歌曲一些随机次数(通常是 10 到 20 次)之后,音量会下降得相当低,可能会下降到原始歌曲的 20% 左右。这将继续发生,音量每次都变低,有时会恢复到原始水平。通过“setaudio”命令设置的实际音量因子无论下降多少仍然是正确的,并且仍然可以在较低级别进行完美调整。我已经在 Windows 7 和 10 上对此进行了测试,但问题仍然存在。
求法:
public void Seek(ulong position) {
if (isOpen && position <= Length && isPlaying) {
string command = string.Format("seek {0} to {1}", alias, position);
mciSendString(command, null, 0, IntPtr.Zero);
if (!isPaused) {
command = string.Format("play {0}{1}", alias, isLooping ? " repeat" : string.Empty);
mciSendString(command, null, 0, IntPtr.Zero);
}
}
}
音量属性:
public int Volume {
set {
if (isOpen && (value >= 0 && value <= 1000)) {
string command = string.Format("setaudio {0} volume to {1}", alias, value);
mciSendString(command, null, 0, IntPtr.Zero);
}
}
get {
if (isOpen) {
StringBuilder output = new StringBuilder(128);
string command = string.Format("status {0} volume", alias);
mciSendString(command, output, 128, IntPtr.Zero);
return Convert.ToInt32(output.ToString());
} else {
return 0;
}
}
}
我正在使用带有一些附加功能的跟踪栏进行搜索,以允许点击搜索并避免垃圾邮件搜索请求。该跟踪栏也由计时器更新以跟踪歌曲的进度。事件处理程序方法如下。
private void tbTime_MouseDown(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
//Lock editing of bar value by timer
isTimeEdit = true;
//Save initial bar value
timeValueStore = tbTime.Value;
//Move bar value to clicked location
double mouseNum = ((((double)e.X - 10.0d) / ((double)tbTime.Width - 20.0d)) * (tbTime.Maximum - tbTime.Minimum));
tbTime.Value = Convert.ToInt32(mouseNum.MinMax(tbTime.Minimum, tbTime.Maximum));
}
}
private void tbTime_MouseUp(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
//Seek to value if changed from saved value
if (player != null && tbTime.Value != timeValueStore) {
player.Seek((ulong)tbTime.Value * 1000u);
}
//Unlock editing of bar value by timer
isTimeEdit = false;
}
}
我知道我可以使用 waveOut 设置和获取音量功能,但更喜欢“setaudio”命令,因为它不会更改程序的音量混合器设置。我还打算在解决此问题后添加错误捕获。
同样,以防万一,MouseDown 事件处理程序中的 MinMax 方法是我为限制值而编写的扩展。