| 
		
		
		
	
		
		
	
		
		
			| Прослойка для FBSound (полный фарш) |  | 
				
			 |  | 
					| DarkDemon | Дата: Вторник, 28.10.2025, 02:33 | Сообщение # 1 |  | Генерал-майор Группа: Друзья Сообщений: 261 Статус: Offline | В архиве скомпонованные и настроенные(для Windows) два FBSound-a, вместе с самописной прослойкой. 
 Суть прослойки: сделать групповую организацию звуков. Основной функционал: простое полу-автоматическое
 добавление звуков и воспроизведение как строго заданного звука, так и СЛУЧАЙНОГО звука из группы, исключая
 повторы(смотрится стек отданных на воспроизведение).
 
 Функционал пока минимальный и абсолютно точно будет расти.
 
 Работа сделана для двух компиляторов: 0.23.0 и 1.10.1. Другие не проверял, возможно где-то ещё заработает.
 Т.е. охватил и старые и новые. Тестируйте, юзайте, плодитесь и размножайтесь.
 
 Забавное демо прилагается.
 
 P.S: надеюсь петерс меня не казнит за наглость сливать так его работу с другими исходниками, его авторство указал.
 
 На форум не лезет, поэтому берём с облака:
 
 Google диск:
 https://drive.google.com/file....sharing
 
 Яндекс диск:
 https://disk.yandex.ru/d/8kFTNztzq9l4xw
 |  |  |  |  |  | 
					| haav | Дата: Вторник, 28.10.2025, 05:18 | Сообщение # 2 |  |  Генералиссимус Группа: Администраторы Сообщений: 1436 Статус: Offline | Цитата  Суть прослойки: сделать групповую организацию звуков.
 Не понял. Это плеер что-ли?
 
 
 Цитата  надеюсь петерс меня не казнит за наглость сливать так его работу с другими исходниками, его авторство указал.
 Не казнит , умер он.
 
 
 
 Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 |  |  |  |  |  | 
					| DarkDemon | Дата: Вторник, 28.10.2025, 10:25 | Сообщение # 3 |  | Генерал-майор Группа: Друзья Сообщений: 261 Статус: Offline | Цитата haav (  )  Не понял. Это плеер что-ли?Ну по смыслу - совсем немного. По реализации - конечно нет. Это просто небольшая прослойка
 в основном для игр. В будущем есть планы написать простой микшер на MME и отвязаться от FBSound,
 поэтому не использовал функционал библиотеки для загрузки чего-то кроме WAV.
 К слову WAV библиотека грузит не все, только 16 битные, 24-х и 32-х - уже нет(проверил на FBSound версии 1.0).
 И тут забавное совпадение FlicFlac не имеет настроек и переводит по битности, т.е. получить 16 битные
 не всегда возможно.
 
 
 Цитата haav (  )  Не казнит , умер он.Ёлы палы, дерьмово. Крутейший был. А когда это произошло?
 |  |  |  |  |  | 
					| haav | Дата: Вторник, 28.10.2025, 12:29 | Сообщение # 4 |  |  Генералиссимус Группа: Администраторы Сообщений: 1436 Статус: Offline | Цитата DarkDemon (  )  А когда это произошло?
 пару месяцев назад.
 
 Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 |  |  |  |  |  | 
					| zamabuvaraeu | Дата: Вторник, 28.10.2025, 12:44 | Сообщение # 5 |  | Полковник Группа: Друзья Сообщений: 173 Статус: Offline | Жрёт от 0,6% до 0,7% процессора. Это конечно копейки, но…
 После того как воспроизвело звук, что оно делает? Какую полезную задачу решает?
 
 (У меня свёрнутая VSCode кушает меньше)
 |  |  |  |  |  | 
					| DarkDemon | Дата: Вторник, 28.10.2025, 13:03 | Сообщение # 6 |  | Генерал-майор Группа: Друзья Сообщений: 261 Статус: Offline | Поясню суть работы. 
 Изначально, нужно морочиться с хендлами(заводить массивы или списки), так или иначе самому за этим следить,
 прослойка берёт это на себя пишется:
 
 
 Код LoadWAV  "Filename.wav",    1
