Запись звука с одного источника в два разных файла.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Запись звука с одного источника в два разных файла.

Сообщение MEMBER » 29.07.2003 (Вт) 11:54

Потребовалось тут написать программу, которая 24/7/365 пишет звук. И рубит запись на часовые отрезки. Ну думаю, щас, mciSendString, Timer и вперёд, но оказалось, что:
Код: Выделить всё
         
Result& = mciSendString("record zvuchok1", _
                                  ReturnString, 1024, 0) ' Начинаем запись 1
Result& = mciSendString("record zvuchok2", _
                                  ReturnString, 1024, 0) ' Начинаем запись 2

Для первой строки возвращает ОК, для второй - "Все устройства, способные записывать звук, уже заняты".
Это обойти низя никак?
Спасибо.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 29.07.2003 (Вт) 16:19

DirectSoundCapture.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 29.07.2003 (Вт) 16:41

2 ALL
Это единственный способ?
Ох, не люблю я этот директ...
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

ZeroX
Бывалый
Бывалый
 
Сообщения: 207
Зарегистрирован: 29.04.2003 (Вт) 12:36
Откуда: Мой адрес не дом и не улица, мой адрес Советский Союз

Сообщение ZeroX » 29.07.2003 (Вт) 17:35

Да батенька DirectX и только DirectX :wink:
Каждый warning мечтает стать error'om

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 29.07.2003 (Вт) 17:44

Охти, грехи наши тяжкие...
Да за что-же такое наказание, туториалов на русском раз-два и обчёлся, да и те, какие есть, так - не пришей. Для написания простейшей вещи надо объявить туеву хучу буферов, да объектов. Конвертировать, обрабатывать.
*MEMBER удаляется, рыдая в голос*
;)
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 29.07.2003 (Вт) 21:03

Если кто-нибудь с Х на ты, то не будет-ли он любезен кинуть пример записи звука в два разных файла одновременно?
А то уже есть желание поехать в Редмонд и покидатся кое в кого какашками. :)
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.07.2003 (Ср) 12:55

MEMBER, не боись! Мы тут! И DirectX SDK с нами! :)
Лови пример!

Там есть строчка:
Код: Выделить всё
dscd.lBufferBytes = capFormat.lAvgBytesPerSec * 20
Цифру 20 надо заменить, догадываешься на что! :)
Ну а в функции сохранения нужно к строке
Код: Выделить всё
GetSoundBufferFromCapture(dscb).SaveToFile .FileName
добавить ещё одну такую же, с другим именем файла!
Вложения
tut1.zip
Звукотыритель
(5.29 Кб) Скачиваний: 102
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 30.07.2003 (Ср) 13:09

Спасибо за пример. :beer:
Признаться честно, примеров есть у меня. У меня нет их понимания. :oops:
Вот бьюсь, бьюсь... Что-то котелок отказывает. Начисто.
добавить ещё одну такую же, с другим именем файла!

Боюсь я допустил ошибку, которую позволительно допускать только начинающим, я неверно задал вопрос.
Смысл программы в том, чтобы именно записывать одновременно, а не сохранять в разные файлы. Вот ведь, какая штука. То есть несколько буферов надо создавать, так я понял? Я не могу понять, что надо дублировать, там, для моих скромных познаний в DX слишком много всяких закорючек.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 30.07.2003 (Ср) 14:57

Записывать в два буффера с одной звуковой карты можно только в Win2000-XP, Win9X не позволяет. По крайней мере в DX8 у меня не вышло.
Код: Выделить всё
Attribute VB_Name = "modSound"
Option Explicit

Private DirX8 As New DirectX8
Private DSc As DirectSoundCapture8
Private DScb As DirectSoundCaptureBuffer8
Private DScbd As DSCBUFFERDESC

Public Sub SoundIni()
  With DScbd.fxFormat
    .nFormatTag = WAVE_FORMAT_PCM
    .nChannels = 2
    .lSamplesPerSec = 11025
    .nBitsPerSample = 16
    .nBlockAlign = .nBitsPerSample / 8 * .nChannels
    .lAvgBytesPerSec = .lSamplesPerSec * .nBlockAlign
    .nSize = 0          ' Ignored for WAVE_FORMAT_PCM.
  End With
  DScbd.lFlags = DSCBCAPS_DEFAULT
  DScbd.lBufferBytes = 65536          ' Size of buffer
  Set DSc = DirX8.DirectSoundCaptureCreate(vbNullString)
  Set DScb = DSc.CreateCaptureBuffer(DScbd)
End Sub

Public Sub SoundClose()
  DScb.Stop
  Set DScb = Nothing
  Set DSc = Nothing
  Set DirX8 = Nothing
End Sub

Public Sub StartRecord()
  DScb.Start DSCBSTART_LOOPING
End Sub

Public Sub StopRecord()
  DScb.Stop
End Sub

Public Sub SoundTick()
Static CurPos As Long
Static BufStereo(2047) As Long

  If ((GetCurPos - CurPos + 65536) And 65535) > 8192& Then
    DScb.ReadBuffer CurPos, 8192&, BufStereo(0), DSCBLOCK_DEFAULT
    CurPos = (CurPos + 65536 + 8192&) And 65535
    Put #OutFile, , BufStereo()
  End If

End Sub

Private Function GetCurPos() As Long
Static Cur As DSCURSORS
  DScb.GetCurrentPosition Cur
  GetCurPos = Cur.lWrite
End Function

это модуль из моей программы. Чтобы задать новый буффер, нужно продублировать три строки:
Код: Выделить всё
  Private DScb As DirectSoundCaptureBuffer8
  Set DScb = DSc.CreateCaptureBuffer(DScbd)
  Set DScb = Nothing

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

Будут вопросы - спрашивай, но я одно не пойму - зачем писать в два разных буффера одно и то же? А если надо, то кто мешает писать в один буффер, и тутже копировать во второй?
PS DirectSound - самая простая часть DirectX.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 30.07.2003 (Ср) 18:59

Спасибо. Единственное - у вас там нет кода, прописывающего header в файл.
Вы SoundTick вызывали по таймеру, или Notification делали?
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 31.07.2003 (Чт) 9:01

Файл у меня не WAV, а свой формат, поэтому про заголовок я ничего не сказал. Файл пишется порциями по 8192 байта (около 0.2 сек.), буффер на 64кБ (около 1.6 сек.). SoundTick вызывается таймером с периодом немного меньшим, чем длина одной порции (около 0.15 сек.)

PS. Любопытно, зачем, всеже, это нужно?

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 31.07.2003 (Чт) 11:00

Ответ очевиден - чтобы записывать звук. :)
Если быть более точным, нужно записывать не одновременно, а в "перекрышку". То есть за несколько секунд до окончания записи файла А, должна начинаться запись файла Б.
Впрочем, это уже не так важно. Спасибо всем ответившим.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 31.07.2003 (Чт) 15:26

А кто мешает из одного буффера писать и в файл А, и в файл Б? Ведь DSCB - это буффер в памяти, а не на диске, из него все равно приходится потом писать на диск.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 31.07.2003 (Чт) 15:32

Хм... Лагична.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com


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

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

Сейчас этот форум просматривают: SemrushBot и гости: 4

    TopList