Перейти к содержимому


Фотография

[OC] Библиотека для легкой работы со звуковой картой

lib звуковая карта

  • Авторизуйтесь для ответа в теме
В теме одно сообщение

#1 Оффлайн   TC1061

TC1061
  • Пользователи
  • Сообщений: 35
  • Уровень сигнала: 0,07%
  • В игре: 0 час. 25 мин.

Отправлено 26 Январь 2018 - 22:30

SoundLib by TC1061

Здравствуйте! Сегодня я наконец-то доделал свою прекрасную либу для работы со звуковой картой! Она позволяет легко и быстро использовать этого зверя. На стороне вашей программы лежит лишь загрузка либы и ее использование (и удаление объектов звука)! Не нужно даже следить за тем, есть ли звуковая карта. Без нее библиотека никаких ошибок не выдает, но скорее всего не будет проигрывать звук. И главная ее особенность - она может проигрывать сколько угодно звуков одновременно (пока оперативка не кончится :giggle: ). Вообщем скачать ее можно здесь . Ну а на опенкомпе выполнить команду:

pastebin get 0LwEez14 /lib/soundlib.lua

Документация:

soundlib.init=function():boolean -- Инициализирует библиотеку. Возвращает, получилось ли это сделать.
soundlib.deinit=function():boolean -- Тоже, что и init, но наоборот.
soundlib.reinit=function() -- Выполняет deinit, а затем init.
soundlib.process=function([interval:number]):boolean -- Проигрывает звук. Нужно выполнять эту функцию как можно чаще, или звук будет прерывистым. Задерживает программу примерно на interval или 10 мс. Рекомендуется ставить interval на 50. Возвращает, получилось ли это сделать.
soundlib.newSound=function(size:number,delay:number):sound -- Создает объект звука с количеством сэмплов (кусочков звука), у каждого из которых длительность delay. Остается навсегда, если потерять его, не уничтожив с помощью sound:destroy()
soundlib.getSoundCount():number -- Возвращает количество созданных не уничтоженных звуковых объектов

sound:play()=function() -- Воспроизводит звук.
sound:rewind()=function() -- Возвращает в начало звука
sound:pause()=function() -- Приостанавливает звук
sound:stop()=function() -- sound:rewind+sound:pause
sound:setVolume(volume:number) -- Поставить звук, от 0 до math.huge. Настоящая громкость получается при volume 1.
sound:getVolume():number -- Возвращает громкость звука.
sound:setLooping(state:boolean)=function() -- Переключить повтор звука.
sound:isLooping():boolean -- Возвращает, включен ли повтор.
sound:getDuration():number -- Возвращает длительность звука в секундах.
sound:seek():number -- Возвращает позицию воспроизведения в секундах.
sound:setSeek(pos:number) -- Устанавливает позицию воспроизведения в секундах.
sound:getCurrentSample():number -- Тоже, что и sound:seek, но в семплах (может быть дробным)
sound:getSampleCount():number -- Возвращает size, который вы указали в soundlib.newSound
sound:set(rawpos:number,wave:string,freq:number,vol:number) -- Ставит на сэмпле rawpos частоту freq с громкостью vol на типе волны wave
sound:get(rawpos:number):number, number -- Возвращает частоту и громкость сэмпла rawpos



Пример кода:

print("Initialising.")
local sound
xpcall(function()
  local computer=require"computer"
  local term=require"term"
  local slib=require"soundlib"
  slib.reinit()
  print("Generating sound.")
  local sizesd=1000
  print("Selected size "..sizesd)
  sound=slib.newSound(sizesd,0.001)
  sound:setVolume(1)
  print("Generating samples")
  for n=0,sizesd-1 do
    sound:set(n,"sine",500,1-n/sizesd)
  end
  print("Playing sound.")
  sound:setLooping(true)
  sound:play()
  local n=computer.uptime()+10
  local c=0
  local prevcheck=computer.uptime()
  local processOk=true
  repeat
    processOk=slib.process(50) and processOk
    c=c+1
    if c>=50 then
      local t=computer.uptime()-prevcheck
      print(math.floor(50/t) .. " PPS, sound is "..(sound:isPlaying() and "playing" or "NOT playing")..", "..(processOk and "no errors" or "errored"))
      c=0
      processOk=true
      prevcheck=computer.uptime()
      pcall(os.sleep,0)
    end
  until computer.uptime() > n
  sound:stop() -- Необязательно т.к. он все равно не будет проигрываться
  sound:destroy() -- А вот это уже обязательно. Иначе при следующем запуске soundlib.process в любой программе, звук перемешается с нашим.
end,function(err) if sound then sound:stop() sound:destroy() end print(debug.traceback(err,-2)) end)

Сообщение отредактировал TC1061: 28 Январь 2018 - 09:15

  • Totoro, eu_tomat, mrlobaker и еще 1 это нравится

#2 Оффлайн   TC1061

TC1061
  • Автор темы
  • Пользователи
  • Сообщений: 35
  • Уровень сигнала: 0,07%
  • В игре: 0 час. 25 мин.

Отправлено 28 Январь 2018 - 08:23

Обновление: добавлена функции sound:setVolume, sound:getVolume и soundlib.getSoundCount







Темы с аналогичным тегами lib, звуковая карта

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Яндекс.Метрика