过去几天我一直在玩游戏并学习如何使用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”#39;命令,因为它不会改变程序的音量混音器设置。一旦这个问题被排序,我还打算添加错误捕获。
另外,万一它出现,MouseDown事件处理程序中的MinMax方法是我编写的用于约束值的扩展。