mirror of
https://github.com/IllusionMan1212/flac-odin.git
synced 2026-10-24 02:12:29 +00:00
small cleanup
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
@@ -1,4 +1,4 @@
|
|||||||
//+private
|
#+private
|
||||||
package flac
|
package flac
|
||||||
|
|
||||||
import "core:crypto/legacy/md5"
|
import "core:crypto/legacy/md5"
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user