@@ -20,6 +20,7 @@ func init() {
20
20
DecodeFn : frameDecode ,
21
21
DefaultInArg : format.FLAC_Frame_In {
22
22
BitsPerSample : 16 , // TODO: maybe should not have a default value?
23
+ SampleDetails : false ,
23
24
},
24
25
})
25
26
}
@@ -466,25 +467,48 @@ func frameDecode(d *decode.D) any {
466
467
n += count
467
468
} else {
468
469
d .RangeFn (d .Pos (), int64 (count * escapeSampleSize ), func (d * decode.D ) {
469
- d .FieldRawLen ("samples" , int64 (count * escapeSampleSize ))
470
+ if ffi .SampleDetails {
471
+ d .FieldArray ("residuals" , func (d * decode.D ) {
472
+ for i := 0 ; i < count ; i ++ {
473
+ d .FieldS ("residual" , escapeSampleSize )
474
+ }
475
+ })
476
+ } else {
477
+ d .FieldRawLen ("residuals" , int64 (count * escapeSampleSize ))
478
+ }
470
479
})
471
480
for j := 0 ; j < count ; j ++ {
472
481
samples [n ] = d .S (escapeSampleSize )
473
482
n ++
474
483
}
475
484
}
476
485
} else {
477
- samplesStart := d .Pos ()
478
- for j := 0 ; j < count ; j ++ {
479
- high := d .Unary (0 )
480
- low := d .U (riceParameter )
481
- samples [n ] = mathex.ZigZag [uint64 , int64 ](high << riceParameter | low )
482
- n ++
486
+ if ffi .SampleDetails {
487
+ d .FieldArray ("residuals" , func (d * decode.D ) {
488
+ for i := 0 ; i < count ; i ++ {
489
+ d .FieldStruct ("residual" , func (d * decode.D ) {
490
+ high := d .FieldUnary ("high" , 0 )
491
+ low := d .FieldU ("low" , riceParameter )
492
+ residual := mathex.ZigZag [uint64 , int64 ](high << riceParameter | low )
493
+ d .FieldValueSint ("value" , residual )
494
+ samples [n ] = residual
495
+ })
496
+ n ++
497
+ }
498
+ })
499
+ } else {
500
+ samplesStart := d .Pos ()
501
+ for j := 0 ; j < count ; j ++ {
502
+ high := d .Unary (0 )
503
+ low := d .U (riceParameter )
504
+ samples [n ] = mathex.ZigZag [uint64 , int64 ](high << riceParameter | low )
505
+ n ++
506
+ }
507
+ samplesStop := d .Pos ()
508
+ d .RangeFn (samplesStart , samplesStop - samplesStart , func (d * decode.D ) {
509
+ d .FieldRawLen ("residuals" , d .BitsLeft ())
510
+ })
483
511
}
484
- samplesStop := d .Pos ()
485
- d .RangeFn (samplesStart , samplesStop - samplesStart , func (d * decode.D ) {
486
- d .FieldRawLen ("samples" , d .BitsLeft ())
487
- })
488
512
}
489
513
})
490
514
}
@@ -516,7 +540,15 @@ func frameDecode(d *decode.D) any {
516
540
// <n*i> Unencoded subblock; n = frame's bits-per-sample, i = frame's blocksize.
517
541
// TODO: refactor into some kind of FieldBitBufLenFn?
518
542
d .RangeFn (d .Pos (), int64 (blockSize * subframeSampleSize ), func (d * decode.D ) {
519
- d .FieldRawLen ("samples" , d .BitsLeft ())
543
+ if ffi .SampleDetails {
544
+ d .FieldArray ("samples" , func (d * decode.D ) {
545
+ for i := 0 ; i < subframeSampleSize ; i ++ {
546
+ d .FieldS ("sample" , subframeSampleSize )
547
+ }
548
+ })
549
+ } else {
550
+ d .FieldRawLen ("samples" , d .BitsLeft ())
551
+ }
520
552
})
521
553
522
554
for i := 0 ; i < blockSize ; i ++ {
@@ -565,6 +597,14 @@ func frameDecode(d *decode.D) any {
565
597
}
566
598
}
567
599
600
+ if ffi .SampleDetails {
601
+ d .FieldArray ("samples" , func (d * decode.D ) {
602
+ for i := 0 ; i < len (samples ); i ++ {
603
+ d .FieldValueSint ("sample" , samples [i ])
604
+ }
605
+ })
606
+ }
607
+
568
608
channelSamples = append (channelSamples , samples )
569
609
})
570
610
}
0 commit comments