И данный файл сразу улетает в группу 1, ему назначается номер 0, следующему будет назначен номер 1 и т.д.
 
 Соотв. одним оператором воспроизводим.
 
 
 Код PlaySND 1, 0            '  Номер группы, номер звука
И если нам требуется воспроизвести случайный, максимально долго не повторяющийся звук из группы, то мы используем.
 
 
 Код RandomSND  1        '  Случайный звук из группы 1
Он выстраивает последовательность воспроизведения так, чтобы следующий раз тот же самый звук в этом вызове
 был воспроизведён через кол-во случайных воспроизведений, равных кол-ву звуков в группе. Эта "неповторяемость"
 работает бесконечно долго.
 
 Перед запуском какого-либо воспроизведения мы должны указать параметры: громкость, скорость, панораму.
 
 Делается это тоже простой командой:
 
 Код PlayParam  1, 1, 0   ' Громкость(0..1), Скорость(0..3), Панорама(-1..1)
В начале программы делать это обязательно, т.к. параметры изначально стоят в ноль и звука попросту не будет слышно.
 
 Это очень простая штука. Пока все файлы нужно грузить руками, но потом, когда-нибудь сделаю загрузку целых папок
 в группы полностью автоматом. У меня был модуль сканирования директорий, но он ещё не обёрнут в Namespace, его
 надо переписать и проверить.
 Поэтому пока так, да и в принципе иногда бывает лучше, когда в самой программе видно какие звуки мы подгружаем.
 
 
 Прям ваще недавно.
 Добавлено (28.10.2025, 13:13)---------------------------------------------
 
 Код Жрёт от 0,6% до 0,7% процессора.
После отработки функции оно столько точно не жрёт, просто физически не может, там нет таких операций, которые могут
 столько потреблять. Видать это жрёт консоль и стандартный цикл получения буфера клавиатуры и сравнение строк.
 Как оно там работает - я не в курсе, но для демо не стал заморачиваться в такты и задротствовать. Можно прибавить SLEEP,
 сделать 100, 1 и тогда колыхаться не должно.
 Сама библиотека Петерса вроде неплохо оптимизирована и на большой пачке из примерно 50-ти воспроизводимых
 звуков давало какие-то жалкие копейки одного из ядер(2-3%).
 Добавлено (28.10.2025, 13:17)---------------------------------------------
 Ну и да, комилировал бинарник без оптимизаций, забыл про них. С оптимизациями должно быть кратно лучше.
 Добавлено (28.10.2025, 13:44)---------------------------------------------
 
 Самое главное, что библиотека сразу готова к внедрению в любой проект. Просто копируем папку Librarys и *.DLL-ки
 к себе в папку проекта, подключаем модуль и погнали - всё сразу заведётся.
 
 DLL-ки, лежащие в папке с EXE - к сожалению, убрать никак не могу, их надо держать рядом с EXE, так предпочёл
 организовать сам Петерс. Не знаю писал ли кто-нибудь, кроме него самого плагины к FBSound, на мой взгляд это
 было избыточно сложно и не оправдано. Потому и планы на отвязку от FBSound.
 Добавлено (28.10.2025, 15:14)---------------------------------------------
 
 Минусы прослойки - с помощью неё пока невозможно контролировать параметры воспроизводящихся звуков,
 т.е. допустим у нас есть звук реактора скажем из Half-Life, который надо постоянно слышать и менять его
 панораму(т.к. мы ходим и меняем свою позицию) и громкость, так вот это придётся делать через сам
 FBSound, минуя прослойку, в будущем что-нибудь придумаю для таких стационарных окружающих звуков.
 
 Если что, то через FBSound это делается получением HSound, т.е. хендла звука, это последний параметр
 функции FBS_Play_Wave. И далее, когда мы уже получили HSound, то далее этот экземпляр звука можно
 менять с помощью уже следующих функций:
 
 
 Код FBS_Set_SoundVolumeFBS_Set_SoundSpeed
 FBS_Set_SoundPan
 FBS_Get_SoundPosition
 FBS_Set_SoundLoops
 
 Последняя может быть использована для выключения зацикливания и уничтожения звука.
 |  |  |  |  |  | 
					| zamabuvaraeu | Дата: Вторник, 28.10.2025, 15:35 | Сообщение # 7 |  | Полковник Группа: Друзья Сообщений: 173 Статус: Offline |  Понятно, опрос.Цитата  После отработки функции оно столько точно не жрёт, просто физически не может, там нет таких операций, которые могутстолько потреблять. Видать это жрёт консоль и стандартный цикл получения буфера клавиатуры и сравнение строк.
 Как оно там работает - я не в курсе, но для демо не стал заморачиваться в такты и задротствовать. Можно прибавить SLEEP,
 сделать 100, 1 и тогда колыхаться не должно.
