VB 多种格式的音乐播放模块

Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" ( ByVal lpstrCommand As String , ByVal lpstrReturnString As String , ByVal uReturnLength As Long , ByVal hwndCallback As Long ) As Long

Public Declare Function
mciGetDeviceID Lib "winmm.dll" Alias "mciGetDeviceIDA" ( ByVal lpstrName As String ) As Long

Public Declare Function
waveOutGetVolume Lib "winmm.dll" ( ByVal uDeviceID As Long , lpdwVolume As Long ) As Long

Public Declare Function
GetWindowLong Lib "USER32" Alias "GetWindowLongA" ( ByVal Hwnd As Long , ByVal nIndex As Long ) As Long

Public Declare Function
CallWindowProc Lib "USER32" Alias "CallWindowProcA" ( ByVal lpPrevWndFunc As Long , ByVal Hwnd As Long , ByVal Msg As Long , ByVal wParam As Long , ByVal lParam As Long ) As Long

Public Declare Function
SetWindowLong Lib "USER32" Alias "SetWindowLongA" ( ByVal Hwnd As Long , ByVal nIndex As Long , ByVal dwNewLong As Long ) As Long

Public Declare Function
GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" ( ByVal lpszLongPath As String , ByVal lpszShortPath As String , ByVal cchBuffer As Long ) As Long

Enum
PlayTypeName
File =
1
CDAudio = 2
VCD = 3
RealPlay = 4
End Enum
Dim
PlayType As PlayTypeName
Enum AudioSource
H =
0 ' "stereo"
L = 1 '"left"
R = 2 '"right"
End Enum
Enum
Playstate
停止 =
1
暂停 = 2
播放 = 3
End Enum
Dim
hWndMusic As Long
Dim
prevWndproc As Long


'打开MCI设备,FILENAME为文件名,传值代表成功与否
Public Function OpenMusic(FileName As String , Optional Hwnd As Long ) As Boolean
OpenMusic = False
Dim
ShortPathName As String * 255
Dim RefShortName As String
Dim
RefInt As Long
Dim
MciCommand As String
Dim
DriverID As String

CloseMusic '关闭 已经打开的歌曲 才可以打开新的歌曲
'获取短文件名
GetShortPathName FileName, ShortPathName, 255
RefShortName = Left(ShortPathName, InStr( 1 , ShortPathName, Chr( 0 )) - 1 )
'MCI命令
DriverID = GetDriverID(RefShortName)
If DriverID = "RealPlayer" Then
PlayType = RealPlay
Exit Function
End If
MciCommand = "open " & RefShortName & " type " & DriverID & " alias NOWMUSIC"

'根据不同的格式加载不同的解码器

If DriverID = "AVIVideo" Or DriverID = "MPEGVideo" Or DriverID = "MPEGVideo2" Then
If
Hwnd <> 0 Then
MciCommand = MciCommand + " parent " & Hwnd & " style child"
hWndMusic = GetWindowHandle
prevWndproc = GetWindowLong(hWndMusic, -
4 )
SetWindowLong hWndMusic, -
4 , AddressOf WndProc
Else
MciCommand = MciCommand + " style overlapped "
End If
End If

