You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
266 lines
8.9 KiB
266 lines
8.9 KiB
#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
|
|
|