tags:

views:

26

answers:

1

Dear friends according to my last post in here one of friends suggest me the below code

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();
        }
    }
}

It work fine but now the problem is I can not repeat my MIDI file. I saw some code but I dont know why they dont work! I tried :

Scommand = "play "+sAlias+" repeat "; 
mciSendString(Scommand, null, 0, IntPtr.Zero); but it dosent work :( please help me
A: 

Why do you think "repeat" is a supported command? According to MSDN I cannot see that it is supported.

The solution that I see is to use notify flag.

Here is sample working for me:

public class MCIPlayer
{
    private class Form2: Form
    {
        public Form2()
        {
            if (!IsHandleCreated) CreateHandle();
        }

        private const int MM_MCINOTIFY = 953;

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            if (m.Msg == MM_MCINOTIFY)
                MCIPlayer.Play(file);
        }

        public string file;
    }

    private static Form2 f = new Form2();

    private static readonly string sAlias = "TeaTimerAudio";

    [DllImport("winmm.dll", SetLastError = true)]
    private static extern int 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 PlayTwice(string sFile)
    {
        _Open(sFile);
        f.file = sFile;
        _PlayTwice();
    }

    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 void _PlayTwice()
    {
        string sCommand = "play " + sAlias + " notify";
        mciSendString(sCommand, null, 0, f.Handle);
    }

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