@@ -28,9 +28,9 @@ local audio = {
28
28
local id3 = require (" id3" )
29
29
30
30
local sample_sum = 0
31
- local sample_counts = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
31
+ local sample_counts = {}
32
32
local sounddata_array = {}
33
- local decoder_buffer = 2048
33
+ local decoder_buffer = 1024
34
34
local decoder = nil
35
35
local channels = 0
36
36
local bit_depth = 0
@@ -85,7 +85,7 @@ function audio.reload()
85
85
end
86
86
87
87
sample_sum = 0
88
- sample_counts = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
88
+ sample_counts = {}
89
89
sounddata_array = {}
90
90
decoder = nil
91
91
channels = 0
@@ -263,13 +263,15 @@ end
263
263
-- @param sampling_size number: New sampling size to build the table/queue around.
264
264
function audio .music .resizeQueue (sampling_size )
265
265
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 )
267
271
if necessary_buffers % 2 == 1 then
268
272
necessary_buffers = necessary_buffers + 1
269
273
end
270
-
271
- local old_queue_size = queue_size
272
- queue_size = 2 + necessary_buffers
274
+ queue_size = necessary_buffers
273
275
274
276
-- Escape now because neither the table or queue would change.
275
277
if old_queue_size == queue_size then
@@ -372,11 +374,13 @@ function audio.music.changeSong(number)
372
374
seconds_per_buffer = decoder_buffer / (sample_rate * channels * bit_depth / 8 )
373
375
374
376
-- 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 )
376
380
if necessary_buffers % 2 == 1 then
377
381
necessary_buffers = necessary_buffers + 1
378
382
end
379
- queue_size = 2 + necessary_buffers
383
+ queue_size = necessary_buffers
380
384
current_song = love .audio .newQueueableSource (sample_rate , bit_depth , channels , queue_size )
381
385
382
386
-- Music initialization.
@@ -604,15 +608,21 @@ function audio.recordingdevice.load(device)
604
608
bit_depth = device :getBitDepth ()
605
609
channels = device :getChannelCount ()
606
610
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 )
608
614
if necessary_buffers % 2 == 1 then
609
615
necessary_buffers = necessary_buffers + 1
610
616
end
611
- queue_size = 2 + necessary_buffers
617
+ queue_size = necessary_buffers
612
618
current_song = love .audio .newQueueableSource (sample_rate , bit_depth , channels , queue_size )
613
619
614
620
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
616
626
617
627
gui .buttons .volume .activate (" volume1" )
618
628
@@ -681,13 +691,15 @@ end
681
691
-- @param sampling_size number: New sampling size to build the table/queue around.
682
692
function audio .recordingdevice .resizeQueue (sampling_size )
683
693
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 )
685
699
if necessary_buffers % 2 == 1 then
686
700
necessary_buffers = necessary_buffers + 1
687
701
end
688
-
689
- local old_queue_size = queue_size
690
- queue_size = 2 + necessary_buffers
702
+ queue_size = necessary_buffers
691
703
692
704
-- Escape now because neither the table or queue would change.
693
705
if old_queue_size == queue_size then
@@ -703,22 +715,32 @@ function audio.recordingdevice.resizeQueue(sampling_size)
703
715
sounddata_transfer [i ] = v
704
716
end
705
717
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 = {}
706
725
sounddata_array = {}
707
726
local diff_queue = queue_size - old_queue_size
708
727
709
728
--[[ Adjust and repopulate the queue and table. ]]
710
729
if diff_queue > 0 then
711
730
for i = 1 , 2 * diff_queue do
712
731
sounddata_array [i ] = sounddata_transfer [1 ]
732
+ sample_counts [i ] = 0
713
733
end
714
734
end
715
735
716
736
for i = math.max (2 * diff_queue + 1 , 1 ), 2 * diff_queue + old_queue_size do
717
737
sounddata_array [i ] = sounddata_transfer [i - 2 * diff_queue ]
738
+ sample_counts [i ] = sample_counts_transfer [i - 2 * diff_queue ]
718
739
end
719
740
720
741
for i = 2 * diff_queue + old_queue_size + 1 , 2 * queue_size do
721
742
sounddata_array [i ] = sounddata_transfer [i - 2 * diff_queue ]
743
+ sample_counts [i ] = sample_counts_transfer [i - 2 * diff_queue ]
722
744
current_song :queue (sounddata_array [i ])
723
745
end
724
746
0 commit comments