#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