Guest User

Untitled

a guest
Apr 22nd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. --[[
  2. -- multisource lib
  3. -- A multisource is a wrapper on top of a LÖVE source. It allows
  4. -- creating multiple sounds easily. It uses an internal pool of
  5. -- resources.
  6. -- * multisource:play() finds a stopped resource from the pool,
  7. -- or creates a new one, and plays and returns it.
  8. -- * multisouce:cleanup() liberates the memory of old unplayed sources.
  9. ]]
  10.  
  11. local multisource = {}
  12.  
  13. local MultiSource = {}
  14. local MultiSourceMt = {__index = MultiSource}
  15.  
  16. function MultiSource:cleanup(older_than)
  17. older_than = older_than or 5
  18.  
  19. local now = love.timer.getTime()
  20.  
  21. for instance, lastPlayed in pairs(self.instances) do
  22. local age = now - lastPlayed
  23. if age > older_than and not instance:isPlaying() then
  24. self.instances[instance] = nil
  25. end
  26. end
  27. end
  28.  
  29. function MultiSource:getStoppedOrNewInstance()
  30. for instance in pairs(self.instances) do
  31. if not instance:isPlaying() then return instance end
  32. end
  33. return self.source:clone()
  34. end
  35.  
  36. function MultiSource:play()
  37. local instance = self:getStoppedOrNewInstance()
  38. self.instances[instance] = love.timer.getTime()
  39.  
  40. instance:play()
  41.  
  42. return instance
  43. end
  44.  
  45. function MultiSource:stop()
  46. for instance in pairs(self.instances) do
  47. instance:stop()
  48. end
  49. end
  50.  
  51. function MultiSource:pause()
  52. for instance in pairs(self.instances) do
  53. instance:pause()
  54. end
  55. end
  56.  
  57. function MultiSource:setLooping(looping)
  58. self.source:setLooping(looping)
  59. end
  60.  
  61. function MultiSource:resume()
  62. for instance in pairs(self.instances) do
  63. instance:resume()
  64. end
  65. end
  66.  
  67. function MultiSource:countPlayingInstances()
  68. local count = 0
  69. for instance in pairs(self.instances) do
  70. if instance:isPlaying() then
  71. count = count + 1
  72. end
  73. end
  74. return count
  75. end
  76.  
  77. function MultiSource:countInstances()
  78. local count = 0
  79. for instance in pairs(self.instances) do
  80. count = count + 1
  81. end
  82. return count
  83. end
  84.  
  85. ----
  86.  
  87. multisource.new = function(source)
  88. return setmetatable({source = source, instances = {}}, MultiSourceMt)
  89. end
  90.  
  91. return multisource
Add Comment
Please, Sign In to add comment