DirectSound в VB6.

Автор обещает много интересных штучек.

Модератор: The trick

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

DirectSound в VB6.

Сообщение The trick » 15.07.2015 (Ср) 21:18

Параллельно с Direct3D9 я делал библиотеку типов и модуль с вспомогательными функциями для DirectSound. В архиве библиотека типов dsvb.tlb и модуль DS_Functions.bas. В дальнейшем добавлю модуль класса для поддержки асинхронных уведомлений, пока можно пользоваться этим.
В модуле DS_Functions содержатся следующие функции:
  • DSCreateSoundBufferFromFile - создает объект с интерфейсом IDirectSoundBuffer8 из файла. Поддерживаются только WAVE и MP3 файлы. MP3 файлы могут содержать только ID3v1 и ID3v2 теги, какие-либо другие возможно не распознаются/не будут работать. Слишком длинные (по времени) файлы не поддерживаются. Для потокового воспроизведения нужно писать потоковое декодирование на основе кода функции DSCreateSoundBufferFromMemory.
  • DSCreateSoundBufferFromMemory - тоже самое, но вместо файла передается указатель на данные файла в памяти и их размер.
Также в архиве содержится пример плеера который реализует некоторые методы IDirectSoundBuffer8 интерфейса (громкость, панорама, частота, эффекты).
TLB также особо сильно не тестировалась, поэтому что-то может не работать. Если что-то не работает пишите сюда.
Скачать.
UA6527P

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

Re: DirectSound в VB6.

Сообщение Mikle » 12.03.2017 (Вс) 12:33

Помнишь, я жаловался на ошибку, когда, если проект под отладчиком поставлен на паузу (по ошибке, или точкой останова, или с помощью Stop), его нельзя окончательно останавливать кнопкой "Стоп", иначе среда вылетает. Я понимаю, что такая остановка некорректна, созданы объекты, выделена память, но с dx8vb.dll таких проблем не было, не было и с моей dx_vb.dll.
Я, кажется, это локализовал, это где-то в DirectSound, в Direct3D таких проблем не возникает, хоть я насоздаю буферов, текстур, шейдеров и т. п.
Вот минимальный проект на DirectSound, создаётся один SoundBuffer и воспроизводится с регулировкой параметров, всё работает корректно, но попробуй добавить точку останова, например, в Sub hsVol_Change(), потом запусти и в программе двинь ползунок громкости - программа остановится на паузу, выполнение можно продолжить, всё сработает корректно, но, если её остановить - вылетает.
Вложения
DS.zip
(42.77 Кб) Скачиваний: 247

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

Re: DirectSound в VB6.

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

Mikle писал(а):Вот минимальный проект на DirectSound, создаётся один SoundBuffer и воспроизводится с регулировкой параметров, всё работает корректно, но попробуй добавить точку останова, например, в Sub hsVol_Change(), потом запусти и в программе двинь ползунок громкости - программа остановится на паузу, выполнение можно продолжить, всё сработает корректно, но, если её остановить - вылетает.

У меня не вылетает.
UA6527P

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

Re: DirectSound в VB6.

Сообщение Mikle » 12.03.2017 (Вс) 13:21

Странно. Я сейчас скачал твой плеер из п.1, взял оттуда tlb и заменил ей свою, выполнил поиск по всем дискам, убедился, что других копий dsvb.tlb у меня нет (только в корзине).
Как крашилось - так и крашится.
Тогда я взял твой плеер, в обработчик регулятора панорамы вставил точку останова - тоже крашится.
VB6 с SP6, Win XP SP3.
Через час попробую на другом компьютере.

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

Re: DirectSound в VB6.

Сообщение Mikle » 12.03.2017 (Вс) 14:42

На другом компьютере то же самое, вылет среды без каких-либо сообщений.
dx8vb и dx_vb работают, но немного по-разному:
Если запустить звук PlayLoop, то с dx8vb звук по кнопке "Стоп" останавливается, а с dx_vb продолжает звучать до закрытия IDE.

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

Re: DirectSound в VB6.

Сообщение Mikle » 12.03.2017 (Вс) 16:48

Проверил на третьем компьютере, всё то же.
Может я неправильно объяснил, что я делаю?

    Ставлю точку останова ("1" на рисунке).
    Запускаю программу.
    Запускаю звук в режиме PlayLoop.
    Двигаю фейдер панорамы (нижний), программа становится на паузу.
    Жму кнопку ("2" на рисунке).

