RaUI/Source/MyDb/FileFuns/SoundPlay.cs

150 lines
5.1 KiB
C#
Raw Normal View History

2020-11-28 07:03:28 +00:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace ryCommon
{
/// <summary>
/// 音频播放类
/// </summary>
public class SoundPlay
{
[DllImport("winmm.dll", SetLastError = true)]
static extern bool PlaySound(string pszSound, IntPtr hmod, uint fdwSound);
[DllImport("winmm.dll")]
static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);
/// <summary>
/// 临时音频文件
/// </summary>
private String m_musicPath = "";
/// <summary>
///父窗口句柄
/// </summary>
private IntPtr m_Handle;
/// <summary>
/// 声音标签
/// </summary>
[Flags]
public enum SoundFlags
{
/// <summary>play synchronously (default)</summary>
SND_SYNC = 0x0000,
/// <summary>play asynchronously</summary>
SND_ASYNC = 0x0001,
/// <summary>silence (!default) if sound not found</summary>
SND_NODEFAULT = 0x0002,
/// <summary>pszSound points to a memory file</summary>
SND_MEMORY = 0x0004,
/// <summary>loop the sound until next sndPlaySound</summary>
SND_LOOP = 0x0008,
/// <summary>dont stop any currently playing sound</summary>
SND_NOSTOP = 0x0010,
/// <summary>Stop Playing Wave</summary>
SND_PURGE = 0x40,
/// <summary>dont wait if the driver is busy</summary>
SND_NOWAIT = 0x00002000,
/// <summary>name is a registry alias</summary>
SND_ALIAS = 0x00010000,
/// <summary>alias is a predefined id</summary>
SND_ALIAS_ID = 0x00110000,
/// <summary>name is file name</summary>
SND_FILENAME = 0x00020000,
/// <summary>name is resource name or atom</summary>
SND_RESOURCE = 0x00040004
}
/// <summary>
/// 音频播放类
/// </summary>
/// <param name="Music">embedded music file</param>
/// <param name="folder_path">临时保存的文件位置</param>
/// <param name="Handle">父窗口句柄</param>
public SoundPlay(Byte[] Music, string folder_path, IntPtr Handle)
{
try
{
m_Handle = Handle;
m_musicPath = Path.Combine(folder_path, "temp.mp3");
FileStream fs = new FileStream(m_musicPath, FileMode.Create);
fs.Write(Music, 0, Music.Length);
fs.Close();
}
catch (Exception)
{
}
}
/// <summary>
///音频播放类
/// </summary>
/// <param name="musicPath">要播放的音频位置</param>
/// <param name="Handle">父窗口句柄</param>
public SoundPlay(String musicPath, IntPtr Handle)
{
m_musicPath = musicPath;
m_Handle = Handle;
}
/// <summary>
/// 音频播放类
/// </summary>
/// <param name="Music"></param>
/// <param name="Handle">父窗口句柄</param>
public SoundPlay(Byte[] Music, IntPtr Handle) : this(Music, @"C:\Windows\",Handle)
{
}
[DllImport("Kernel32", CharSet = CharSet.Auto)]
static extern Int32 GetShortPathName(String path, StringBuilder shortPath, Int32 shortPathLength);
/// <summary>
/// 播放音频
/// </summary>
/// <param name="path"></param>
public void Play(string path)
{
if(path != "" && System.IO.File.Exists(path))
{
try
{
string ext = System.IO.Path.GetExtension(path).ToLower();
if (ext == ".mp3")
{
StringBuilder shortpath = new StringBuilder(260);
int result = GetShortPathName(path, shortpath, shortpath.Capacity);
mciSendString(@"close all", null, 0, m_Handle);
mciSendString("open " + shortpath.ToString() + " alias song", null, 0, m_Handle);
mciSendString("play song", null, 0, m_Handle);
}
else if (ext == ".wav")
{
PlaySound(path, m_Handle,(uint)(SoundFlags.SND_FILENAME | SoundFlags.SND_SYNC | SoundFlags.SND_NOSTOP));
}
}
catch (Exception)
{
}
}
}
/// <summary>
/// 播放音频
/// </summary>
public void Play()
{
Play(m_musicPath);
}
/// <summary>
/// 关闭音频
/// </summary>
void CloseMedia()
{
try
{
mciSendString("Close ALL", null, 0, m_Handle);
}
catch (Exception)
{
}
}
}
}