|
Прослойка для FBSound (полный фарш)
|
|
| DarkDemon | Дата: Вторник, Вчера, 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 | Дата: Вторник, Вчера, 05:18 | Сообщение # 2 |
 Генералиссимус
Группа: Администраторы
Сообщений: 1436
Статус: Offline
| Цитата Суть прослойки: сделать групповую организацию звуков.
Не понял. Это плеер что-ли?
Цитата надеюсь петерс меня не казнит за наглость сливать так его работу с другими исходниками, его авторство указал.
Не казнит , умер он.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
| |
|
|
| DarkDemon | Дата: Вторник, Вчера, 10:25 | Сообщение # 3 |
|
Генерал-майор
Группа: Друзья
Сообщений: 261
Статус: Offline
| Цитата haav (  ) Не понял. Это плеер что-ли? Ну по смыслу - совсем немного. По реализации - конечно нет. Это просто небольшая прослойка в основном для игр. В будущем есть планы написать простой микшер на MME и отвязаться от FBSound, поэтому не использовал функционал библиотеки для загрузки чего-то кроме WAV. К слову WAV библиотека грузит не все, только 16 битные, 24-х и 32-х - уже нет(проверил на FBSound версии 1.0). И тут забавное совпадение FlicFlac не имеет настроек и переводит по битности, т.е. получить 16 битные не всегда возможно.
Цитата haav (  ) Не казнит , умер он. Ёлы палы, дерьмово. Крутейший был. А когда это произошло?
|
| |
|
|
| haav | Дата: Вторник, Вчера, 12:29 | Сообщение # 4 |
 Генералиссимус
