SunnyUI/SunnyUI/Common/UAudio.cs
2022-01-05 21:57:47 +08:00

199 lines
6.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
* SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。
* CopyRight (C) 2012-2022 ShenYongHua(沈永华).
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 如果您使用此代码,请保留此说明。
******************************************************************************
* 文件名称: UAudio.cs
* 文件说明: 声音播放辅助类
* 当前版本: V3.1
* 创建日期: 2020-01-01
*
* 2020-01-01: V2.2.0 增加文件说明
******************************************************************************/
using System;
using System.ComponentModel;
using System.Media;
using System.Security;
using System.Security.Permissions;
#pragma warning disable SYSLIB0003 // 类型或成员已过时
namespace Sunny.UI
{
/// <summary>
/// Wav声音播放辅助类
/// </summary>
[HostProtection(SecurityAction.LinkDemand, Resources = HostProtectionResource.ExternalProcessMgmt)]
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Advanced)]
public static class WavPlayer
{
/// <summary>
/// 指示如何调用音频方法时,播放声音。
/// </summary>
public enum AudioPlayMode
{
/// <summary>
/// 播放声音,并等待,直到它完成之前调用代码继续。
/// </summary>
WaitToComplete,
/// <summary>
/// 在后台播放声音。调用代码继续执行。
/// </summary>
Background,
/// <summary>
/// 直到stop方法被称为播放背景声音。调用代码继续执行。
/// </summary>
BackgroundLoop
}
private static SoundPlayer _SoundPlayer;
#region Methods
private static void InternalStop(SoundPlayer sound)
{
new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
try
{
sound.Stop();
}
finally
{
CodeAccessPermission.RevertAssert();
}
}
/// <summary>播放。wav声音文件。</summary>
/// <param name="location">String包含声音文件的名称 </param>
/// <PermissionSet><IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /><IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /><IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode, ControlThread" /><IPermission class="System.Net.WebPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /></PermissionSet>
public static void Play(string location)
{
Play(location, AudioPlayMode.Background);
}
/// <summary>
/// 播放。wav声音文件.
/// </summary>
/// <param name="location">AudioPlayMode枚举模式播放声音。默认情况下AudioPlayMode.Background。</param>
/// <param name="playMode">String包含声音文件的名称</param>
public static void Play(string location, AudioPlayMode playMode)
{
ValidateAudioPlayModeEnum(playMode, "playMode");
string text1 = ValidateFilename(location);
SoundPlayer player1 = new SoundPlayer(text1);
Play(player1, playMode);
}
private static void Play(SoundPlayer sound, AudioPlayMode mode)
{
if (_SoundPlayer != null)
{
InternalStop(_SoundPlayer);
}
_SoundPlayer = sound;
switch (mode)
{
case AudioPlayMode.WaitToComplete:
_SoundPlayer.PlaySync();
return;
case AudioPlayMode.Background:
_SoundPlayer.Play();
return;
case AudioPlayMode.BackgroundLoop:
_SoundPlayer.PlayLooping();
return;
}
}
/// <summary>
/// 播放系统声音。
/// </summary>
/// <param name="systemSound">对象代表系统播放声音。</param>
public static void PlaySystemSound(SystemSound systemSound)
{
if (systemSound == null)
{
throw new ArgumentNullException();
}
systemSound.Play();
}
/// <summary>
/// 停止在后台播放声音。
/// </summary>
/// <filterpriority>1</filterpriority>
public static void Stop()
{
SoundPlayer player1 = new SoundPlayer();
InternalStop(player1);
}
private static void ValidateAudioPlayModeEnum(AudioPlayMode value, string paramName)
{
if ((value < AudioPlayMode.WaitToComplete) || (value > AudioPlayMode.BackgroundLoop))
{
throw new InvalidEnumArgumentException(paramName, (int)value, typeof(AudioPlayMode));
}
}
private static string ValidateFilename(string location)
{
if (string.IsNullOrEmpty(location))
{
throw new ArgumentNullException();
}
return location;
}
#endregion Methods
}
/// <summary>
/// MP3文件播放操作辅助类
/// </summary>
public static class Mp3Player
{
/// <summary>
/// 播放
/// </summary>
/// <param name="MP3_FileName">文件名</param>
/// <param name="Repeat">重复</param>
public static void Play(string MP3_FileName, bool Repeat)
{
Win32.WinMM.mciSendString("open \"" + MP3_FileName + "\" type mpegvideo alias MediaFile", null, 0, IntPtr.Zero);
Win32.WinMM.mciSendString("play MediaFile" + (Repeat ? " repeat" : string.Empty), null, 0, IntPtr.Zero);
}
/// <summary>
/// 暂停
/// </summary>
public static void Pause()
{
Win32.WinMM.mciSendString("stop MediaFile", null, 0, IntPtr.Zero);
}
/// <summary>
/// 停止
/// </summary>
public static void Stop()
{
Win32.WinMM.mciSendString("close MediaFile", null, 0, IntPtr.Zero);
}
}
}