寻求mp3时winmm.dll音量下降

时间:2015-12-06 15:05:24

标签: c# audio winmm

过去几天我一直在玩游戏并学习如何使用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方法是我编写的用于约束值的扩展。

0 个答案:

没有答案