mirror of
https://github.com/nucular/sfxrlua.git
synced 2024-12-24 18:44:20 +00:00
Added saving and loading of simple Lua files
This commit is contained in:
parent
146daa6004
commit
0540c95b95
119
sfxr.lua
119
sfxr.lua
@ -25,6 +25,8 @@ local sfxr = {}
|
|||||||
|
|
||||||
-- Constants
|
-- Constants
|
||||||
|
|
||||||
|
sfxr.VERSION = "0.0"
|
||||||
|
|
||||||
sfxr.SQUARE = 0
|
sfxr.SQUARE = 0
|
||||||
sfxr.SAWTOOTH = 1
|
sfxr.SAWTOOTH = 1
|
||||||
sfxr.SINE = 2
|
sfxr.SINE = 2
|
||||||
@ -62,6 +64,33 @@ local function cpypol(a, b)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function shallowcopy(t)
|
||||||
|
if type(t) == "table" then
|
||||||
|
local t2 = {}
|
||||||
|
for k,v in pairs(t) do
|
||||||
|
t2[k] = v
|
||||||
|
end
|
||||||
|
return t2
|
||||||
|
else
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function mergetables(t1, t2)
|
||||||
|
for k, v in pairs(t2) do
|
||||||
|
if type(v) == "table" then
|
||||||
|
if type(t1[k] or false) == "table" then
|
||||||
|
mergetables(t1[k] or {}, t2[k] or {})
|
||||||
|
else
|
||||||
|
t1[k] = v
|
||||||
|
end
|
||||||
|
else
|
||||||
|
t1[k] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return t1
|
||||||
|
end
|
||||||
|
|
||||||
local function setseed(seed)
|
local function setseed(seed)
|
||||||
math.randomseed(seed)
|
math.randomseed(seed)
|
||||||
for i=0, 5 do
|
for i=0, 5 do
|
||||||
@ -851,4 +880,94 @@ function sfxr.Sound:exportWAV(f, freq, bits)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function sfxr.Sound:load(f)
|
||||||
|
local close = false
|
||||||
|
if type(f) == "string" then
|
||||||
|
f = io.open(f, "wb")
|
||||||
|
close = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function sfxr.Sound:save(f, compressed)
|
||||||
|
local close = false
|
||||||
|
if type(f) == "string" then
|
||||||
|
f = io.open(f, "w")
|
||||||
|
close = true
|
||||||
|
end
|
||||||
|
|
||||||
|
local code = "local "
|
||||||
|
|
||||||
|
-- we'll compare the current parameters with the defaults
|
||||||
|
local defaults = sfxr.newSound()
|
||||||
|
|
||||||
|
-- this part is pretty awful but it works for now
|
||||||
|
function store(keys, obj)
|
||||||
|
local name = keys[#keys]
|
||||||
|
|
||||||
|
if type(obj) == "number" then
|
||||||
|
-- fetch the default value
|
||||||
|
local def = defaults
|
||||||
|
for i=2, #keys do
|
||||||
|
def = def[keys[i]]
|
||||||
|
end
|
||||||
|
|
||||||
|
if obj ~= def then
|
||||||
|
local k = table.concat(keys, ".")
|
||||||
|
if not compressed then
|
||||||
|
code = code .. "\n" .. string.rep(" ", #keys - 1)
|
||||||
|
end
|
||||||
|
code = code .. string.format("%s=%s;", name, obj)
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif type(obj) == "table" and name ~= "phaserbuffer" and name ~= "noisebuffer" then
|
||||||
|
local spacing = compressed and "" or "\n" .. string.rep(" ", #keys - 1)
|
||||||
|
code = code .. spacing .. string.format("%s={", name)
|
||||||
|
|
||||||
|
for k, v in pairs(obj) do
|
||||||
|
local newkeys = shallowcopy(keys)
|
||||||
|
newkeys[#newkeys + 1] = k
|
||||||
|
store(newkeys, v)
|
||||||
|
end
|
||||||
|
|
||||||
|
code = code .. spacing .. "};"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
store({"s"}, self)
|
||||||
|
code = code .. "\nreturn s, \"" .. sfxr.VERSION .. "\""
|
||||||
|
f:write(code)
|
||||||
|
|
||||||
|
if close then
|
||||||
|
f:close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function sfxr.Sound:load(f)
|
||||||
|
local close = false
|
||||||
|
if type(f) == "string" then
|
||||||
|
f = io.open(f, "r")
|
||||||
|
close = true
|
||||||
|
end
|
||||||
|
|
||||||
|
local code
|
||||||
|
if io.type(f) == "file" then
|
||||||
|
code = f:read("*a")
|
||||||
|
else
|
||||||
|
code = f:read()
|
||||||
|
end
|
||||||
|
|
||||||
|
local params, version = assert(loadstring(code))()
|
||||||
|
-- check version compatibility
|
||||||
|
if version > sfxr.VERSION then
|
||||||
|
return version
|
||||||
|
end
|
||||||
|
|
||||||
|
-- merge the loaded table into the own
|
||||||
|
mergetables(self, params)
|
||||||
|
|
||||||
|
if close then
|
||||||
|
f:close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return sfxr
|
return sfxr
|
||||||
|
Loading…
Reference in New Issue
Block a user