А зачем? Почему нельзя просто ждать когда нажмут клавишу?
 Добавлено (28.10.2025, 15:38)---------------------------------------------
 
 Ну раньше DLL совали в c:\windows\system32, но уже во времена Win2000 поняли что это дурной тон, и все свои DLL кладут рядом с программой. Так что это хорошо.Цитата  DLL-ки, лежащие в папке с EXE - к сожалению, убрать никак не могу, их надо держать рядом с EXE |  |  |  |  |  | 
					| DarkDemon | Дата: Вторник, 28.10.2025, 16:39 | Сообщение # 8 |  | Генерал-майор Группа: Друзья Сообщений: 261 Статус: Offline | Мне не очень приятно вместе с исходником видеть файлы, которых там быть не должно.
 И ладно 1-2 файла, но когда их много - это жопа, начинаешь искать что-то среди них, путаться,
 тратить время. Поэтому всегда топил за статическую линковку или если она динамическая - то лучше
 пихать DLL-ки в отдельную папку и загружать соотв. функциями винды. Петерс не стал так делать,
 не знаю почему, может причины были, может не было. Одно я знаю точно - MME легко кодится без всяких
 DLL. Можно было сделать модулем и когда дойдут руки - сделаю, если, конечно, не сдохну как дядька Петерс.
 
 
 Код Почему нельзя просто ждать когда нажмут клавишу?
