Как проиграть данные, полученные после считывания wav файла?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Как проиграть данные, полученные после считывания wav файла?

Сообщение Don Leno » 28.05.2016 (Сб) 20:46

Я считал wav файл - его заголовок и сами данные. Вопрос: возможно ли данные из файла прослушать, как в проигрывателе? Если да, то как? Мне хотя бы апи или показать в каком направлении копать.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как проиграть данные, полученные после считывания wav фа

Сообщение The trick » 28.05.2016 (Сб) 21:27

UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как проиграть данные, полученные после считывания wav фа

Сообщение Don Leno » 28.05.2016 (Сб) 21:35

Салют, The trick! Вот кто мне и нужен был по этому вопросу! У меня есть исходник по этой Апи, но там вместо пути к файлу передают строку с массивом данных из wav файла. Я пока только теорию читаю и исходники собираю. Ниже исходник, можешь сказать этот код будет работать?!
Сам не могу проверить, так как wav файл еще пока не пробовал считывать самостоятельно)))
этой статье я нашёл очень много полезного и интересного!!! Надеюсь и остальным читателям она покажется не менее интересной! А теперь статья (всё, что ниже, написано автором):

Код: Выделить всё
Итак, код модуля для проигрывания звука:
'------------------------------------------------------------
' Работа со звуком
'------------------------------------------------------------

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
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как проиграть данные, полученные после считывания wav фа

Сообщение Don Leno » 28.05.2016 (Сб) 21:41

Только вот разница есть:
В исходнике используют Апи из winmm.dll, а в MSDN из MMSYSTEM.DLL
Я не понимаю зачем они Апи передают массив данных и как она их проиграет?! А как же частота? Ведь данные wav должны браться в определенном размере с промежутком времени(?), которая и указывается в заголовке wav! Если что написал не так поправьте меня.

Если кто-то может дать объяснение по данному исходнику, буду очень признателен!

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как проиграть данные, полученные после считывания wav фа

Сообщение The trick » 29.05.2016 (Вс) 11:12

Don Leno писал(а):Я не понимаю зачем они Апи передают массив данных и как она их проиграет?! А как же частота? Ведь данные wav должны браться в определенном размере с промежутком времени(?), которая и указывается в заголовке wav! Если что написал не так поправьте меня.

Во-первых ты передаешь функции весь файл вместе с заголовками, оттуда она и берёт информацию.
Во-вторых нужно использовать байтовый массив.
UA6527P

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как проиграть данные, полученные после считывания wav фа

Сообщение Хакер » 29.05.2016 (Вс) 11:19

Don Leno писал(а):Только вот разница есть:
В исходнике используют Апи из winmm.dll, а в MSDN из MMSYSTEM.DLL

MMSYSTEM.DLL — это название соответствующей библиотеки в 16-битных версиях Windows.

Don Leno писал(а): Ведь данные wav должны браться в определенном размере с промежутком времени(?), которая и указывается в заголовке wav! Если что написал не так поправьте меня.

Ну так эта функция и будет смотреть в заголовок, который она получает наряду с остальными данными.

Don Leno писал(а):Если кто-то может дать объяснение по данному исходнику, буду очень признателен!

Исходник до неприличия поганый, использовать его не нужно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как проиграть данные, полученные после считывания wav фа

Сообщение Don Leno » 29.05.2016 (Вс) 11:22

Аф, точно! Они весь файл целиком Апи передают? Вопрос - Апи выполнит операцию? Ошибки не будет?
Про байтовый массив, то есть достаточно считать файл побайтово в массив и отправить Апи, при этом не используя строковой переменной?!

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как проиграть данные, полученные после считывания wav фа

Сообщение Don Leno » 29.05.2016 (Вс) 11:24

Хакер, насчет исходника согласен, просто я ищу метод реализации моей задачи. Если можешь поделиться более приличным кодом, буду оч признателен! Или подскажи что в этом коде неправильно, а я сам исправлю)))

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как проиграть данные, полученные после считывания wav фа

Сообщение Vova_2581 » 31.05.2016 (Вт) 1:20

У winmm.dll помимо sndPlaySound есть еще mciExecute, mciSendString, PlaySound. Причем и WAV и MP3 можно проигрывать. Вот, например, с mciSendString проиграть WAV можно так...
Код: Выделить всё
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


А более подробно смотри здесь... http://free-basic.ru/mcisendstring.html.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot] и гости: 32

    TopList