Skip to content

Commit 5667ac1

Browse files
committed
Fix part 2 of issue #43
Dynamic queue size for queueable audio sources. Scaling by seconds of audio. Closes issue #43
1 parent 1198efe commit 5667ac1

File tree

1 file changed

+38
-16
lines changed

1 file changed

+38
-16
lines changed

audio.lua

+38-16
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ local audio = {
2828
local id3 = require("id3")
2929

3030
local sample_sum = 0
31-
local sample_counts = {0, 0, 0, 0, 0, 0, 0, 0}
31+
local sample_counts = {}
3232
local sounddata_array = {}
33-
local decoder_buffer = 2048
33+
local decoder_buffer = 1024
3434
local decoder = nil
3535
local channels = 0
3636
local bit_depth = 0
@@ -85,7 +85,7 @@ function audio.reload()
8585
end
8686

8787
sample_sum = 0
88-
sample_counts = {0, 0, 0, 0, 0, 0, 0, 0}
88+
sample_counts = {}
8989
sounddata_array = {}
9090
decoder = nil
9191
channels = 0
@@ -263,13 +263,15 @@ end
263263
-- @param sampling_size number: New sampling size to build the table/queue around.
264264
function audio.music.resizeQueue(sampling_size)
265265

266-
local necessary_buffers = math.ceil(channels*sampling_size/decoder_buffer)
266+
local old_queue_size = queue_size
267+
268+
local vis_necessary_buffers = math.ceil(channels*sampling_size/decoder_buffer)
269+
local audio_necessary_buffers = math.ceil(0.2*(sample_rate*channels*bit_depth/8)/decoder_buffer)
270+
local necessary_buffers = math.min(math.max(2+vis_necessary_buffers, audio_necessary_buffers), 64)
267271
if necessary_buffers % 2 == 1 then
268272
necessary_buffers = necessary_buffers+1
269273
end
270-
271-
local old_queue_size = queue_size
272-
queue_size = 2+necessary_buffers
274+
queue_size = necessary_buffers
273275

274276
-- Escape now because neither the table or queue would change.
275277
if old_queue_size == queue_size then
@@ -372,11 +374,13 @@ function audio.music.changeSong(number)
372374
seconds_per_buffer = decoder_buffer/(sample_rate*channels*bit_depth/8)
373375

374376
-- Start song queue.
375-
local necessary_buffers = math.ceil(channels*visualization.getSamplingSize()/decoder_buffer)
377+
local vis_necessary_buffers = math.ceil(channels*visualization.getSamplingSize()/decoder_buffer)
378+
local audio_necessary_buffers = math.ceil(0.2*(sample_rate*channels*bit_depth/8)/decoder_buffer)
379+
local necessary_buffers = math.min(math.max(2+vis_necessary_buffers, audio_necessary_buffers), 64)
376380
if necessary_buffers % 2 == 1 then
377381
necessary_buffers = necessary_buffers+1
378382
end
379-
queue_size = 2+necessary_buffers
383+
queue_size = necessary_buffers
380384
current_song = love.audio.newQueueableSource(sample_rate, bit_depth, channels, queue_size)
381385

382386
-- Music initialization.
@@ -604,15 +608,21 @@ function audio.recordingdevice.load(device)
604608
bit_depth = device:getBitDepth()
605609
channels = device:getChannelCount()
606610

607-
local necessary_buffers = math.ceil(channels*visualization.getSamplingSize()/rd_min_buffer)
611+
local vis_necessary_buffers = math.ceil(channels*visualization.getSamplingSize()/rd_min_buffer)
612+
local audio_necessary_buffers = math.ceil(0.1*(sample_rate*channels*bit_depth/8)/rd_min_buffer)
613+
local necessary_buffers = math.min(math.max(2+vis_necessary_buffers, audio_necessary_buffers), 64)
608614
if necessary_buffers % 2 == 1 then
609615
necessary_buffers = necessary_buffers+1
610616
end
611-
queue_size = 2+necessary_buffers
617+
queue_size = necessary_buffers
612618
current_song = love.audio.newQueueableSource(sample_rate, bit_depth, channels, queue_size)
613619

614620
sounddata_array = {}
615-
sample_counts = {0, 0, 0, 0, 0, 0, 0, 0}
621+
sample_counts = {}
622+
623+
for i=1, queue_size do
624+
sample_counts[i] = 0
625+
end
616626

617627
gui.buttons.volume.activate("volume1")
618628

@@ -681,13 +691,15 @@ end
681691
-- @param sampling_size number: New sampling size to build the table/queue around.
682692
function audio.recordingdevice.resizeQueue(sampling_size)
683693

684-
local necessary_buffers = math.ceil(channels*sampling_size/rd_min_buffer)
694+
local old_queue_size = queue_size
695+
696+
local vis_necessary_buffers = math.ceil(channels*sampling_size/rd_min_buffer)
697+
local audio_necessary_buffers = math.ceil(0.1*(sample_rate*channels*bit_depth/8)/rd_min_buffer)
698+
local necessary_buffers = math.min(math.max(2+vis_necessary_buffers, audio_necessary_buffers), 64)
685699
if necessary_buffers % 2 == 1 then
686700
necessary_buffers = necessary_buffers+1
687701
end
688-
689-
local old_queue_size = queue_size
690-
queue_size = 2+necessary_buffers
702+
queue_size = necessary_buffers
691703

692704
-- Escape now because neither the table or queue would change.
693705
if old_queue_size == queue_size then
@@ -703,22 +715,32 @@ function audio.recordingdevice.resizeQueue(sampling_size)
703715
sounddata_transfer[i] = v
704716
end
705717

718+
-- Copy old sample_counts.
719+
local sample_counts_transfer = {}
720+
for i,v in ipairs(sample_counts) do
721+
sample_counts_transfer[i] = v
722+
end
723+
724+
sample_counts = {}
706725
sounddata_array = {}
707726
local diff_queue = queue_size-old_queue_size
708727

709728
--[[ Adjust and repopulate the queue and table. ]]
710729
if diff_queue > 0 then
711730
for i=1, 2*diff_queue do
712731
sounddata_array[i] = sounddata_transfer[1]
732+
sample_counts[i] = 0
713733
end
714734
end
715735

716736
for i=math.max(2*diff_queue+1, 1), 2*diff_queue+old_queue_size do
717737
sounddata_array[i] = sounddata_transfer[i-2*diff_queue]
738+
sample_counts[i] = sample_counts_transfer[i-2*diff_queue]
718739
end
719740

720741
for i=2*diff_queue+old_queue_size+1, 2*queue_size do
721742
sounddata_array[i] = sounddata_transfer[i-2*diff_queue]
743+
sample_counts[i] = sample_counts_transfer[i-2*diff_queue]
722744
current_song:queue(sounddata_array[i])
723745
end
724746

0 commit comments

Comments
 (0)