Группа: Администраторы
Сообщений: 1436
Статус: Offline
| Цитата DarkDemon (  ) А когда это произошло?
пару месяцев назад.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
| |
|
|
| zamabuvaraeu | Дата: Вторник, Вчера, 12:44 | Сообщение # 5 |
|
Полковник
Группа: Друзья
Сообщений: 173
Статус: Offline
| Жрёт от 0,6% до 0,7% процессора. Это конечно копейки, но… После того как воспроизвело звук, что оно делает? Какую полезную задачу решает?
(У меня свёрнутая VSCode кушает меньше)
|
| |
|
|
| DarkDemon | Дата: Вторник, Вчера, 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_SoundVolume FBS_Set_SoundSpeed FBS_Set_SoundPan FBS_Get_SoundPosition FBS_Set_SoundLoops
Последняя может быть использована для выключения зацикливания и уничтожения звука.
|
| |
|
|
| zamabuvaraeu | Дата: Вторник, Вчера, 15:35 | Сообщение # 7 |
|
Полковник
Группа: Друзья
Сообщений: 173
Статус: Offline
| Цитата После отработки функции оно столько точно не жрёт, просто физически не может, там нет таких операций, которые могут столько потреблять. Видать это жрёт консоль и стандартный цикл получения буфера клавиатуры и сравнение строк. Как оно там работает - я не в курсе, но для демо не стал заморачиваться в такты и задротствовать. Можно прибавить SLEEP, сделать 100, 1 и тогда колыхаться не должно. Понятно, опрос. А зачем? Почему нельзя просто ждать когда нажмут клавишу?Добавлено (28.10.2025, 15:38) --------------------------------------------- Цитата DLL-ки, лежащие в папке с EXE - к сожалению, убрать никак не могу, их надо держать рядом с EXE Ну раньше DLL совали в c:\windows\system32, но уже во времена Win2000 поняли что это дурной тон, и все свои DLL кладут рядом с программой. Так что это хорошо.
|
| |
|
|
| DarkDemon | Дата: Вторник, Вчера, 16:39 | Сообщение # 8 |
|
Генерал-майор
Группа: Друзья
Сообщений: 261
Статус: Offline
| Мне не очень приятно вместе с исходником видеть файлы, которых там быть не должно. И ладно 1-2 файла, но когда их много - это жопа, начинаешь искать что-то среди них, путаться, тратить время. Поэтому всегда топил за статическую линковку или если она динамическая - то лучше пихать DLL-ки в отдельную папку и загружать соотв. функциями винды. Петерс не стал так делать, не знаю почему, может причины были, может не было. Одно я знаю точно - MME легко кодится без всяких DLL. Можно было сделать модулем и когда дойдут руки - сделаю, если, конечно, не сдохну как дядька Петерс.
Код Почему нельзя просто ждать когда нажмут клавишу?
Можно и вероятно даже нужно. Но не всем и не всегда это делать просто. Многие даже не знают как это делать. Я знаю как это делать, но мне не хочется заморачиваться этими "обвязками". Сам вырос на простом бейсике, где организация программы была строго линейной и на ВУ в прерывания никто не лез. Делали примерно как у меня, ну только без проверки "стрингов". Сразу сливали в ASC код. Можно ещё отдавать CASE-у. Будет быстрее. А миксовать линейные и нелинейные подходы - очень не люблю. Благо сейчас есть и потоки и SLEEP, при желании можно это всё сделать очень параллельным и потребляющим копейки.
Я не знаю почему эта обвязка жрёт 0.7%. У меня она жрёт 0% по диспетчеру, редко что-то пукнет до 2-3%, при том что могу просто раз 10 пройтись по клавишам и будет играть куча звуков, а на диспетчере всё равно 0%. Скорее всего вывод в консоль всё жестоко тормозит. И если избавиться от консоли - ничего такого уже не будет.
Можно заморочиться, либо подключать Window9, либо делать руками виндовое приложение со всеми этими классами окон, оконными функциями, обработкой очередей и прочим. Это долго, геморройно и весь этот код будет маячить перед глазами. Могу это всё писать даже на голом ассемблере. И будет быстро, пиздец как быстро. Но мало кто это будет читать, я же не только для профи это делаю. Профи и обвязку брать не будет, свою напишет.
|
| |
|
|
| zamabuvaraeu | Дата: Вторник, Вчера, 17:08 | Сообщение # 9 |
|
Полковник
Группа: Друзья
Сообщений: 173
Статус: Offline
| Цитата У меня она жрёт 0% по диспетчеру Диспетчер округляет и всё что меньше 1 показывает как 0. В Process Hacker и Process Explorer всё точнее показывается.
|
| |
|
|
| DarkDemon | Дата: Вторник, Вчера, 18:17 | Сообщение # 10 |
|
Генерал-майор
Группа: Друзья
Сообщений: 261
Статус: Offline
| По хорошему я согласен: надо писать проги на втором пентиуме и жестоко мониторить производительность в пачке. Эффективнее этого способа - всё равно не будет, а на современных - бесполезно, толк околонулевой.
И да если кто заметил, FBSound долго шутдаунится, это не на шутку напрягает. Трудно понять почему, видимо это влияние тех библиотек, которые Петерс интегрировал в свою.
Цитата zamabuvaraeu (  ) В Process Hacker и Process Explorer всё точнее показывается.
Да я без вопросов. Просто мне это зачем, блох этих ловить? Как бы знаю, что прослойка с гарантией столько не жрёт Ты легко можешь открыть и посмотреть исходник, там нет ресурсоёмких операций.
|
| |
|
|
| zamabuvaraeu | Дата: Вторник, Вчера, 19:09 | Сообщение # 11 |
|
Полковник
Группа: Друзья
Сообщений: 173
Статус: Offline
| Потому что у меня бомбит и пригорает от антишаблона программирования «Опрос».
Дело же не в том, сколько программа жрёт когда выполняет полезную нагрузку. Дело в том, что программа вообще жрёт 0,00001% процессора когда делает ничего.
Что программа делает, когда она свёрнута, не в фокусе или закрыта другим окном? Проверяет не нажата ли клавиша. Но когда программа свёрнута, клавиша не может быть нажата в принципе. Работа вхолостую, только такты процессора тратит.
На самом деле программа должна уснуть. Как только нажмут клавишу — тогда проснуться и реагировать.
Я считаю, что опрос — это удар по производительности. И со мной солидарен даже Реймонд Чен https://www.transl-gunsmoker.ru/2010....8013025
|
| |
|
|
| DarkDemon | Дата: Вторник, Вчера, 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, т.е. якобы "чистой", на деле там была куча предустановленного дерьма.
И тут встаёт вопрос так ли критичен ссаный таймер или опрос клавиатуры на этом фоне.
|
| |
|
|
|