|
|
#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 {
/// <summary>MCI。</summary>
[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; }
/// <summary>播放音频文件。</summary>
/// <param name="argPath">音频文件的路径。</param>
public static bool PlayByCommand(string argPath) { return PlayByCommand(argPath, "audioplay"); }
/// <summary>播放音频文件。</summary>
/// <param name="argPath">音频文件的路径。</param>
/// <param name="argAlias">别名。</param>
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; }
/// <summary>播放音频文件。</summary>
/// <param name="argPath">音频文件的路径。</param>
public static bool PlayBySnd(string argPath) { if (File.Exists(argPath)) { WinMM.sndPlaySound(argPath, (long)(Constant.SND_ASYNC)); return true; } return false; }
/// <summary>暂停指定别名的音频实例。</summary>
public static void Pause() { Pause("audioplay"); }
/// <summary>暂停指定别名的音频实例。</summary>
/// <param name="argAlias">别名。</param>
public static void Pause(string argAlias) { MciSend("pause " + argAlias); }
/// <summary>停止指定别名的音频实例。</summary>
public static void Stop() { Stop("audioplay"); }
/// <summary>停止指定别名的音频实例。</summary>
/// <param name="argAlias">别名。</param>
public static void Stop(string argAlias) { MciSend("stop " + argAlias); }
/// <summary>停止并关闭指定别名的音频实例。</summary>
public static void Close() { Close("audioplay"); }
/// <summary>停止并关闭指定别名的音频实例。</summary>
/// <param name="argAlias">别名。</param>
public static void Close(string argAlias) { MciSend("stop " + argAlias); MciSend("close " + argAlias); }
/// <summary>设置实例的音量。</summary>
/// <param name="argValue">音量值(0 ~ 1000)。</param>
public static void Volume(int argValue) { Volume(argValue, "audioplay"); }
/// <summary>设置实例的音量。</summary>
/// <param name="argAlias">别名。</param>
/// <param name="argValue">音量值(0 ~ 1000)。</param>
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()); }
/// <summary>获取实例的长度。</summary>
public static int Length() { return Length("audioplay"); }
/// <summary>获取实例的长度。</summary>
/// <param name="argAlias">别名。</param>
public static int Length(string argAlias) { string rs = ""; WinMM.mciSendString("status " + argAlias + " length", ref rs, 64, IntPtr.Zero); return Convert.ToInt32(rs); }
/// <summary>获取实例的当前播放进度。</summary>
public static int Position() { return Position("audioplay"); }
/// <summary>获取实例的当前播放进度。</summary>
/// <param name="argAlias">别名。</param>
public static int Position(string argAlias) { string rs = ""; WinMM.mciSendString("status " + argAlias + " position", ref rs, 64, IntPtr.Zero); return Convert.ToInt32(rs); }
/// <summary>设置播放实例的播放进度。</summary>
/// <param name="argPosition">目标位置。</param>
public static void Seek(int argPosition) { Seek("audioplay", argPosition, false); }
/// <summary>设置播放实例的播放进度。</summary>
/// <param name="argLast">设置播放进度为末尾,若为 True 则忽略 Position 参数。</param>
public static void Seek(bool argLast) { Seek("audioplay", 0, argLast); }
/// <summary>设置播放实例的播放进度。</summary>
/// <param name="argAlias">别名。</param>
/// <param name="argPosition">目标位置。</param>
public static void Seek(string argAlias, int argPosition) { Seek(argAlias, argPosition, false); }
/// <summary>设置播放实例的播放进度。</summary>
/// <param name="argAlias">别名。</param>
/// <param name="argLast">设置播放进度为末尾。</param>
public static void Seek(string argAlias, bool argLast) { Seek(argAlias, 0, argLast); }
/// <summary>设置播放实例的播放进度。</summary>
/// <param name="argAlias">别名。</param>
/// <param name="argPosition">目标位置。</param>
/// <param name="argLast">设置播放进度为末尾,若为 True 则忽略 Position 参数。</param>
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); }
/// <summary>开始录音,若实例已存在则关闭。</summary>
public static void Record() { Record("audiorecord", true); }
/// <summary>开始录音,若实例已存在则关闭。</summary>
/// <param name="argAlias">别名。</param>
public static void Record(string argAlias) { Record(argAlias, true); }
/// <summary>开始录音。</summary>
/// <param name="argAlias">别名。</param>
/// <param name="argClose">在录音前,若实例已存在则关闭。</param>
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); }
/// <summary>保存录音。</summary>
/// <param name="argPath">文件路径。</param>
public static bool Save(string argPath) { return Save(argPath, "audiorecord"); }
/// <summary>保存录音。</summary>
/// <param name="argPath">文件路径。</param>
/// <param name="argAlias">别名。</param>
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
|