add U16view, I16view, U32view, I32view classes
This commit is contained in:
parent
86a4060a68
commit
aa54e900d9
@ -19,10 +19,10 @@ function audio.fetch_input(token, size)
|
|||||||
size = size or MAX_FETCH
|
size = size or MAX_FETCH
|
||||||
if audio_input_tokens_store[token] then
|
if audio_input_tokens_store[token] then
|
||||||
if #total_fetch >= size then
|
if #total_fetch >= size then
|
||||||
return total_fetch:sub(1, size)
|
return total_fetch:slice(1, size)
|
||||||
end
|
end
|
||||||
total_fetch:append(_audio_fetch_input(size - #total_fetch))
|
total_fetch:append(_audio_fetch_input(size - #total_fetch))
|
||||||
return total_fetch:sub()
|
return total_fetch:slice()
|
||||||
end
|
end
|
||||||
error("access denied")
|
error("access denied")
|
||||||
end
|
end
|
||||||
|
|||||||
@ -121,7 +121,7 @@ local function get_capacity(self)
|
|||||||
return self.capacity
|
return self.capacity
|
||||||
end
|
end
|
||||||
|
|
||||||
local function sub(self, offset, length)
|
local function slice(self, offset, length)
|
||||||
offset = offset or 1
|
offset = offset or 1
|
||||||
length = length or (self.size - offset + 1)
|
length = length or (self.size - offset + 1)
|
||||||
if offset < 1 or offset > self.size then
|
if offset < 1 or offset > self.size then
|
||||||
@ -131,6 +131,9 @@ local function sub(self, offset, length)
|
|||||||
length = self.size - offset + 1
|
length = self.size - offset + 1
|
||||||
end
|
end
|
||||||
local buffer = malloc(length)
|
local buffer = malloc(length)
|
||||||
|
if not buffer then
|
||||||
|
error("malloc(" .. length .. ") returned NULL")
|
||||||
|
end
|
||||||
FFI.copy(buffer, self.bytes + (offset - 1), length)
|
FFI.copy(buffer, self.bytes + (offset - 1), length)
|
||||||
return bytearray_type(buffer, length, length)
|
return bytearray_type(buffer, length, length)
|
||||||
end
|
end
|
||||||
@ -143,7 +146,7 @@ local bytearray_methods = {
|
|||||||
clear=clear,
|
clear=clear,
|
||||||
reserve=reserve,
|
reserve=reserve,
|
||||||
get_capacity=get_capacity,
|
get_capacity=get_capacity,
|
||||||
sub=sub,
|
slice=slice,
|
||||||
}
|
}
|
||||||
|
|
||||||
local bytearray_mt = {
|
local bytearray_mt = {
|
||||||
@ -227,7 +230,59 @@ local function FFIBytearray_as_string(bytes)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function create_FFIview_class(name, typename, typesize)
|
||||||
|
local FFIU16view_mt = {
|
||||||
|
__index = function(self, key)
|
||||||
|
if key <= 0 or key > self.size then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
return self.ptr[key - 1]
|
||||||
|
end,
|
||||||
|
__newindex = function(self, key, value)
|
||||||
|
if key == self.size + 1 then
|
||||||
|
return append(self, value)
|
||||||
|
elseif key <= 0 or key > self.size then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
self.ptr[key - 1] = value
|
||||||
|
end,
|
||||||
|
__len = function(self)
|
||||||
|
return self.size
|
||||||
|
end,
|
||||||
|
__tostring = function(self)
|
||||||
|
return string.format(name .. "[%s]{...}", tonumber(self.size))
|
||||||
|
end,
|
||||||
|
__ipairs = function(self)
|
||||||
|
local i = 0
|
||||||
|
return function()
|
||||||
|
i = i + 1
|
||||||
|
if i <= self.size then
|
||||||
|
return i, self.ptr[i - 1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
return function (bytes)
|
||||||
|
local ptr = FFI.cast(typename .. "*", bytes.bytes)
|
||||||
|
local x = setmetatable({
|
||||||
|
bytes=bytes,
|
||||||
|
ptr=ptr,
|
||||||
|
size=math.floor(bytes.size / typesize),
|
||||||
|
}, FFIU16view_mt)
|
||||||
|
return x
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local FFII16view = create_FFIview_class("FFII16view", "int16_t", 2)
|
||||||
|
local FFIU16view = create_FFIview_class("FFIU16view", "uint16_t", 2)
|
||||||
|
local FFII32view = create_FFIview_class("FFII32view", "int32_t", 4)
|
||||||
|
local FFIU32view = create_FFIview_class("FFIU32view", "uint32_t", 4)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
FFIBytearray = setmetatable(FFIBytearray, FFIBytearray),
|
FFIBytearray = setmetatable(FFIBytearray, FFIBytearray),
|
||||||
FFIBytearray_as_string = FFIBytearray_as_string
|
FFIBytearray_as_string = FFIBytearray_as_string,
|
||||||
|
FFIU16view = FFIU16view,
|
||||||
|
FFII16view = FFII16view,
|
||||||
|
FFIU32view = FFIU32view,
|
||||||
|
FFII32view = FFII32view,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -124,10 +124,11 @@ function on_hud_open()
|
|||||||
streamid = audio.play_stream_2d("test-stream", 2.0, 1.0, "ui")
|
streamid = audio.play_stream_2d("test-stream", 2.0, 1.0, "ui")
|
||||||
|
|
||||||
|
|
||||||
s = audio.PCMStream(44100, 1, 8)
|
s = audio.PCMStream(44100, 1, 16)
|
||||||
local buffer = Bytearray(44100)
|
local buffer = Bytearray(44100 * 4)
|
||||||
for i=1, #buffer do
|
local view = U16view(buffer)
|
||||||
buffer[i] = math.random(1, 8)
|
for i=1, view.size do
|
||||||
|
view[i] = 16000 + math.sin(i / 200.0 * (1 + i * 0.0001)) * 2000
|
||||||
end
|
end
|
||||||
s:feed(buffer)
|
s:feed(buffer)
|
||||||
s:create_sound("test-sound")
|
s:create_sound("test-sound")
|
||||||
|
|||||||
@ -269,6 +269,10 @@ require "core:internal/extensions/string"
|
|||||||
local bytearray = require "core:internal/bytearray"
|
local bytearray = require "core:internal/bytearray"
|
||||||
Bytearray = bytearray.FFIBytearray
|
Bytearray = bytearray.FFIBytearray
|
||||||
Bytearray_as_string = bytearray.FFIBytearray_as_string
|
Bytearray_as_string = bytearray.FFIBytearray_as_string
|
||||||
|
U16view = bytearray.FFIU16view
|
||||||
|
I16view = bytearray.FFII16view
|
||||||
|
U32view = bytearray.FFIU32view
|
||||||
|
I32view = bytearray.FFII32view
|
||||||
Bytearray_construct = function(...) return Bytearray(...) end
|
Bytearray_construct = function(...) return Bytearray(...) end
|
||||||
|
|
||||||
bit.compile = require "core:bitwise/compiler"
|
bit.compile = require "core:bitwise/compiler"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user