summaryrefslogtreecommitdiff
path: root/dalos-limiter.lua
blob: 8f1a8632dab44bbebc5596763b4bac3357cf0ffb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
dalosp.limiter = {   
    configure = function (self)
        local accept, limit = iup.GetParam(self.name .. " configuration", nil, [[
Limit: %i{The actual size this limiter is going to produce}
]], self.op or 0, self.maximize and 1 or 0)
        if accept then
            self.extra.limit = limit
            self:input_change()
        end
    end,
    
    input_change = function (self, ind)
        local h = self:get_linked_input(1)
        if h then
            self.color = cd.GREEN
            local obj = {
                h = h,
                offset = 0,
                size = math.max(h:getsize(), self.limit),
                canread = function (self) return true end,
                canwrite = function (self) return false end,
                canseek = function (self) return true end,
                canwatch = function (self) return false end,
                getname = function (self) return  end,
                tell = function (self) return self.offset end,
                getsize = function (self) return self.size end,
                getmodif = function (self) return 0 end,
                flush = function (self) return true end,
                seek = function (self, offset, wheel) 
                    if wheel == SEEK_SET then
                        self.offset = offset
                    elseif wheel == SEEK_CUR then
                        self.offset = self.offset + offset
                    elseif wheel == SEEK_END then
                        self.offset = self.size + offset
                    else
                        error "Unknown wheel"
                    end
                    if self.offset < 0 then self.offset = 0 end
                    if self.offset >= self.size then self.offset = self.size end
                    self.h:seek(self.offset)
                    return self.offset
                end,
                read = function (self, userdata, count)
                    count = math.min(count, self.size - self.offset)
                    
                    if count == 0 then
                        if self.got_eof then self.lh:close() end
                        self.got_eof = true
                        return 0
                    end
                    
                    self.got_eof = false
                    
                    local r = self.h:read(count, userdata)
                    self.offset = self.offset + r
                    return r
                end,
            }
            local newh = HandleLua(obj)
            obj.lh = newh
            self:set_houtput(newh)
            self.dcanvas:draw()
        else
            self.color = cd.YELLOW
            self:set_houtput(nil)
            self.dcanvas:draw()
        end
    end,
    
    
    create = function (d, tab)
        tab.ninputs = 1
        tab.noutputs = 1
        tab.otype = dalos.objtype.LUA_FILTER
        tab.configure = dalosp.limiter.configure
        tab.input_change = dalosp.limiter.input_change
        tab.default_name = "Limiter"
        local extra = { }
        
        local obj = dalos.object(d, tab, extra)
    end,
}

dalos.limiter = dalosp.limiter.create
dalos:register_obj("Limiter", dalos.limiter)