RefInt = mciSendString(MciCommand, vbNull, 0 , 0 )
mciSendString
"set NOWMUSIC time format milliseconds" , vbNullString, 0 , 0
If RefInt = 0 Then
OpenMusic = True
LrcForm.LRC1.Sotp '关闭 已经打开的歌词
SongName = Trim$(Mid$(FileName, InStrRev(FileName, "\" ) + 1 , Len(FileName))) & " " '滤除前面的路径
Naccuracy = 0 '还原歌词调整值 为 0
End If
End Function
Function
WndProc( ByVal Hwnd As Long , ByVal Msg As Long , ByVal wParam As Long , ByVal lParam As Long ) As Long
If
Msg = &H202 Then
MsgBox "OK"
End If
WndProc = CallWindowProc(prevWndproc, Hwnd, Msg, wParam, lParam)
End Function

'根据文件名,确定设备
Public Function GetDriverID(ff As String ) As String
Select Case
UCase(Right(ff, 3 ))
Case "MID" , "RMI" , "IDI"
GetDriverID = "Sequencer"
Case "WAV"
GetDriverID = "Waveaudio"
Case "ASX" , "IVF" , "LSF" , "LSX" , "P2V" , "WAX" , "WVX" , ".WM" , "WMX" , "WMP"
GetDriverID = "MPEGVideo2"
Case ".RM" , "RAM" , ".RA" , "MVB"
GetDriverID = "RealPlayer"
Case Else
GetDriverID = "MPEGVideo"
End Select
End Function


'播放文件
Public Function PlayMusic() As Boolean
Dim
RefInt As Long
PlayMusic = False
RefInt = mciSendString( "play NOWMUSIC" , vbNull, 0 , 0 )
If RefInt = 0 Then
PlayMusic = True : DownloadLrc '加载 或下 载歌词
SetVolume ((Mian.Button1( 6 ).Left - 660 )) / 640 * 1000 '计算当前音量大小 '最大为1000
'检测播放速度 800 慢 1200 快
If menu.SpeedDown.Checked Then SetSpeed 800
If menu.SpeedUp.Checked Then SetSpeed 1200
'检测声道 默认 立体
If menu.AudioLeft.Checked Then SetAudioSource L '左声道
If menu.AudioRight.Checked Then SetAudioSource R
End If
End Function


'获取媒体的长度
Public Function GetMusicLength() As Long
Dim
RefStr As String * 80
mciSendString "status NOWMUSIC length" , RefStr, 80 , 0
GetMusicLength = Val(RefStr)
End Function

'获取媒体的长度 00:00
Public Function GetMusicLengthString() As String
Dim
RefStr As String * 80
mciSendString "status NOWMUSIC length" , RefStr, 80 , 0
GetMusicLengthString = CStr (Format(Int(Val(RefStr) \ 1000 \ 60 ), "00" ) & ":" & Format(Val(RefStr) \ 1000 Mod 60 , "00." ) & Val(RefStr) \ 100 Mod 10 )
End Function
'设置当前播放进度条的长度 最长是 1980

Public Function HScrollWidth() As Long
Dim
RefStr As String * 80
mciSendString "status NOWMUSIC position" , RefStr, 80 , 0
If Int(Val(RefStr)) <= 0 Then HScrollWidth = 1980 : Exit Function
HScrollWidth = 1980 / GetMusicLength * Val(RefStr) ' * 1980
End Function
'设置当前播放进度条的长度和播放位置

Public Sub HScrollValue(Value As Single )
SetMusicPos ((
1980 - ( 4240 - Value)) / 1980 * GetMusicLength) ' * Val(RefStr) ' * 1980
End Sub

'获取当前播放进度 毫秒
Public Function GetMusicPos() As Long
Dim
RefStr As String * 80
mciSendString "status NOWMUSIC position" , RefStr, 80 , 0
GetMusicPos = Val(RefStr)
End Function

'获取当前播放进度 格式 00:00.0
Public Function GetMusicPosString() As String
Dim
RefStr As String * 80
mciSendString "status NOWMUSIC position" , RefStr, 80 , 0
GetMusicPosString = CStr (Format(Int(Val(RefStr) \ 1000 \ 60 ), "00" ) & ":" & Format(Val(RefStr) \ 1000 Mod 60 , "00." ) & Val(RefStr) \ 100 Mod 10 )
End Function

'获取媒体的当前进度
Public Function SetMusicPos(Position As Long ) As Boolean
Dim
RefInt As Long
SetMusicPos = False
RefInt = mciSendString( "seek NOWMUSIC to " & Position, vbNull, 0 , 0 )
If RefInt = 0 Then PlayMusic: SetMusicPos = True
End Function

'暂停播放
Public Function PauseMusic() As Boolean
Dim
RefInt As Long
PauseMusic = False
RefInt = mciSendString( "pause NOWMUSIC" , vbNull, 0 , 0 )
If RefInt = 0 Then PauseMusic = True
End Function

'关闭媒体
Public Function CloseMusic() As Boolean
Dim
RefInt As Long
CloseMusic = False
RefInt = mciSendString( "close NOWMUSIC" , vbNull, 0 , 0 )
If RefInt = 0 Then CloseMusic = True
End Function

'全屏播放
Public Function PlayFullScreen() As Boolean
Dim
RefInt As Long
PlayFullScreen = False
RefInt = mciSendString( "play NOWMUSIC fullscreen" , vbNull, 0 , 0 )
If RefInt = 0 Then PlayFullScreen = True
End Function

'设置声音大小
Public Function SetVolume(Volume As Long ) As Boolean
Dim
RefInt As Long
SetVolume = False
RefInt = mciSendString( "setaudio NOWMUSIC volume to " & Volume, vbNull, 0 , 0 )
If RefInt = 0 Then SetVolume = True
End Function
'设置声道
'======================================================
Public Function SetAudioSource(sAudioSource As AudioSource) As Boolean
Dim
RefInt As Long
Dim
strSource As String
Select Case
sAudioSource
Case 1 : strSource = "left"
Case 2 : strSource = "right"
Case 0 : strSource = "stereo"
End Select
SetAudioSource = False
RefInt = mciSendString( "setaudio NOWMUSIC source to " & strSource, vbNull, 0 , 0 )
If RefInt = 0 Then SetAudioSource = True
End Function

'设置播放速度
Public Function SetSpeed(Speed As Long ) As Boolean
Dim
RefInt As Long
SetSpeed = False
RefInt = mciSendString( "set NOWMUSIC speed " & Speed, vbNull, 0 , 0 )
If RefInt = 0 Then SetSpeed = True
End Function

'静音True为静音,FALSE为取消静音
Public Function SetAudioOnOff(AudioOff As Boolean ) As Boolean
Dim
RefInt As Long
Dim
OnOff As String
SetAudioOff = False
If
AudioOff Then OnOff = "off" Else OnOff = "on"
RefInt = mciSendString( "setaudio NOWMUSIC " & OnOff, vbNull, 0 , 0 )
If RefInt = 0 Then SetAudioOff = True
End Function

'获得当前媒体的状态是不是在播放
Public Function IsPlaying() As Playstate
Dim sl As String * 255
mciSendString "status NOWMUSIC mode" , sl, Len(sl), 0
'MsgBox sl
If Left(sl, 7 ) = "playing" Or Left(sl, 2 ) = "播放" Then
IsPlaying = 播放
ElseIf Left(sl, 7 ) = "stopped" Or Left(sl, 2 ) = "停止" Then
IsPlaying = 停止
Else
IsPlaying = 暂停
End If
End Function

'获得播放窗口的handle
Public Function GetWindowHandle() As Long
Dim
RefStr As String * 160
mciSendString "status NOWMUSIC window handle" , RefStr, 80 , 0
GetWindowHandle = Val(RefStr)
End Function

'获取DeviceID
Public Function GetDeviceID() As Long
GetDeviceID = mciGetDeviceID( "NOWMUSIC" )
End Function

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值