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

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

Рекомендуемые сообщения

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...