Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Файл в бинарном режиме


Автор: koltpiton 8.2.2014, 19:54
Здравствуйте! Нужна помощь. В бейсике не силен. На VB6 нужно:
1. определить буфер размером в 320 байт.
2. открыть файл на чтение в бинарном режиме
3. считать из файла  320 байт.
3.1 сделать задержку на 1 сек после чего очистить буфер и считать следующие 320 байт 
и так до конца файла.

шарюсь в интернете уже несколько дней, на VB6 ни чего не нашел. Будте добры, покажите на примере как это делается.

Автор: TheTrick 8.2.2014, 20:08
WriteFile

Автор: koltpiton 8.2.2014, 20:22
Цитата(TheTrick @ 8.2.2014,  20:08)
WriteFile

По слову WriteFile нахожу примеры на Си, а мне нужно на VB6. Можно попросить какой нибудь примерчик решения этого вопроса?

Автор: TheTrick 8.2.2014, 21:28
https://www.google.ru/search?client=opera&q=vb6+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA+%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0+%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8B&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest#newwindow=1&q=vb6+writefile
Первая ссылка

Автор: TheTrick 9.2.2014, 12:56
Я тебе уже писал на этот счет, открывай файл через модуль который я тебе дал (функции из winmm), т.к. тебе не просто нужны данные файла, а данные Wav файла. Там уже готовые функции для открытия и получения данных. Открывай порт, настраивай скорость и пиши уже в него через WriteFile

Автор: koltpiton 9.2.2014, 13:29
Цитата(TheTrick @ 9.2.2014,  12:56)
 открывай файл через модуль который я тебе дал (функции из winmm)

Честное слово, даже не предполагал, что такие сложности буду. У меня файл:
 частота оцифровки: 8000 Герц.
 количество каналов: 1 (mono).
 бит на оцифровку: 16 signed.
 Аудиоданные должны подаваться в аудио порт модема порциями по 320 байт каждые 0.02 секунды.
Я думал можно просто открыть файл как бинарный, считать с него в переменную А 320 байт передать в аудиопорт модема MSComm1.Output=A сделать задержку 0,02 сек потом передать следующие 320 байт.
А модуль вы имеете ввиду который указали в ссылке? http://www.ex-designz.net/apidetail.asp?api_id=40
А то может не там капаю?

Автор: TheTrick 9.2.2014, 15:01
Ты понимаешь что у файла есть заголовок и т.д? В RIFF можно все что угодно записать, как ты хочешь тебе тогда нужен RAW формат. Модуль на другом форуме я давал для открытия Wav. Точную задержку тебе не получится сделать никак.

Автор: koltpiton 9.2.2014, 17:41
Цитата(TheTrick @ 9.2.2014,  15:01)
Модуль на другом форуме я давал для открытия Wav. Точную задержку тебе не получится сделать никак.

Все... понял. Еще тогда вопрос, заголовок тоже нужно передавать? Насколько я понял, заголовок это первые 44 байта, их отдельно сччитывать в буфер или начинать с него и по блочно через каждые 320 байт передавать?

Автор: TheTrick 10.2.2014, 00:51
Цитата
Все... понял. Еще тогда вопрос, заголовок тоже нужно передавать? Насколько я понял, заголовок это первые 44 байта, их отдельно сччитывать в буфер или начинать с него и по блочно через каждые 320 байт передавать?

Это уже я не знаю, ты же говоришь что у тебя фиксированный формат, у тебя два пути просто выгрузить сырые данные в raw файл, либо использовать модуль, что в этом непонятного?

Автор: Akina 10.2.2014, 08:08
А зачем нужно использовать API? чем не угодило штатное OPEN ... FOR BINARY ?

Автор: TheTrick 10.2.2014, 08:57
Цитата(Akina @  10.2.2014,  08:08 Найти цитируемый пост)
А зачем нужно использовать API? чем не угодило штатное OPEN ... FOR BINARY ?
Т.к. ему нужны данные Wav файла, конечно можно все в ручнуюоткрывать и анализировать, но зачем, если есть специальные функции, которые это сделают правильно в любом Wav файле?
Код
Option Explicit
 
Private Type MMCKINFO
    ckid As Long
    ckSize As Long
    fccType As Long
    dwDataOffset As Long
    dwFlags As Long
