Перейти к публикации
Форум - ComputerCraft
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
  • Like 4

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


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

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

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×