TC1061 14 Опубликовано: 26 января, 2018 (изменено) SoundLib by TC1061 Здравствуйте! Сегодня я наконец-то доделал свою прекрасную либу для работы со звуковой картой! Она позволяет легко и быстро использовать этого зверя. На стороне вашей программы лежит лишь загрузка либы и ее использование (и удаление объектов звука)! Не нужно даже следить за тем, есть ли звуковая карта. Без нее библиотека никаких ошибок не выдает, но скорее всего не будет проигрывать звук. И главная ее особенность - она может проигрывать сколько угодно звуков одновременно (пока оперативка не кончится ). Вообщем скачать ее можно здесь . Ну а на опенкомпе выполнить команду: 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) Изменено 28 января, 2018 пользователем TC1061 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TC1061 Автор темы 14 Опубликовано: 28 января, 2018 Обновление: добавлена функции sound:setVolume, sound:getVolume и soundlib.getSoundCount Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах