при воспроизведении файла MIDI в C # .Net звук не слышен - PullRequest
2 голосов
/ 07 октября 2010

Я использую этот код для воспроизведения 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;
 }
}

Ответы [ 2 ]

4 голосов
/ 07 октября 2010

Я не совсем уверен в вашей реализации winmm.dll, но у меня есть проверенный и рабочий код для него.

Я получил исходный код этого проекта с открытым исходным кодом: Таймер чая .

Реализация кода довольно проста, как показано ниже. Надеюсь, это поможет.

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();
}
1 голос
/ 18 июля 2011

Раньше я использовал определение ...

[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).

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...