Всё! Вылет стабильно. Уже на трёх компьютерах проверил.
Просьба всем, читающим тему, тоже проверить.
Для работы программы нужна dsvb.tlb из первого сообщения данной темы, я её закидывал в System32, там она автоматом регистрируется.

dsvbbug.PNG
dsvbbug.PNG (18.95 Кб) Просмотров: 8775

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

Re: DirectSound в VB6.

Сообщение The trick » 12.03.2017 (Вс) 17:59

UA6527P

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

Re: DirectSound в VB6.

Сообщение Mikle » 12.03.2017 (Вс) 18:56

Блин... может оно только на XP-шке так ведёт себя.

Добавлено:
Попробовал, установил на Win7 x64 VB6, теперь другая беда - при нажатии на "Стоп" звук прекращается, но IDE зависает, "Стоп" остаётся активным, "Play" и "Пауза" не работают, закрыть IDE удаётся.

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

Re: DirectSound в VB6.

Сообщение Хакер » 12.03.2017 (Вс) 20:01

Mikle писал(а):Блин... может оно только на XP-шке так ведёт себя.

Сейчас потестим.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: DirectSound в VB6.

Сообщение Хакер » 12.03.2017 (Вс) 21:43

Странно, вроде бы давно отписался, а собственного ответа не вижу.

В общем:
1) У меня тоже падает.
2) Если кратко: непосредственная причина падения в том, что при нажатии кнопки «Стоп» выполняется некий код, который у некоторого COM-интерфейса вызывает IUnknown::Release. Однако к моменту вызова IUnknown::Release участо памяти, где лежала ссылка на COM-интерфейс оказывается в буквальном смысле освобождён (вызовом HeapFree). Потому что HeapFree имеет характерную особенность (для целей отладки): память, которая освобождается, заполняется DWORD-ами 0xFEEEFEEE. Именно такой DWORD и содержится там, где код VBA6.DLL ожидает ссылку на COM-интерфейс.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: DirectSound в VB6.

Сообщение Хакер » 13.03.2017 (Пн) 0:25

Падает в RESDESCTBL::DestructItem. Что такое RESDESCTBL отдалённо я вроде писал.

При нажатии «Стоп» VB пытается зачистить все «ресурсы» проекта, коими считаются существующие объекты или модули их «члены», то есть свойства и модульные переменные. За зачистку каждой такой переменной отвечает отдельный вызов RESDESCTBL::DestructItem.

При очередном вызове RESDESCTBL:DestructItem, который делается ради того, чтобы зачистить очередной модульный член (свойство класса или переменную модуля), эта функция натыкается на член, тип которого — объектная ссылка. Метод RestructItem пытается вызвать IUnknown::Release на этой ссылке и получает полный облом по причине того, что на месте vtable оказывается мусор (дворды 0xFEEEFEEE).

Стек вызовов на момент фатального вызова RESDESCTBL::DestructItem вот такой:
call_stack_when_calling_RESDESCTBL_DestructItem.png
call_stack_when_calling_RESDESCTBL_DestructItem.png (10.96 Кб) Просмотров: 8741


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

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

Re: DirectSound в VB6.

Сообщение Хакер » 13.03.2017 (Пн) 0:47

Выяснил!

Всё оказалось предельно просто. Более того, оказалось, что для воспроизведения бага не нужно никаких контролов, ползунков громкости и панорамы — не нужно также ставить проект на паузу, ставить брекпоинты.

Достаточно просто во время работы проекта нажать кнопку «Стоп» — не важно, из выполняющегося ли проекта или из кода на паузе. Более того, падение остаётся и в скомпилированном проекте, если в случайный момент сделать End.

Причина падения проста:
Библиотека DirectSound нарушает фундаментальное правило COM в отношении времени жизни объектов (что время их жизни должно подчиняться подсчёту ссылок — пока хоть одна ссылка есть, объект не имеет права умирать).

Когда отпускается последняя ссылка на корневой объект иерархии — экзмпляр класса DirectSound8 — не только корневой объект уничтожается, но и дочерние, точнее подчинённые ему объекты (такие как объекты-буфры), на которые ещё можно быть полно действущих объектных ссылок, ТОЖЕ уничтожаются. Не дожидаясь, пока ссылки на них будут корректно отпущены. Что нарушает правила COM.

