【问题标题】:no sound heard while playing a MIDI file in C#.Net在 C#.Net 中播放 MIDI 文件时听不到声音
【发布时间】:2010-10-07 17:35:12
【问题描述】:

我使用此代码为我的游戏播放一个 MIDI 文件,但我听不到扬声器发出的任何声音。你能帮我吗?有点急事,求... 我的扬声器已打开;)

[DllImport("winmm.dll", EntryPoint="mciSendStringA")]
private static extern long mciSendString(string lpstrCommand, string lpstrReturnString, long uReturnLength, long hwndCallback);
public static long PlayMidiFile(string MidiFile)
{
 long lRet = -1;

 if (File.Exists(MidiFile)) 
 {
  lRet = mciSendString("stop midi", "", 0, 0);
  lRet = mciSendString("close midi", "", 0, 0);
  lRet = mciSendString(("open sequencer!" 
   + (MidiFile + " alias midi")), "", 0, 0);
  lRet = mciSendString("play midi", "", 0, 0);
  return lRet;
 }

 else
 {
  //Error Message
  return lRet;
 }
}

【问题讨论】:

  • 阅读这个:stackoverflow.com/questions/8763/…,就在顶部,看起来你的 pinvoke 签名搞砸了。参数 2 是一个缓冲区。
  • 而且参数 3 和 4 也是错误的。这是从 VB6 代码复制而来的。

标签: c# audio


【解决方案1】:

我不太确定您对 winmm.dll 的实现,但我有一个经过测试且可以运行的代码。

我从这个开源项目获得了源代码:Tea Timer。

代码的实现非常简单,如下所示。希望对您有所帮助。

using System;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;

namespace TeaTimer
{
    /// <summary>
    /// MCIPlayer is based off code by Slain.
    /// Found here: http://www.sadeveloper.net/Articles_View.aspx?articleID=212
    /// </summary>
    public class MCIPlayer
    {
        private static readonly string sAlias="TeaTimerAudio";

        [DllImport("winmm.dll")]
        private static extern long mciSendString(string strCommand,StringBuilder strReturn,int iReturnLength, IntPtr hwndCallback);
        [DllImport("Winmm.dll")]
        private static extern long PlaySound(byte[] data, IntPtr hMod, UInt32 dwFlags);

        public static void Play(string sFile)
        {
            _Open(sFile);
            _Play();
        }
        public static void Stop() 
        {
            _Close();
        }

        private static void _Open(string sFileName)
        {
            if(_Status()!="")
                _Close();

            string sCommand = "open \"" + sFileName + "\" alias "+sAlias;
            mciSendString(sCommand, null, 0, IntPtr.Zero);
        }

        private static void _Close()
        {
            string sCommand = "close "+sAlias;
            mciSendString(sCommand, null, 0, IntPtr.Zero);
        }

        private static void _Play()
        {
            string sCommand = "play "+sAlias;
            mciSendString(sCommand, null, 0, IntPtr.Zero);
        }

        private static string _Status()
        {
            StringBuilder sBuffer = new StringBuilder(128);
            mciSendString("status "+sAlias+" mode", sBuffer, sBuffer.Capacity, IntPtr.Zero);
            return sBuffer.ToString();
        }
    }
}

编辑:这是您播放和停止音乐文件的方式:

public static void playSound(string sFile) 
{
    //WavPlay.WavPlayer.Play(sFile);
    MCIPlayer.Play(sFile);
}
public static void stopSound() 
{
    //WavPlay.WavPlayer.StopPlay();
    MCIPlayer.Stop();
}

【讨论】:

  • 我怎样才能重复我的 MIDI lee Sy En?你会帮助我吗?我发现如果我尝试添加字符串 Scommand = "play "+sAlias+" repeat "; mciSendString(Scommand, null, 0, IntPtr.Zero);但它不起作用:(
【解决方案2】:

我曾经使用过定义...

[DllImport("winmm.dll", EntryPoint = "mciSendStringA")] 

public static extern void mciSendStringA(string lpstrCommand, string lpstrReturnString, long uReturnLength, long hwndCallback); 

...在 .Net 3.5 中,但在 .Net 4.0 中却给了我不平衡的 pinvoke 异常!我改用这个来修复它...

[DllImport("winmm.dll", EntryPoint = "mciSendStringA")]

public static extern void mciSendStringA(string lpstrCommand, string lpstrReturnString, int uReturnLength, IntPtr hwndCallback); 

...并传入IntPtr.Zero 作为最后一个参数。

唯一的区别是uReturnLength 是int(而不是long)和hwndCallback 是IntPtr(而不是long)。

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 2011-03-30
    • 2016-10-12
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多