Почему вы думаете, что «repeat» является поддерживаемой командой?
Согласно MSDN я не вижу, что это поддерживается.
Решение, которое я вижу, состоит в использовании флага уведомления .
Вот пример работы для меня:
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();
}
}