#if NET40 || NET461
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Media;
using System.IO;
using System.Security.Permissions;
namespace Apewer.Internals.Interop
{
/// MCI。
[HostProtection(SecurityAction.LinkDemand, Resources = HostProtectionResource.ExternalProcessMgmt)]
[System.Security.SecuritySafeCritical]
internal sealed class Mci
{
private static string MciSend(string argCommand)
{
string rs = "";
WinMM.mciSendString(argCommand, ref rs, 0, IntPtr.Zero);
return rs;
}
/// 播放音频文件。
/// 音频文件的路径。
public static bool PlayByCommand(string argPath)
{
return PlayByCommand(argPath, "audioplay");
}
/// 播放音频文件。
/// 音频文件的路径。
/// 别名。
public static bool PlayByCommand(string argPath, string argAlias = "audioplay")
{
if (!string.IsNullOrEmpty(argPath))
{
if (File.Exists(argPath))
{
string alias = argAlias;
if (string.IsNullOrEmpty(argAlias))
{
alias = Guid.NewGuid().ToString("n");
// valias = Guid.NewGuid().ToString().ToLower().Replace("-", "");
}
MciSend("open \"" + argPath + "\" alias " + alias + "");
MciSend("play " + alias);
return true;
}
}
return false;
}
/// 播放音频文件。
/// 音频文件的路径。
public static bool PlayBySnd(string argPath)
{
if (File.Exists(argPath))
{
WinMM.sndPlaySound(argPath, (long)(Constant.SND_ASYNC));
return true;
}
return false;
}
/// 暂停指定别名的音频实例。
public static void Pause()
{
Pause("audioplay");
}
/// 暂停指定别名的音频实例。
/// 别名。
public static void Pause(string argAlias)
{
MciSend("pause " + argAlias);
}
/// 停止指定别名的音频实例。
public static void Stop()
{
Stop("audioplay");
}
/// 停止指定别名的音频实例。
/// 别名。
public static void Stop(string argAlias)
{
MciSend("stop " + argAlias);
}
/// 停止并关闭指定别名的音频实例。
public static void Close()
{
Close("audioplay");
}
/// 停止并关闭指定别名的音频实例。
/// 别名。
public static void Close(string argAlias)
{
MciSend("stop " + argAlias);
MciSend("close " + argAlias);
}
/// 设置实例的音量。
/// 音量值(0 ~ 1000)。
public static void Volume(int argValue)
{
Volume(argValue, "audioplay");
}
/// 设置实例的音量。
/// 别名。
/// 音量值(0 ~ 1000)。
public static void Volume(int argValue, string argAlias)
{
int volume = argValue;
if (volume < 0) volume = 0;
if (volume < 1000) volume = 1000;
MciSend("setaudio " + argAlias + " volume to " + volume.ToString());
}
/// 获取实例的长度。
public static int Length()
{
return Length("audioplay");
}
/// 获取实例的长度。
/// 别名。
public static int Length(string argAlias)
{
string rs = "";
WinMM.mciSendString("status " + argAlias + " length", ref rs, 64, IntPtr.Zero);
return Convert.ToInt32(rs);
}
/// 获取实例的当前播放进度。
public static int Position()
{
return Position("audioplay");
}
/// 获取实例的当前播放进度。
/// 别名。
public static int Position(string argAlias)
{
string rs = "";
WinMM.mciSendString("status " + argAlias + " position", ref rs, 64, IntPtr.Zero);
return Convert.ToInt32(rs);
}
/// 设置播放实例的播放进度。
/// 目标位置。
public static void Seek(int argPosition)
{
Seek("audioplay", argPosition, false);
}
/// 设置播放实例的播放进度。
/// 设置播放进度为末尾,若为 True 则忽略 Position 参数。
public static void Seek(bool argLast)
{
Seek("audioplay", 0, argLast);
}
/// 设置播放实例的播放进度。
/// 别名。
/// 目标位置。
public static void Seek(string argAlias, int argPosition)
{
Seek(argAlias, argPosition, false);
}
/// 设置播放实例的播放进度。
/// 别名。
/// 设置播放进度为末尾。
public static void Seek(string argAlias, bool argLast)
{
Seek(argAlias, 0, argLast);
}
/// 设置播放实例的播放进度。
/// 别名。
/// 目标位置。
/// 设置播放进度为末尾,若为 True 则忽略 Position 参数。
public static void Seek(string argAlias, int argPosition, bool argLast)
{
if (argLast)
{
MciSend("seek " + argAlias + " to end");
}
else
{
if (argPosition == 0) MciSend("seek " + argAlias + " to start");
else MciSend("seek " + argAlias + " to " + argPosition.ToString());
}
MciSend("play " + argAlias);
}
/// 开始录音,若实例已存在则关闭。
public static void Record()
{
Record("audiorecord", true);
}
/// 开始录音,若实例已存在则关闭。
/// 别名。
public static void Record(string argAlias)
{
Record(argAlias, true);
}
/// 开始录音。
/// 别名。
/// 在录音前,若实例已存在则关闭。
public static void Record(string argAlias, bool argClose)
{
if (argClose) Close(argAlias);
MciSend("set wave bitpersample 16");
MciSend("set wave samplespersec 44100");
MciSend("set wave channels 2");
MciSend("set wave format tag pcm");
MciSend("open new type waveaudio alias " + argAlias);
MciSend("record " + argAlias);
}
/// 保存录音。
/// 文件路径。
public static bool Save(string argPath)
{
return Save(argPath, "audiorecord");
}
/// 保存录音。
/// 文件路径。
/// 别名。
public static bool Save(string argPath, string argAlias)
{
Stop(argAlias);
if (string.IsNullOrEmpty(argPath)) return false;
try
{
if (File.Exists(argPath)) File.Delete(argPath);
if (File.Exists(argPath)) return false;
else MciSend("save " + argAlias + " \"" + argPath + "\"");
Close(argAlias);
return File.Exists(argPath);
}
catch
{
Close(argAlias);
return false;
}
}
}
}
#endif