End Type
Public Type WAVEFORMAT
    wFormatTag As Integer
    nChannels As Integer
    nSamplesPerSec As Long
    nAvgBytesPerSec As Long
    nBlockAlign As Integer
    wBitsPerSample As Integer
    cbSize As Integer
End Type
 
Private Declare Function mmioClose Lib "winmm.dll" (ByVal hmmio As Long, ByVal uFlags As Long) As Long
Private Declare Function mmioDescend Lib "winmm.dll" (ByVal hmmio As Long, lpck As MMCKINFO, lpckParent As Any, ByVal uFlags As Long) As Long
Private Declare Function mmioOpen Lib "winmm.dll" Alias "mmioOpenA" (ByVal szFileName As String, lpmmioinfo As Any, ByVal dwOpenFlags As Long) As Long
Private Declare Function mmioRead Lib "winmm.dll" (ByVal hmmio As Long, pch As Any, ByVal cch As Long) As Long
Private Declare Function mmioStringToFOURCC Lib "winmm.dll" Alias "mmioStringToFOURCCA" (ByVal sz As String, ByVal uFlags As Long) As Long
Private Declare Function mmioAscend Lib "winmm.dll" (ByVal hmmio As Long, lpck As MMCKINFO, ByVal uFlags As Long) As Long
 
Private Const MMIO_READ = &H0
Private Const MMIO_FINDCHUNK = &H10
Private Const MMIO_FINDRIFF = &H20
 
Public Format As WAVEFORMAT             ' Формат файла
Public WaveData() As Integer            ' Данные звукового файла
Public Offset As Long                   ' Смещение данных относительно начала файла
' Открытие Wav файла
Public Function ReadWaveFile(FileName As String) As Boolean
    Dim hIn As Long, ret As Long, Inf As MMCKINFO, sInf As MMCKINFO, ct As Long
    
    hIn = mmioOpen(FileName, ByVal 0, MMIO_READ)            ' Открываем файл
    If (hIn = 0) Then MsgBox "Ошибка открытия файла": Exit Function
 
    Inf.fccType = mmioStringToFOURCC("WAVE", 0)             ' Проверка является ли вав файлом
    If mmioDescend(hIn, Inf, ByVal 0, MMIO_FINDRIFF) Then _
        mmioClose hIn, 0: MsgBox "Не являеться звуковым файлом": Exit Function
    sInf.ckid = mmioStringToFOURCC("fmt", 0)                 ' Ишем чанк с форматом
    If mmioDescend(hIn, sInf, Inf, MMIO_FINDCHUNK) Then _
        mmioClose hIn, 0: MsgBox "Не найден чанк с форматом": Exit Function
    ' Проверяем размер формата
    If sInf.ckSize > Len(Format) Then _
        mmioClose hIn, 0: MsgBox "Не поддерживаемый формат": Exit Function
    ' Читаем формат
    If mmioRead(hIn, Format, sInf.ckSize) = -1 Then _
        mmioClose hIn, 0: MsgBox "Не возможно прочитать формат": Exit Function
        
    mmioAscend hIn, sInf, 0
    
    If Format.wBitsPerSample <> 16 Then _
        mmioClose hIn, 0: MsgBox "Поддерживается только 16 бит на семпл": Exit Function
    ' Ищем чанк с данными
    sInf.ckid = mmioStringToFOURCC("data", 0)
    If mmioDescend(hIn, sInf, Inf, MMIO_FINDCHUNK) Then _
        mmioClose hIn, 0: MsgBox "Не найдены данные в вав файле ": Exit Function
    
    ct = sInf.ckSize \ 2        ' Получаем количество выборок
    If ct = 0 Then mmioClose hIn, 0: MsgBox "Нулевой размер файла": Exit Function
    
    ReDim WaveData(ct - 1)      ' Выделяем буфер
    
    Offset = sInf.dwDataOffset  ' Указываем смещение
    
    If mmioRead(hIn, WaveData(0), sInf.ckSize) = -1 Then _
        mmioClose hIn, 0: MsgBox "Не возможно прочитать данные": Exit Function
        
    mmioClose hIn, 0                                        ' Закрываем файл
    
    ReadWaveFile = True
End Function
Вот пример правильного считывания данных wav файла.