Иными словами, одного Set DS = Nothing достаточно для того, чтобы все остальные объекты, связанные с DirectSound, тоже уничтожились, а память, ими занимаемая, освободилась.

—Как это сталкивается с поведением VB?
—Очень просто! Вызов RESDESCTBL::DestructModInst вызывается для экземпляра формы с целью зачистить все её внутренности. Этот метод обходит все члены «ModInst»-а и зачищает каждый вызовом RESDESCTBL::DestructItem. Члены обходятся в том порядке, в каком они объявлены, а объявлены они в таком порядке:
Код: Выделить всё
Dim DS As DirectSound8
Dim DSB As IDirectSoundBuffer8


Первой зануляется ссылка на корневой объект. Однако при этом (в нарушение правил) уничтожается не только корневой объект, но и все остальные.
Второй зануляется переменная DSB — однако объект, ссылка на который всё ещё лежит в DSB, уже уничтожился, память под него освобождена. Отсюда имеем креш.

Отсюда очевидный workaround для этого бага (со стороны библиотеки Direct Sound): поменять код так, чтобы при автоматической очистке памяти силами VB корневой объект освобождался последним их всех. То есть в данном случае просто объявить сначала DSB, потом DS.

Порядок обхода членов класса (формы) методом DestructModInst изменится, и объект-буфер не будет уничтожаться преждевременно.

Вот я сократил проект до той степени, когда баг проявляется и сделал две версии: как было (которая всегда должна падать при запуске), и с изменённым порядком переменных (которая не должна падать). Отличаются они только порядком объявления переменных.

mkdsdbg.zip
(10.44 Кб) Скачиваний: 241


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

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

Re: DirectSound в VB6.

Сообщение The trick » 13.03.2017 (Пн) 0:50

Хакер, Майкл спасибо за отладку.
UA6527P

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

Re: DirectSound в VB6.

Сообщение Mikle » 13.03.2017 (Пн) 9:00

Хакер писал(а):для воспроизведения бага не нужно никаких контролов, ползунков громкости и панорамы — не нужно также ставить проект на паузу, ставить брекпоинты.

Достаточно просто во время работы проекта нажать кнопку «Стоп» — не важно, из выполняющегося ли проекта или из кода на паузе. Более того, падение остаётся и в скомпилированном проекте, если в случайный момент сделать End.

Прям мои мысли читаешь :) Мне эта мысль спать мешала, думал встану, проверю.
The trick писал(а):спасибо за отладку.

Это тебе спасибо за библиотеку. Мне она нужна, вот я и шевелюсь.
Кстати, есть мысль по поводу причины того, что у тебя проект не падает. Может быть у тебя при установке SDK был включен отладочный режим, работают отладочные версии dll, а их работа отличается от работы обычных?
Это только предположение.

Хакер писал(а):Майкл, пожалуйста, проверь и подтверди, что все мои выводы верны

MUST_FAIL версия падает, MUST_WORK работает.

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

Re: DirectSound в VB6.

Сообщение Хакер » 13.03.2017 (Пн) 10:18

Mikle писал(а):Кстати, есть мысль по поводу причины того, что у тебя проект не падает. Может быть у тебя при установке SDK был включен отладочный режим, работают отладочные версии dll, а их работа отличается от работы обычных?

Скорее всего просто более новые версии DLL DirectSound с исправленным багом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: DirectSound в VB6.

Сообщение Mikle » 13.03.2017 (Пн) 10:33

Ещё тест, исходя из вышепроведённого расследования, я сделал вывод, что даже без End или Stop проект можно завесить просто поменяв местами строки в ClearAll таким образом:
Код: Выделить всё
  Set DS = Nothing
  DSB.Stop
  Set DSB = Nothing

Да, проект рушится при закрытии окна, можно даже не запускать звук.

Хакер писал(а):Скорее всего просто более новые версии DLL DirectSound с исправленным багом.

Даже новее тех, что идут с семёркой?
Да и остаётся вопрос, почему тогда ничего не падает ни через dx8vb, ни через dx_vb.

