首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#.Net中播放MIDI文件时听不到声音

在C#.Net中播放MIDI文件时听不到声音
EN

Stack Overflow用户
提问于 2010-10-08 01:35:13
回答 2查看 1.5K关注 0票数 3

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

代码语言:javascript
复制
[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;
 }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-08 01:49:40

我对你的winmm.dll实现不是很确定,但是我有一个经过测试并且可以正常工作的代码。

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

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

代码语言:javascript
复制
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();
        }
    }
}

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

代码语言:javascript
复制
public static void playSound(string sFile) 
{
    //WavPlay.WavPlayer.Play(sFile);
    MCIPlayer.Play(sFile);
}
public static void stopSound() 
{
    //WavPlay.WavPlayer.StopPlay();
    MCIPlayer.Stop();
}
票数 4
EN

Stack Overflow用户

发布于 2011-07-18 22:51:47

我以前用的定义是...

代码语言:javascript
复制
[DllImport("winmm.dll", EntryPoint = "mciSendStringA")] 

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

...in .Net 3.5但在.Net 4.0中给了我和不平衡的pinvoke异常!我用这个解决了这个问题...

代码语言:javascript
复制
[DllImport("winmm.dll", EntryPoint = "mciSendStringA")]

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

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

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

希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3884251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档