车神

专注MS.NET技术
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#中用API实现MP3,WAV等音频文件的播放类

Posted on 2007-07-04 15:24  车神  阅读(1139)  评论(0)    收藏  举报

 

using System;
using System.Runtime.InteropServices; 
using System.Text; 
using System.IO ; 
namespace clsMCIPlay
{
 
/// <summary>
 
/// clsMci 的摘要说明。
 
/// </summary>

 public class clsMCI
 
{
  
public clsMCI()
  
{
   
//
   
// TODO: 在此处添加构造函数逻辑
   
//
  }


  
//定义API函数使用的字符串变量 
  [MarshalAs(UnmanagedType.ByValTStr,SizeConst=260)]
  
private string Name = "" ;
  [MarshalAs(UnmanagedType.ByValTStr,SizeConst
=128)]
  
private string durLength = "" ;
  [MarshalAs(UnmanagedType.LPTStr,SizeConst
=128)]
  
private string TemStr ="";
  
int ilong;
  
//定义播放状态枚举变量
  public enum State
  
{
   mPlaying 
= 1,
   mPuase 
= 2,
   mStop 
= 3
  }
;
  
//结构变量
  public struct structMCI 
  
{
   
public bool bMut;
   
public int iDur;
   
public int iPos;
   
public int iVol;
   
public int iBal;
   
public string iName;
   
public State state;
  }
;

  
public structMCI mc =new structMCI() ;

  
//取得播放文件属性
  public string FileName
  
{
   
get
   
{
    
return mc.iName;
   }

   
set
   
{
    
//ASCIIEncoding asc = new ASCIIEncoding(); 
    try
    
{
     TemStr 
=""
     TemStr 
= TemStr.PadLeft(127,Convert.ToChar(" "));
          Name
="";
     Name 
= Name.PadLeft(260,Convert.ToChar(" ")) ;
          mc.iName 
= value; 
     ilong 
= APIClass.GetShortPathName(mc.iName,Name, Name.Length);
     Name 
= GetCurrPath(Name);
     
//Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";
     Name = "open " + Convert.ToChar(34+ Name + Convert.ToChar(34+ " alias media";
     ilong 
= APIClass.mciSendString("close all", TemStr, TemStr.Length , 0);
     ilong 
= APIClass.mciSendString( Name, TemStr, TemStr.Length, 0);
     ilong 
= APIClass.mciSendString("set media time format milliseconds", TemStr, TemStr.Length , 0);
     mc.state 
= State.mStop; 
    }

    
catch
    
{
     MessageBox.Show(
"出错错误!"); 
    }

   }

  }

  
//播放
  public void play()
  
{
   TemStr 
= "";
   TemStr 
= TemStr.PadLeft(127,Convert.ToChar(" "));
   APIClass.mciSendString(
"play media", TemStr, TemStr.Length , 0);
   mc.state 
= State.mPlaying ;
  }

  
//停止
  public void StopT()
  
{
   TemStr 
= "";
   TemStr 
= TemStr.PadLeft(128,Convert.ToChar(" "));
   ilong 
= APIClass.mciSendString("close media", TemStr, 1280);
   ilong 
= APIClass.mciSendString("close all", TemStr, 1280);
   mc.state 
= State.mStop ; 
  }


  
public void Puase()
  
{
   TemStr 
= "";
   TemStr 
= TemStr.PadLeft(128,Convert.ToChar(" "));
   ilong 
= APIClass.mciSendString("pause media", TemStr, TemStr.Length, 0);
   mc.state 
= State.mPuase ; 
  }

  
private string GetCurrPath(string name)
  
{
   
if(name.Length <1return ""
   name 
= name.Trim();
   name 
= name.Substring(0,name.Length-1);
   
return name;
  }

  
//总时间
  public int Duration
  
{
   
get
   
{
    durLength 
= "";
    durLength 
= durLength.PadLeft(128,Convert.ToChar(" ")) ;
    APIClass.mciSendString(
"status media length", durLength, durLength.Length, 0);
    durLength 
= durLength.Trim();
    
if(durLength == ""return 0;
    
return (int)(Convert.ToDouble(durLength) / 1000f); 
   }

  }


  
//当前时间
  public int CurrentPosition
  
{
   
get
   
{
    durLength 
= "";
    durLength 
= durLength.PadLeft(128,Convert.ToChar(" ")) ;
    APIClass.mciSendString(
"status media position", durLength, durLength.Length, 0);
    mc.iPos 
= (int)(Convert.ToDouble(durLength) / 1000f);
    
return mc.iPos;
   }

  }

 }


 
public class APIClass
 
{
  [DllImport(
"kernel32.dll", CharSet = CharSet.Auto)]
  
public static extern int GetShortPathName (
   
string lpszLongPath,
   
string shortFile,
   
int cchBuffer
  );

  [DllImport(
"winmm.dll", EntryPoint="mciSendString", CharSet = CharSet.Auto)]
  
public static extern int mciSendString (
   
string lpstrCommand,
   
string lpstrReturnString,
   
int uReturnLength,
   
int hwndCallback
  );
 }

}