Правка:
Падает с dx_vb, если так же изменить ClearAll! А по End не падает потому, что нет COM-объектов, о которых знает VB6, а ClearAll не выполняется, объекты остаются висеть мусором в памяти, но IDE при её закрытии, как-то умудряется их тоже уничтожить.
А вот dx8vb.dll не падает никак, видимо внутри ведёт подсчёт ссылок.
Последний раз редактировалось Mikle 13.03.2017 (Пн) 10:38, всего редактировалось 1 раз.

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

Re: DirectSound в VB6.

Сообщение Хакер » 13.03.2017 (Пн) 10:38

Mikle писал(а): я сделал вывод, что даже без End или Stop проект можно завесить просто поменяв местами строки в ClearAll таким образом:

Да, я хотел это написать, но понял, что это и так очевидно.

А вообще, ты знаешь, как обойти проблему в случае, когда у тебя будет сложный проект с кучей классов, кучей объектов и кучей взаимных ссылок, то есть в ситуации, когда время жизни отдельной ссылки проследить будет сложно?

Mikle писал(а):Даже новее тех, что идут с семёркой?

А ты на семёрке воспроизвёл баг?

Mikle писал(а):Да и остаётся вопрос, почему тогда ничего не падает ни через dx8vb, ни через dx_vb.

Что такое dx_vb?
А что касается dx8vb, то по всей видимости там просто обернули все DS-объекты крохотными тривиальными обёртками, которые исправляют баг. То есть просто каждый дочений объект иерархии хранит ссылку на корневой и не отпускает её, пока сам не умрёт. В таком случае корневой объект никогда не уничтожится раньше дочерних. Но это только предположение, хотя можно и проверить.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: DirectSound в VB6.

Сообщение Mikle » 13.03.2017 (Пн) 10:43

Я там выше пост дописал.

Хакер писал(а):А вообще, ты знаешь, как обойти проблему в случае, когда у тебя будет сложный проект с кучей классов, кучей объектов и кучей взаимных ссылок, то есть в ситуации, когда время жизни отдельной ссылки проследить будет сложно?

Нет. Особенно когда в проекте много модулей, откуда мне знать, в каком порядке будут удаляться объекты разных модулей?
Хакер писал(а):А ты на семёрке воспроизвёл баг?

Я же выше написал, там IDE не закрывается, а виснет.
Хакер писал(а):Что такое dx_vb?

Это моя dll, которой я пользовался раньше, она нативная, по типу WinAPI, о создании с помощью неё COM-объекта VB6 ничего не узнаёт, в посте выше об этом есть.

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

Re: DirectSound в VB6.

Сообщение Mikle » 13.03.2017 (Пн) 10:47

Хакер писал(а):А вообще, ты знаешь, как обойти проблему в случае, когда у тебя будет сложный проект с кучей классов, кучей объектов и кучей взаимных ссылок, то есть в ситуации, когда время жизни отдельной ссылки проследить будет сложно?

Подозреваю, что нужно просто хранить ссылку на DS8 в таком месте, которое VB6 уничтожит последним, но только что это за место?

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

Re: DirectSound в VB6.

Сообщение Mikle » 13.03.2017 (Пн) 11:53

На счёт большого проекта.
Вот мой проект, хорошо подходит для теста: https://yadi.sk/d/_xPTO0c73FfWBR
Меняя в modD3D #Const Test можно выключать тестовый режим, но это касается только графики.
Вся работа с DS собрана в один модуль modDS, с помощью константы SoundEnabled можно временно отключать звук, тогда проект работает корректно.
Не смотря на то, что весь звук в одном модуле, смена порядка объявления объектных переменных не решает проблему падения проекта по End.

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

Re: DirectSound в VB6.

Сообщение Mikle » 23.02.2020 (Вс) 10:20

The trick, приветствую!
Попытался сделать звукозапись на основе твоей библиотеки, но не вышло.
Интерфейс IDirectSoundCapture8 присутствует, но нет метода для создания соответствующего объекта, и нет методов самого объекта IDirectSoundCapture8. Мне нужен метод CreateCaptureBuffer.
Может просто есть большое различие с DirectSound из состава dx8vb.dll? Но я что-то не разберусь.
Прилагаю простейший индикатор уровня записи с использованием dx8vb.dll. Там есть макрос ReadBuffer, он разложится на Lock-memcpy-Unlock, это понятно, но вот как создать сам DirectSoundCaptureBuffer8?
Вложения
SoundLevel.zip
(2.26 Кб) Скачиваний: 126

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

