過去数日間、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 set および get volume 関数を使用してボリュームを設定および取得できることは承知していますが、プログラムのボリューム ミキサー設定が変更されないため、「setaudio」コマンドを使用することをお勧めします。この問題が整理されたら、エラー キャッチも追加する予定です。
また、万が一に備えて、MouseDown イベント ハンドラーの MinMax メソッドは、値を制限するために作成した拡張機能です。