150 lines
5.1 KiB
C#
150 lines
5.1 KiB
C#
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>don’t stop any currently playing sound</summary>
|
||
SND_NOSTOP = 0x0010,
|
||
/// <summary>Stop Playing Wave</summary>
|
||
SND_PURGE = 0x40,
|
||
/// <summary>don’t 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)
|
||
{
|
||
}
|
||
}
|
||
}
|
||
}
|