Можно и вероятно даже нужно. Но не всем и не всегда это делать просто. Многие даже не знают как это делать.
 Я знаю как это делать, но мне не хочется заморачиваться этими "обвязками". Сам вырос на простом бейсике,
 где организация программы была строго линейной и на ВУ в прерывания никто не лез. Делали примерно как у меня,
 ну только без проверки "стрингов". Сразу сливали в ASC код. Можно ещё отдавать CASE-у. Будет быстрее.
 А миксовать линейные и нелинейные подходы - очень не люблю. Благо сейчас есть и потоки и SLEEP, при
 желании можно это всё сделать очень параллельным и потребляющим копейки.
 
 Я не знаю почему эта обвязка жрёт 0.7%. У меня она жрёт 0% по диспетчеру, редко что-то пукнет до 2-3%,
 при том что могу просто раз 10 пройтись по клавишам и будет играть куча звуков, а на диспетчере всё равно 0%.
 Скорее всего вывод в консоль всё жестоко тормозит. И если избавиться от консоли - ничего такого уже не будет.
 
 Можно заморочиться, либо подключать Window9, либо делать руками виндовое приложение со всеми этими
 классами окон, оконными функциями, обработкой очередей и прочим. Это долго, геморройно и весь этот код
 будет маячить перед глазами. Могу это всё писать даже на голом ассемблере. И будет быстро, пиздец как быстро.
 Но мало кто это будет читать, я же не только для профи это делаю. Профи и обвязку брать не будет, свою напишет.
 |  |  |  |  |  | 
					| zamabuvaraeu | Дата: Вторник, 28.10.2025, 17:08 | Сообщение # 9 |  | Полковник Группа: Друзья Сообщений: 173 Статус: Offline |  Диспетчер округляет и всё что меньше 1 показывает как 0. В Process Hacker и Process Explorer всё точнее показывается.Цитата  У меня она жрёт 0% по диспетчеру |  |  |  |  |  | 
					| DarkDemon | Дата: Вторник, 28.10.2025, 18:17 | Сообщение # 10 |  | Генерал-майор Группа: Друзья Сообщений: 261 Статус: Offline | По хорошему я согласен: надо писать проги на втором пентиуме и жестоко мониторить производительность в пачке.
 Эффективнее этого способа - всё равно не будет, а на современных - бесполезно, толк околонулевой.
 
 И да если кто заметил, FBSound долго шутдаунится, это не на шутку напрягает. Трудно понять почему, видимо это
 влияние тех библиотек, которые Петерс интегрировал в свою.
 
 
 Цитата zamabuvaraeu (  )  В Process Hacker и Process Explorer всё точнее показывается.
 Да я без вопросов. Просто мне это зачем, блох этих ловить? Как бы знаю, что прослойка с гарантией столько не жрёт
 Ты легко можешь открыть и посмотреть исходник, там нет ресурсоёмких операций.
 |  |  |  |  |  | 
					| zamabuvaraeu | Дата: Вторник, 28.10.2025, 19:09 | Сообщение # 11 |  | Полковник Группа: Друзья Сообщений: 173 Статус: Offline | Потому что у меня бомбит и пригорает от антишаблона программирования «Опрос». 
 Дело же не в том, сколько программа жрёт когда выполняет полезную нагрузку. Дело в том, что программа вообще жрёт 0,00001% процессора когда делает ничего.
 
 Что программа делает, когда она свёрнута, не в фокусе или закрыта другим окном? Проверяет не нажата ли клавиша. Но когда программа свёрнута, клавиша не может быть нажата в принципе. Работа вхолостую, только такты процессора тратит.
 
 На самом деле программа должна уснуть. Как только нажмут клавишу — тогда проснуться и реагировать.
 
 Я считаю, что опрос — это удар по производительности. И со мной солидарен даже Реймонд Чен https://www.transl-gunsmoker.ru/2010....8013025
 |  |  |  |  |  | 
					| DarkDemon | Дата: Вторник, 28.10.2025, 19:40 | Сообщение # 12 |  | Генерал-майор Группа: Друзья Сообщений: 261 Статус: Offline | Ну да портянка IF-ов конечно ребят напрягает, ну блин я ж для туфяков делаю, чтоб любой мог ухватить. 
 А так где надо делаю вот так, но ньюбис посмотрит на это и такой  "да ну нахер этот бейсик", вроде обещал быть простым,
 а тут пачка каких-то кейзов внутри кейзов, почти как из дюны "планы внутри планов"  :
 
 Код DO : Kb = INKEY
 SELECT CASE (LEN(Kb) + ABS(Rdr) SHL 1)
 
 CASE 1
 Asc1 = ASC(LEFT(Kb, 1))
 SELECT CASE Asc1
 CASE 82, 114, 48 TO 57
 '  Задаём случайные параметры воспроизведения
 PlayParam   1, .75 + RND * .5, RND * 2 - 1
 END SELECT
 
 SELECT CASE Asc1
 CASE 48: PlaySND (TestGroup, 9)
 CASE 49 TO 57: PlaySND (TestGroup, Asc1 - 49)
 CASE 82, 114: RandomSND (TestGroup)
 CASE 27: EXIT DO
 END SELECT
 
 CASE 2
 Asc1 = ASC(LEFT(Kb, 1)): Asc2 = ASC(RIGHT(Kb, 1))
 
 '  Выбираем номер группы
 IF Asc1 = 255 THEN
 
 IF (Asc2 = 75) ANDALSO (TestGroup > 1) THEN TestGroup = FindPrevGroup(TestGroup): Rdr = -1
 IF (Asc2 = 77) ANDALSO (TestGroup <  MaxGroup) THEN TestGroup = FindNextGroup(TestGroup): Rdr = -1
 
 END IF
 
 IF Rdr THEN
 CLS 2
 PRINT "Group: "; TestGroup;  "    To Select Group Press [" + CHR(17); "] or ["; CHR(16); "]"
 PRINT : PRINT : PRINT "PRESS :"
 FOR i AS INTEGER = 1 TO IIF ( SoundsInGroup(TestGroup) < 10, SoundsInGroup(TestGroup), 9 )
 LOCATE i + 5, 5: PRINT "[ "; CHR(48 + i); " ]  to  PLAY  sound "; i
 NEXT
 IF SoundsInGroup(TestGroup) > 9 THEN LOCATE , 5: PRINT "[ 0 ]  to  PLAY  sound 10"
 ? : LOCATE , 5: PRINT "[r]  to  play  RANDOM  sound this GROUP"
 LOCATE 20, 5: PRINT "[ Esc ]  to  EXIT"
 Rdr = 0
 END IF
 
 CASE ELSE
 
 END SELECT
 
 SLEEP 100, 1
 LOOP[/r]
 
