small cleanup

This commit is contained in:
2024-09-24 03:50:34 +02:00
parent fe31c170c7
commit ec70efae83
6 changed files with 43 additions and 84 deletions
+2
View File
@@ -77,12 +77,14 @@ main :: proc() {
// } // }
//} //}
// 8 bps audio
//converted_samples := make([]u8, len(samples)) //converted_samples := make([]u8, len(samples))
//defer delete(converted_samples) //defer delete(converted_samples)
//for sample, i in samples { //for sample, i in samples {
// converted_samples[i] = u8(sample & 0xFF) // converted_samples[i] = u8(sample & 0xFF)
//} //}
// 16 bps audio
converted_samples := make([]i16, len(frame.samples)) converted_samples := make([]i16, len(frame.samples))
defer delete(converted_samples) defer delete(converted_samples)
for sample, i in frame.samples { for sample, i in frame.samples {
+2 -1
View File
@@ -33,6 +33,7 @@ main :: proc() {
fmt.eprintln("Failed to initialize audio device: ", alsa.strerror(alsa_err)) fmt.eprintln("Failed to initialize audio device: ", alsa.strerror(alsa_err))
os.exit(1) os.exit(1)
} }
defer alsa.pcm_close(handle)
start := time.now() start := time.now()
flac_data, err := flac.load_from_file(os.args[1], allocator = allocator) flac_data, err := flac.load_from_file(os.args[1], allocator = allocator)
@@ -55,6 +56,7 @@ main :: proc() {
} }
converted_samples := make([]i16, len(flac_data.samples)) converted_samples := make([]i16, len(flac_data.samples))
defer delete(converted_samples)
for sample, i in flac_data.samples { for sample, i in flac_data.samples {
new_sample := sample & 0xFF new_sample := sample & 0xFF
@@ -73,7 +75,6 @@ main :: proc() {
if alsa_err < 0 { if alsa_err < 0 {
fmt.eprintln("pcm_drain failed with:", alsa.strerror(alsa_err)) fmt.eprintln("pcm_drain failed with:", alsa.strerror(alsa_err))
} }
alsa.pcm_close(handle)
elapsed := time.diff(start, end) elapsed := time.diff(start, end)
fmt.println("Decoding took", elapsed) fmt.println("Decoding took", elapsed)
+36 -14
View File
@@ -23,8 +23,8 @@ FlacError :: enum {
Invalid_Coefficient_Precision, Invalid_Coefficient_Precision,
CRC_Mismatch, CRC_Mismatch,
MD5_Mismatch, MD5_Mismatch,
Unsupported_BPS, // Remove when implemented Unsupported_BPS, // TODO: Remove when implemented
Unencoded_BPS_For_Fixed_Subframe_Is_Unsupported, // Remove when implemented Unencoded_BPS_For_Fixed_Subframe_Is_Unsupported, // TODO: Remove when implemented
Invalid_Residual_Coding_Method, Invalid_Residual_Coding_Method,
Invalid_Block_Size, Invalid_Block_Size,
Bits_Per_Second_Mismatch, Bits_Per_Second_Mismatch,
@@ -40,12 +40,12 @@ Option:
Returns all metadata of a FLAC stream without decoding the audio data. Returns all metadata of a FLAC stream without decoding the audio data.
*/ */
Option :: enum { Option :: enum u8 {
skip_md5_check, skip_md5_check,
only_return_metadata, only_return_metadata,
} }
Options :: bit_set[Option] Options :: bit_set[Option; u8]
PictureType :: enum u32 { PictureType :: enum u32 {
OTHER, OTHER,
@@ -73,6 +73,9 @@ PictureType :: enum u32 {
Flac :: struct { Flac :: struct {
metadata: FlacMetadata, metadata: FlacMetadata,
// When using the in-memory API this will hold all the decoded samples of the FLAC stream.
// When using the buffered API this will hold the samples up to the currently decoded frame. If all frames have
// been decoded then this will hold all the decoded samples.
samples: [dynamic]i32, samples: [dynamic]i32,
} }
@@ -102,6 +105,8 @@ Picture :: struct {
Frame :: struct { Frame :: struct {
channels: u8, channels: u8,
sample_rate: u32, sample_rate: u32,
// A slice of `Flac`'s `samples` field.
// Contains the frame's decoded samples.
samples: []i32, samples: []i32,
} }
@@ -720,7 +725,7 @@ read_metadata :: proc(r: ^Reader, buffered := false, allocator := context.alloca
length = u32(md_block_hdr & 0xFFFFFF), length = u32(md_block_hdr & 0xFFFFFF),
} }
last_block = cast(bool)(metadata_block_header.last_block) last_block = metadata_block_header.last_block
switch metadata_block_header.type { switch metadata_block_header.type {
case .STREAMINFO: case .STREAMINFO:
@@ -861,12 +866,16 @@ read_next_frame :: proc(r: ^Reader, flac: ^Flac, allocator := context.allocator)
crc_buffer: Buffer crc_buffer: Buffer
// NOTE: using the default heap allocator here causes a use-after-free bug on files subset/05, subset/06, and subset/25 // NOTE: using the default heap allocator here causes a use-after-free bug on files subset/05, subset/06, and subset/25
// No idea what the cause of the bug is. I am inclined to believe that it's a bug of the default heap allocator but // No idea what the cause of the bug is.
// maybe my code is fucking up the memory so bad it makes it seems that way. //
// Resolved without understanding the root issue. See below code for a note on this.
buffer_init_allocator(&crc_buffer, 0, 128) buffer_init_allocator(&crc_buffer, 0, 128)
defer buffer_destroy(&crc_buffer)
crc := buffer_to_stream(&crc_buffer) crc := buffer_to_stream(&crc_buffer)
r := &Reader{ r := &Reader{
// TODO: tee reader's docs say we should call io.destroy() when done with it. But the tee reader
// doesn't implement the .Destroy method so it does absolutely nothing ?? Should ask about this in the discord.
r = io.tee_reader_init(&tee_r, r, crc), r = io.tee_reader_init(&tee_r, r, crc),
buf = r.buf, buf = r.buf,
x = r.x, x = r.x,
@@ -1049,12 +1058,13 @@ read_next_frame :: proc(r: ^Reader, flac: ^Flac, allocator := context.allocator)
correlate(subframes, channel_assignment) correlate(subframes, channel_assignment)
samples_arr := make([dynamic]i32, 0, block_size * 2) start := len(flac.samples)
// Write the samples interleaved. // Write the samples interleaved.
for i in 0..<len(subframes[0]) { for i in 0..<len(subframes[0]) {
for subframe, sf in subframes { for subframe in subframes {
sample := subframe[i] sample := subframe[i]
append(&samples_arr, sample) append(&flac.samples, sample)
} }
} }
@@ -1062,7 +1072,7 @@ read_next_frame :: proc(r: ^Reader, flac: ^Flac, allocator := context.allocator)
delete(subframe) delete(subframe)
} }
frame.samples = samples_arr[:] frame.samples = flac.samples[start:]
frame.channels = frame_channels frame.channels = frame_channels
frame.sample_rate = actual_sample_rate_in_Hz frame.sample_rate = actual_sample_rate_in_Hz
@@ -1070,8 +1080,15 @@ read_next_frame :: proc(r: ^Reader, flac: ^Flac, allocator := context.allocator)
// Frame Footer // Frame Footer
// //
crc16_bytes := buffer_to_bytes(&crc_buffer) crc16_bytes := buffer_to_bytes(&crc_buffer)
frame_crc := u16(read_data(r, u16be) or_return) // NOTE: The order of these two calls is important. If we're using the default heap allocator
// for crc_buffer and we call read_data before calculate_crc16 then we run into a memory bug.
// I'm still not sure the root cause of the bug but it disappears when they're in this order.
//
// In the below cases the bug doesn't happen and the order doesn't matter.
// When using the temp allocator or an arena allocator.
// When using the reader from the arguments instead of the tee reader.
calculated_frame_crc := calculate_crc16(crc16_bytes) calculated_frame_crc := calculate_crc16(crc16_bytes)
frame_crc := u16(read_data(r, u16be) or_return)
if frame_crc != calculated_frame_crc { if frame_crc != calculated_frame_crc {
fmt.eprintfln("Expected frame CRC 0x%X, got 0x%X", frame_crc, calculated_frame_crc) fmt.eprintfln("Expected frame CRC 0x%X, got 0x%X", frame_crc, calculated_frame_crc)
@@ -1081,7 +1098,11 @@ read_next_frame :: proc(r: ^Reader, flac: ^Flac, allocator := context.allocator)
return frame, nil return frame, nil
} }
// `md5hash` updates the MD5 context with the hash of the provided samples.
// Should be called for every decoded frame with its BPS and samples.
md5hash :: proc(md5_ctx: ^md5.Context, bps: u8, samples: []i32) { md5hash :: proc(md5_ctx: ^md5.Context, bps: u8, samples: []i32) {
assert(1 <= bps && bps <= 32)
for sample in samples { for sample in samples {
switch bps { switch bps {
case 1..=8: case 1..=8:
@@ -1099,12 +1120,13 @@ md5hash :: proc(md5_ctx: ^md5.Context, bps: u8, samples: []i32) {
data := transmute([4]u8)sample data := transmute([4]u8)sample
md5.update(md5_ctx, data[:]) md5.update(md5_ctx, data[:])
case: case:
fmt.println("INVALID BPS") unreachable()
os.exit(1)
} }
} }
} }
// `md5sum` writes the final MD5 checksum to the `flac` struct's `calculated_md5` field
// and returns a MD5_Mismatch error in the case of a mismatch or nil.
md5sum :: proc(md5_ctx: ^md5.Context, flac: ^Flac) -> Error { md5sum :: proc(md5_ctx: ^md5.Context, flac: ^Flac) -> Error {
calculated_md5 := [16]byte{} calculated_md5 := [16]byte{}
md5.final(md5_ctx, calculated_md5[:]) md5.final(md5_ctx, calculated_md5[:])
+1 -1
View File
@@ -1,4 +1,4 @@
//+private #+private
package flac package flac
import "core:crypto/legacy/md5" import "core:crypto/legacy/md5"
+2 -2
View File
@@ -1,7 +1,6 @@
//+private #+private
package flac package flac
import "core:bytes"
import "core:io" import "core:io"
/* Basic byte and bit reader. /* Basic byte and bit reader.
@@ -24,6 +23,7 @@ read_slice :: #force_inline proc(r: ^Reader, buf: []u8) -> io.Error {
} }
read_data :: #force_inline proc(r: ^Reader, $T: typeid) -> (res: T, err: io.Error) { read_data :: #force_inline proc(r: ^Reader, $T: typeid) -> (res: T, err: io.Error) {
// b is safe to return here because the proc is always inlined.
b: [size_of(T)]byte b: [size_of(T)]byte
read_slice(r, b[:]) or_return read_slice(r, b[:]) or_return
-66
View File
@@ -13,7 +13,6 @@ test_blocksize_4096_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -29,7 +28,6 @@ test_blocksize_4608_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -45,7 +43,6 @@ test_blocksize_16_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -61,7 +58,6 @@ test_blocksize_192_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -77,7 +73,6 @@ test_blocksize_254_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -93,7 +88,6 @@ test_blocksize_512_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -109,7 +103,6 @@ test_blocksize_725_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -125,7 +118,6 @@ test_blocksize_1000_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -141,7 +133,6 @@ test_blocksize_1937_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -157,7 +148,6 @@ test_blocksize_2304_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -173,7 +163,6 @@ test_partition_order_8_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -189,7 +178,6 @@ test_qlp_precision_15_bit_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -205,7 +193,6 @@ test_qlp_precision_2_bit_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -221,7 +208,6 @@ wasted_bits_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -237,7 +223,6 @@ only_verbatim_subframes_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -257,7 +242,6 @@ partition_order_8_containing_escaped_partitions_buffered :: proc(t: ^testing.T)
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -273,7 +257,6 @@ all_fixed_orders_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -289,7 +272,6 @@ precision_search_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -305,7 +287,6 @@ samplerate_35467Hz_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -321,7 +302,6 @@ samplerate_39kHz_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -337,7 +317,6 @@ samplerate_22050Hz_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -353,7 +332,6 @@ _12_bit_per_sample_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -369,7 +347,6 @@ _8_bit_per_sample_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -391,7 +368,6 @@ variable_blocksize_file_created_with_flake_revision_264_buffered :: proc(t: ^tes
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -416,7 +392,6 @@ variable_blocksize_file_created_with_flake_revision_264_modified_to_create_small
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -438,7 +413,6 @@ variable_blocksize_file_created_with_CUETools_Flake_2_1_6_buffered :: proc(t: ^t
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -460,7 +434,6 @@ old_format_variable_blocksize_file_created_with_Flake_0_11_buffered :: proc(t: ^
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -476,7 +449,6 @@ high_resolution_audio_default_settings_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -492,7 +464,6 @@ high_resolution_audio_blocksize_16384_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -508,7 +479,6 @@ high_resolution_audio_blocksize_13456_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -530,7 +500,6 @@ high_resolution_audio_using_only_32nd_order_predictors_buffered :: proc(t: ^test
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -552,7 +521,6 @@ high_resolution_audio_partition_order_8_containing_escaped_partitions_buffered :
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -568,7 +536,6 @@ samplerate_192kHz_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -588,7 +555,6 @@ samplerate_192kHz_using_only_32nd_order_predictors_buffered :: proc(t: ^testing.
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -604,7 +570,6 @@ samplerate_134560Hz_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -620,7 +585,6 @@ samplerate_384kHz_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -636,7 +600,6 @@ _20_bit_per_sample_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -652,7 +615,6 @@ _3_channels_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -668,7 +630,6 @@ _4_channels_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -684,7 +645,6 @@ _5_channels_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -700,7 +660,6 @@ _6_channels_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -716,7 +675,6 @@ _7_channels_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -732,7 +690,6 @@ _8_channels_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -754,7 +711,6 @@ _8_channel_surround_192kHz_24_bit_using_only_32nd_order_predictors_buffered :: p
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -770,7 +726,6 @@ no_total_number_of_samples_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -786,7 +741,6 @@ no_min_max_framesize_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -802,7 +756,6 @@ only_streaminfo_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -818,7 +771,6 @@ extreme_large_seektable_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -834,7 +786,6 @@ extreme_large_padding_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -850,7 +801,6 @@ extreme_large_picture_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -866,7 +816,6 @@ extreme_large_vorbiscomment_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -882,7 +831,6 @@ extreme_large_application_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -898,7 +846,6 @@ cuesheet_with_very_many_indexes_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -914,7 +861,6 @@ _1000x_repeating_vorbiscomment_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -930,7 +876,6 @@ file_48_53_combined_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -946,7 +891,6 @@ jpg_picture_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -962,7 +906,6 @@ png_picture_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -978,7 +921,6 @@ gif_picture_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -994,7 +936,6 @@ avif_picture_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -1010,7 +951,6 @@ mono_audio_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -1026,7 +966,6 @@ predictor_overflow_check_16_bit_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -1042,7 +981,6 @@ predictor_overflow_check_20_bit_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -1058,7 +996,6 @@ predictor_overflow_check_24_bit_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -1074,7 +1011,6 @@ rice_partitions_with_escape_code_zero_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -1090,7 +1026,6 @@ uncommon_32_bit_per_sample_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }
@@ -1106,7 +1041,6 @@ uncommon_samplerate_768kHz_buffered :: proc(t: ^testing.T) {
for { for {
frame, f_err := flac.read_next_frame(r, data) frame, f_err := flac.read_next_frame(r, data)
defer delete(frame.samples)
if f_err == .EOF { if f_err == .EOF {
break break
} }