0

過去数日間、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 メソッドは、値を制限するために作成した拡張機能です。

4

0 に答える 0