Re: DirectSound в VB6.

Сообщение The trick » 28.02.2020 (Пт) 13:07

Привет!

Код: Выделить всё
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private DSc As DirectSoundCapture8
Private DScb As IDirectSoundCaptureBuffer8
Private DScbd As DSCBUFFERDESC
Private Buf() As Integer
Private CurPos As Long
Private Level As Single

Public Sub SoundInit()
  Dim tfx As WAVEFORMATEX
 
  ReDim Buf(2047)
  CurPos = 0
  Level = 0
 
  With tfx
    .wFormatTag = 1
    .nChannels = 1
    .nSamplesPerSec = 44100
    .wBitsPerSample = 16
    .nBlockAlign = .wBitsPerSample / 8 * .nChannels
    .nAvgBytesPerSec = .nSamplesPerSec * .nBlockAlign
   .cbSize = 0          ' Ignored for WAVE_FORMAT_PCM.
  End With
 
  DScbd.dwSize = Len(DScbd)
  DScbd.lpwfxFormat = VarPtr(tfx)
  DScbd.dwFlags = 0
  DScbd.dwBufferBytes = 65536

  Set DSc = New DirectSoundCapture8
  DSc.Initialize ByVal 0&
  DSc.CreateCaptureBuffer DScbd, DScb, Nothing
  DScb.Start DSCBSTART_LOOPING
 
End Sub

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

Public Sub SoundTick(ByRef Lev As Single)
  Dim i           As Long
  Dim d           As Long
  Dim p1          As Long
  Dim p2          As Long
  Dim l1          As Long
  Dim l2          As Long
 
  If ((GetCurPos - CurPos + 65536) And 65535) > 4095 Then

    DScb.Lock CurPos, 4096, p1, l1, p2, l2, 0
   
    CopyMemory Buf(0), ByVal p1, l1
   
    If p2 Then
        CopyMemory ByVal VarPtr(Buf(0)) + l1, ByVal p2, l2
    End If
   
    DScb.Unlock p1, l1, p2, l2

    CurPos = (CurPos + 4096) And 65535
   
    For i = 0 To 2047
      d = d + Abs(CLng(Buf(i)))
    Next i
   
    Level = d / (32768 * 2048)
   
  End If
 
  Lev = Level
 
End Sub

Private Function GetCurPos() As Long

  DScb.GetCurrentPosition GetCurPos, 0&

End Function
UA6527P

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

Re: DirectSound в VB6.

Сообщение Mikle » 28.02.2020 (Пт) 16:16

Не работает, интерфейса DirectSoundCapture8 нет. Есть IDirectSoundCapture8, но на строке Private DSc As IDirectSoundCapture8 получаем ошибку: "Automation type not supported in Visual Basic".
dsvb на всякий случай скачал заново по ссылке в начале данной темы.
Может ты проверял, забыв отключить ссылку на dx8vb?

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

Re: DirectSound в VB6.

Сообщение The trick » 28.02.2020 (Пт) 16:44

Проверь сейчас, у меня просто tlb в другом месте лежит, я обновил в архиве tlb.
UA6527P

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

Re: DirectSound в VB6.

Сообщение Mikle » 28.02.2020 (Пт) 19:55

Да, с этой библиотекой работает. Спасибо!

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

Re: DirectSound в VB6.

Сообщение Mikle » 07.03.2020 (Сб) 19:15

Несколько дней бился с проблемой - спектроанализатор с данной библиотекой даёт сильные гармоники на чистом синусоидальном сигнале, причём не только кратные частоты, но и дольные. Полностью аналогичная программа на dx8vb работает нормально. Тогда я сделал сохранение в файл прочитываемого буфера, и увидел, что в сигнале не синус, а его короткие обрывки, из-за стыков получаются лишние частоты. Тогда в DirectX SDK я вычитал, что при чтении CaptureBuffer нужно убедиться, что из зоны чтения ушёл не только capture cursor, но и read cursor. Я это сделал, и всё заработало нормально. Я посмотрел позиции курсоров во время работы программы - read cursor всегда отстаёт от capture cursor, получается, что capture cursor можно вообще не проверять.
Всё теперь нормально, только странно, что для ReadBuffer из dx8vb хватает одного capture cursor.


Вернуться в The trick

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList