FreeBasic
Главная
Вход
Регистрация
Среда, 29.10.2025, 19:23Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Прослойка для FBSound (полный фарш)
DarkDemonДата: Вторник, Вчера, 02:33 | Сообщение # 1
Генерал-майор
Группа: Друзья
Сообщений: 261
Репутация: -1
Статус: 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
Репутация: 50
Статус: Offline
Цитата
Суть прослойки: сделать групповую организацию звуков.


Не понял. Это плеер что-ли?

Цитата
надеюсь петерс меня не казнит за наглость сливать так его работу с другими исходниками, его авторство указал.


Не казнит , умер он.



Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Вторник, Вчера, 10:25 | Сообщение # 3
Генерал-майор
Группа: Друзья
Сообщений: 261
Репутация: -1
Статус: Offline
Цитата haav ()
Не понял. Это плеер что-ли?

Ну по смыслу - совсем немного. По реализации - конечно нет. Это просто небольшая прослойка
в основном для игр. В будущем есть планы написать простой микшер на MME и отвязаться от FBSound,
поэтому не использовал функционал библиотеки для загрузки чего-то кроме WAV.
К слову WAV библиотека грузит не все, только 16 битные, 24-х и 32-х - уже нет(проверил на FBSound версии 1.0).
И тут забавное совпадение FlicFlac не имеет настроек и переводит по битности, т.е. получить 16 битные
не всегда возможно.

Цитата haav ()
Не казнит , умер он.

Ёлы палы, дерьмово. Крутейший был. А когда это произошло?
 
haavДата: Вторник, Вчера, 12:29 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1436
Репутация: 50
Статус: Offline
Цитата DarkDemon ()
А когда это произошло?


пару месяцев назад.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
zamabuvaraeuДата: Вторник, Вчера, 12:44 | Сообщение # 5
Полковник
Группа: Друзья
Сообщений: 173
Репутация: 5
Статус: Offline
Жрёт от 0,6% до 0,7% процессора.
Это конечно копейки, но…
После того как воспроизвело звук, что оно делает? Какую полезную задачу решает?

(У меня свёрнутая VSCode кушает меньше)
 
DarkDemonДата: Вторник, Вчера, 13:03 | Сообщение # 6
Генерал-майор
Группа: Друзья
Сообщений: 261
Репутация: -1
Статус: 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
Репутация: 5
Статус: Offline

Цитата
После отработки функции оно столько точно не жрёт, просто физически не может, там нет таких операций, которые могут
столько потреблять. Видать это жрёт консоль и стандартный цикл получения буфера клавиатуры и сравнение строк.
Как оно там работает - я не в курсе, но для демо не стал заморачиваться в такты и задротствовать. Можно прибавить SLEEP,
сделать 100, 1 и тогда колыхаться не должно.
Понятно, опрос.
А зачем? Почему нельзя просто ждать когда нажмут клавишу?

Добавлено (28.10.2025, 15:38)
---------------------------------------------


Цитата
DLL-ки, лежащие в папке с EXE - к сожалению, убрать никак не могу, их надо держать рядом с EXE
Ну раньше DLL совали в c:\windows\system32, но уже во времена Win2000 поняли что это дурной тон, и все свои DLL кладут рядом с программой. Так что это хорошо.
 
DarkDemonДата: Вторник, Вчера, 16:39 | Сообщение # 8
Генерал-майор
Группа: Друзья
Сообщений: 261
Репутация: -1
Статус: Offline
Код
Так что это хорошо.

Мне не очень приятно вместе с исходником видеть файлы, которых там быть не должно.
И ладно 1-2 файла, но когда их много - это жопа, начинаешь искать что-то среди них, путаться,
тратить время. Поэтому всегда топил за статическую линковку или если она динамическая - то лучше
пихать DLL-ки в отдельную папку и загружать соотв. функциями винды. Петерс не стал так делать,
не знаю почему, может причины были, может не было. Одно я знаю точно - MME легко кодится без всяких
DLL. Можно было сделать модулем и когда дойдут руки - сделаю, если, конечно, не сдохну как дядька Петерс.

Код
Почему нельзя просто ждать когда нажмут клавишу?

Можно и вероятно даже нужно. Но не всем и не всегда это делать просто. Многие даже не знают как это делать.
Я знаю как это делать, но мне не хочется заморачиваться этими "обвязками". Сам вырос на простом бейсике,
где организация программы была строго линейной и на ВУ в прерывания никто не лез. Делали примерно как у меня,
ну только без проверки "стрингов". Сразу сливали в ASC код. Можно ещё отдавать CASE-у. Будет быстрее.
А миксовать линейные и нелинейные подходы - очень не люблю. Благо сейчас есть и потоки и SLEEP, при
желании можно это всё сделать очень параллельным и потребляющим копейки.

Я не знаю почему эта обвязка жрёт 0.7%. У меня она жрёт 0% по диспетчеру, редко что-то пукнет до 2-3%,
при том что могу просто раз 10 пройтись по клавишам и будет играть куча звуков, а на диспетчере всё равно 0%.
Скорее всего вывод в консоль всё жестоко тормозит. И если избавиться от консоли - ничего такого уже не будет.

Можно заморочиться, либо подключать Window9, либо делать руками виндовое приложение со всеми этими
классами окон, оконными функциями, обработкой очередей и прочим. Это долго, геморройно и весь этот код
будет маячить перед глазами. Могу это всё писать даже на голом ассемблере. И будет быстро, пиздец как быстро.
Но мало кто это будет читать, я же не только для профи это делаю. Профи и обвязку брать не будет, свою напишет.
 
zamabuvaraeuДата: Вторник, Вчера, 17:08 | Сообщение # 9
Полковник
Группа: Друзья
Сообщений: 173
Репутация: 5
Статус: Offline

Цитата
У меня она жрёт 0% по диспетчеру
Диспетчер округляет и всё что меньше 1 показывает как 0. В Process Hacker и Process Explorer всё точнее показывается.
 
DarkDemonДата: Вторник, Вчера, 18:17 | Сообщение # 10
Генерал-майор
Группа: Друзья
Сообщений: 261
Репутация: -1
Статус: Offline

По хорошему я согласен: надо писать проги на втором пентиуме и жестоко мониторить производительность в пачке.
Эффективнее этого способа - всё равно не будет, а на современных - бесполезно, толк околонулевой.

И да если кто заметил, FBSound долго шутдаунится, это не на шутку напрягает. Трудно понять почему, видимо это
влияние тех библиотек, которые Петерс интегрировал в свою.

Цитата zamabuvaraeu ()
В Process Hacker и Process Explorer всё точнее показывается.


Да я без вопросов. Просто мне это зачем, блох этих ловить? Как бы знаю, что прослойка с гарантией столько не жрёт
Ты легко можешь открыть и посмотреть исходник, там нет ресурсоёмких операций.
 
zamabuvaraeuДата: Вторник, Вчера, 19:09 | Сообщение # 11
Полковник
Группа: Друзья
Сообщений: 173
Репутация: 5
Статус: Offline
Потому что у меня бомбит и пригорает от антишаблона программирования «Опрос».

Дело же не в том, сколько программа жрёт когда выполняет полезную нагрузку. Дело в том, что программа вообще жрёт 0,00001% процессора когда делает ничего.

Что программа делает, когда она свёрнута, не в фокусе или закрыта другим окном? Проверяет не нажата ли клавиша. Но когда программа свёрнута, клавиша не может быть нажата в принципе. Работа вхолостую, только такты процессора тратит.

На самом деле программа должна уснуть. Как только нажмут клавишу — тогда проснуться и реагировать.

Я считаю, что опрос — это удар по производительности. И со мной солидарен даже Реймонд Чен https://www.transl-gunsmoker.ru/2010....8013025
 
DarkDemonДата: Вторник, Вчера, 19:40 | Сообщение # 12
Генерал-майор
Группа: Друзья
Сообщений: 261
Репутация: -1
Статус: 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 ()
И со мной солидарен даже Реймонд Чен https://www.transl-gunsmoker.ru/2010....8013025

Я не знаю кто это, но парень явно перегибает.

Во-первых там не будет никаких 0,1 процента. А значительно меньше.
Про поднятие из энергосберегающего режима, - да я в гробу видал этот энергосберегающий режим(турбо бусты),
но даже если оно кому-то и нужно - винда сама 10000 раз поднимет частоты своими службами. Винда сейчас это
ТЯЖЕЛЕННАЯ СИСТЕМА, которая сжирает порой намного больше ресурсов чем программы запущенные на ней.
И никакой диспетчер тебе это не покажет, оно грамотно вычитает свои затраты. Т.н. время ядра - тоже мухлюет.

По поводу серверов и соединений - тут всё дело в архитектуре. Где идёт узкое место. Там есть это узкое место
и там надо делать правильно, всмысле на серверах, где тысячи соединений. А в таймере в каком-нибудь редакторе,
скажем даже на 1/1000 - нет никакого узкого места, которое сожрёт 80%.

Более того иногда по-другому решить задачу не то что невозможно, но крайне трудно. Например, если человек
не использует ООП модель - то то, про что ты говоришь превратит ему кодинг в сущий АД. А я её никогда и не использую.
Да не всегда можно менять параметры работы программы по коллбеку, иногда можно, а иногда просто движок сделан так,
что нельзя и чтобы сделать по другому - нужно переделывать весь движок и нужна совсем другая аналитика.
И что мы увидим, прога обрастёт кучей коллбеков, большинство которых - искусственные(ведь мы знаем, что по
итогу весь код всё равно будет линеен). И самое дерьмовое тут то, что цельный монолитный двиг с куском в одном
месте придётся разбивать (в т.ч. архитектурно, а не просто взял и разбил на части, т.е. полностью перерабатывать
архитектуру, возможно круто и хорошо сделанную, на совесть, а не как сейчас делают) по этим коллбекам
в асинхронную модель, это может не просто создать кучу головняка при обдумывании, а вообще загубить разработку,
просто потому что не всегда возможно сделать модель полностью блочно-независимой. Где-то можно, но не везде.
Причём эта модель, на деле, всё равно свернётся в линейную, но без твоего участия, компиль её свернёт.
Так ты сам будешь этим заниматься и будешь знать где что и как и что по другому оно там не встанет в линейной модели.
А линейная модель легко итеративно проверяется, её легче дебажить.

И вот да всё говорят про крутой кодинг, про доли процента, про такты, но никто не говорит, что поставь винду 10-ку на
комп 15-го года(на целерон 2.8, с 4Гб памяти, а заявлены вроде как 2Гб в системных требованиях и 1 ГГц), то мы увидим
слайдшоу из < 10 кадров, если откроем какой-нибудь эксель и будем таскать окно по экрану.
И да я видел ноуты со свопом и 100% загрузкой диска, ноуты с 8 Гб памяти, с 10-кой, 10-кой после процедуры Recovery,
т.е. якобы "чистой", на деле там была куча предустановленного дерьма.

И тут встаёт вопрос так ли критичен ссаный таймер или опрос клавиатуры на этом фоне.
 
  • Страница 1 из 1
  • 1
Поиск: