Итак, код модуля для проигрывания звука:
'------------------------------------------------------------
' Работа со звуком
'------------------------------------------------------------
Option Explicit
' Функции и константы для проигрывания звуков. Декларации.
Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Declare Function sndStopSound Lib "winmm.dll" Alias "sndPlaySoundA" _
(ByVal lpszNull As Long, ByVal uFlags As Long) As Long
' Звук воспроизводится синхронно, и функция не возвращает _
управления до окончания его проигрывания.
Global Const SND_SYNC = &H0
' Звук воспроизводится асинхронно, функция возвращает управление _
сразу после начала воспроизведения.
Global Const SND_ASYNC = &H1
' Для прекращения воспроизведения необходимо вызвать sndPlaySound() _
c NULL в качестве аргумента-имени файла
' Если указанный файл отсутствует, функция неделает ничего.
Global Const SND_NODEFAULT = &H2
' Параметр SoundName указывает на звук, образ которого уже _
находится в оперативной памяти.
Global Const SND_MEMORY = &H4
' Воспроизведение звука повторяется до тех пор, пока не будет _
вызвана функция sndPlaySound() c NULL в качестве
Global Const SND_LOOP = &H8
' параметра IpszSoundName. Для работы этого флага необходимо _
установить также флаг SND_ASYNC.
' Если звук уже воспроизводится, функция не прерывает его _
воспроизведение, а немедленно возвращает FALSE.
Global Const SND_NOSTOP = &H10
Function NoiseGet(ByVal FileName) As String
'------------------------------------------------------------
' Загрузка звука в строковую переменную.
'------------------------------------------------------------
Dim buffer As String
Dim f As Integer
Dim SoundBuffer As String
On Error GoTo NoiseGet_Error
buffer = Space$(1024)
SoundBuffer = ""
f = FreeFile
Open FileName For Binary As f
Do While Not EOF(f)
Get #f, , buffer ' Load in 1K chunks
SoundBuffer = SoundBuffer & buffer
Loop
Close f
NoiseGet = Trim$(SoundBuffer)
Exit Function
NoiseGet_Error:
SoundBuffer = ""
Exit Function
End Function
Sub NoisePlay(SoundBuffer As String, ByVal PlayMode As Integer)
'------------------------------------------------------------
' Проигрывание звука загруженного в память с помощью функции
' NoiseGet().
'------------------------------------------------------------
Dim retcode As Integer
If SoundBuffer = "" Then Exit Sub
' Stop any sound that may currently be playing.
retcode = sndStopSound(0, SND_ASYNC) ' код для прекращения звука
' PlayMode should be SND_SYNC or SND_ASYNC
' проигрывание звука
retcode = sndPlaySound(ByVal SoundBuffer, PlayMode Or SND_MEMORY)
End Sub
'------------------------------------------------------------
' Примеры применения
'------------------------------------------------------------
' ' Определение и загрузка звука
' wavFinal = NoiseGet(App.Path & "\" & "finalrealty.wav")
'
' код для прекращения звука (Мало ли, играл раньше)
' NoisePlay 0, SND_ASYNC
' Проигрывание звука
' NoisePlay wavFinal, SND_ASYNC
Хочу обратить ваше внимание на константы.
Этот модуль я нашел в исходных текстах какой-то программы, взятой на одной из страничек в Интернете, немножко его подкорректировал и написал все комментарии.
Don Leno писал(а):Я не понимаю зачем они Апи передают массив данных и как она их проиграет?! А как же частота? Ведь данные wav должны браться в определенном размере с промежутком времени(?), которая и указывается в заголовке wav! Если что написал не так поправьте меня.
Don Leno писал(а):Только вот разница есть:
В исходнике используют Апи из winmm.dll, а в MSDN из MMSYSTEM.DLL
Don Leno писал(а): Ведь данные wav должны браться в определенном размере с промежутком времени(?), которая и указывается в заголовке wav! Если что написал не так поправьте меня.
Don Leno писал(а):Если кто-то может дать объяснение по данному исходнику, буду очень признателен!
Private 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
Private Declare Function mciGetErrorString Lib "winmm.dll" Alias "mciGetErrorStringA" ( _
ByVal dwError As Long, _
ByVal lpstrBuffer As String, _
ByVal uLength As Long) As Long
Private Sub Command1_Click()
Dim Result&
Dim errormsg%
Dim ErrorString As String * 1024
Dim strPath As String
strPath = "C:\Sound.wav"
Result& = mciSendString("OPEN " & strPath & " TYPE MpegVideo ALIAS WAV", "", 0, 0)
If Not Result& = 0 Then
errormsg% = mciGetErrorString(Result&, ErrorString, 1024)
MsgBox ErrorString, 0, "Error"
Exit Sub
End If
Result& = mciSendString("PLAY WAV", "", 0, 0)
If Not Result& = 0 Then
errormsg% = mciGetErrorString(Result&, ErrorString, 1024)
MsgBox ErrorString, 0, "Error"
Exit Sub
End If
End Sub
Private Sub Command2_Click()
Dim Result&
Dim errormsg%
Dim ErrorString As String * 1024
Result& = mciSendString("CLOSE WAV", "", 0, 0)
If Not Result& = 0 Then
errormsg% = mciGetErrorString(Result&, ErrorString, 1024)
MsgBox ErrorString, 0, "Error"
Exit Sub
End If
End Sub
Сейчас этот форум просматривают: Majestic-12 [Bot], SemrushBot и гости: 13