Если и это жрёт больше пол процента - то мои полномочия тут уже всё... Это уже к разрабам FB и к разрабам винды.
 Добавлено (28.10.2025, 20:24)---------------------------------------------
 
 Цитата zamabuvaraeu (  ) Я не знаю кто это, но парень явно перегибает.
 
 Во-первых там не будет никаких 0,1 процента. А значительно меньше.
 Про поднятие из энергосберегающего режима, - да я в гробу видал этот энергосберегающий режим(турбо бусты),
 но даже если оно кому-то и нужно - винда сама 10000 раз поднимет частоты своими службами. Винда сейчас это
 ТЯЖЕЛЕННАЯ СИСТЕМА, которая сжирает порой намного больше ресурсов чем программы запущенные на ней.
 И никакой диспетчер тебе это не покажет, оно грамотно вычитает свои затраты. Т.н. время ядра - тоже мухлюет.
 
 По поводу серверов и соединений - тут всё дело в архитектуре. Где идёт узкое место. Там есть это узкое место
 и там надо делать правильно, всмысле на серверах, где тысячи соединений. А в таймере в каком-нибудь редакторе,
 скажем даже на 1/1000 - нет никакого узкого места, которое сожрёт 80%.
 
 Более того иногда по-другому решить задачу не то что невозможно, но крайне трудно. Например, если человек
 не использует ООП модель - то то, про что ты говоришь превратит ему кодинг в сущий АД. А я её никогда и не использую.
 Да не всегда можно менять параметры работы программы по коллбеку, иногда можно, а иногда просто движок сделан так,
 что нельзя и чтобы сделать по другому - нужно переделывать весь движок и нужна совсем другая аналитика.
 И что мы увидим, прога обрастёт кучей коллбеков, большинство которых - искусственные(ведь мы знаем, что по
 итогу весь код всё равно будет линеен). И самое дерьмовое тут то, что цельный монолитный двиг с куском в одном
 месте придётся разбивать (в т.ч. архитектурно, а не просто взял и разбил на части, т.е. полностью перерабатывать
 архитектуру, возможно круто и хорошо сделанную, на совесть, а не как сейчас делают) по этим коллбекам
 в асинхронную модель, это может не просто создать кучу головняка при обдумывании, а вообще загубить разработку,
 просто потому что не всегда возможно сделать модель полностью блочно-независимой. Где-то можно, но не везде.
 Причём эта модель, на деле, всё равно свернётся в линейную, но без твоего участия, компиль её свернёт.
 Так ты сам будешь этим заниматься и будешь знать где что и как и что по другому оно там не встанет в линейной модели.
 А линейная модель легко итеративно проверяется, её легче дебажить.
 
 И вот да всё говорят про крутой кодинг, про доли процента, про такты, но никто не говорит, что поставь винду 10-ку на
 комп 15-го года(на целерон 2.8, с 4Гб памяти, а заявлены вроде как 2Гб в системных требованиях и 1 ГГц), то мы увидим
 слайдшоу из < 10 кадров, если откроем какой-нибудь эксель и будем таскать окно по экрану.
 И да я видел ноуты со свопом и 100% загрузкой диска, ноуты с 8 Гб памяти, с 10-кой, 10-кой после процедуры Recovery,
 т.е. якобы "чистой", на деле там была куча предустановленного дерьма.
 
 И тут встаёт вопрос так ли критичен ссаный таймер или опрос клавиатуры на этом фоне.
 |  |  |  |  |  
 |