Автор: Akina 10.2.2014, 10:17
TheTrick, ну от ТС ничего про WAV я не слышал - хотя косвенно он это подтверждает. 
Обычное в общем дело - озвучивать не задачу, а свои попытки её решить, что порождает кучу непоняток.

Автор: TheTrick 10.2.2014, 13:02
Цитата(Akina @  10.2.2014,  10:17 Найти цитируемый пост)
TheTrick, ну от ТС ничего про WAV я не слышал - хотя косвенно он это подтверждает. 
Он просто на другом форуме такую тему создавал уже, и там он более детально расписал. Ему еще нужно их отправлять в COM порт, поэтомуя писал ему WriteFile

Автор: koltpiton 10.2.2014, 21:45
Анализировать мне ничего не нужно. Мне нужно просто передать данные в com порт чтоб воспроизвести аудиофайл, чтоб на том конце его было слышно. А уж с заголовком в 44 байта или без это не важно. Задурили мне голову API функциями, все работает штатными средствами VB6.
Отдаем команду в порт MSComm1.Output = "AT^DDSETEX=2" & vbCr затем циклом считываем данные файла в массив и передаем блоками по 320 байт. Правильно человек говорит "А зачем нужно использовать API? чем не угодило штатное OPEN ... FOR BINARY ?"
именно через OPEN ... FOR BINARY все и работает. И нечего там в файле анализировать.
Спасибо всем за помощь.
Тему можно закрыть.

Автор: TheTrick 10.2.2014, 21:59
Цитата(koltpiton @ 10.2.2014,  21:45)
Анализировать мне ничего не нужно. Мне нужно просто передать данные в com порт чтоб воспроизвести аудиофайл, чтоб на том конце его было слышно. А уж с заголовком в 44 байта или без это не важно. Задурили мне голову API функциями, все работает штатными средствами VB6.
Отдаем команду в порт MSComm1.Output = "AT^DDSETEX=2" & vbCr затем циклом считываем данные файла в массив и передаем блоками по 320 байт. Правильно человек говорит "А зачем нужно использовать API? чем не угодило штатное OPEN ... FOR BINARY ?"
именно через OPEN ... FOR BINARY все и работает. И нечего там в файле анализировать.
Спасибо всем за помощь.

Блин, вот какие люди пошли..... Понимаешь, бывают разные WAV файлы, бывают чанки LIST и вообще кучу других чанков, там можно хранить все что угодно вплоть до видео и программ и размер заголовка может стать несколько мб, ну это не важно, важно то что я тебе дал правильный вариант, который будет работать всегда и который надо использовать, а ты говоришь задурили. Ты понимаешь что у тебя может получиться так, что не будут выровнены данные файла и ты получишь облом? Ты писал что у тебя фиксированный формат, поэтому заголовок тебе не нужен, ты можешь его передать (это даже не будет слышно в звуке), но это неправильно, зачем тогда становиться программистом - чтобы писать ###код? Посмотри любой пример считывания данных WAV файла в интернете, никто не читает все данные сначала. Я тебе изначально написал про RAW файл, что его можно сразу считать от начала и до конца, так что прежде чем так писать сначала подумай. smile 

Автор: Akina 11.2.2014, 07:30
TheTrick, пожалуйста, поменьше пыли. 
Ты говоришь об общем подходе, и в этом смысле твои слова верны, но у ТС совершенно конкретная реальная задача, и ему общий подход может оказаться совершенно непригодным (что мы собственно и наблюдаем, как мне кажется).
Это вовсе не повод для столь мощного негодования.

Автор: koltpiton 11.2.2014, 19:30
Уважаемый TheTrick Вы действительно правы. Только тут нужно учесть тот факт, что аудиофайл мы создаем себе сами с заранее заготовленой речью оповещения, соответственно изначально знаем, что там только аудиоднанные. Ну и потом, я должен конечно извиниться и отметить тот факт, что wav файл в формате gsm. В этом я не сразу разобрался. Ну не сталкивался я с такого рода задачами. Ведь всегда когда то в жизни бывает что то в первый раз. Я Вас очень благодарю за помощь и это искрине я хочу отметить. Спасибо.

Добавлено через 11 минут и 21 секунду
Про API функции я просто имел в виду, что MSComm по моему все тоже самое делает, что можно сделать через API. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)