Skip to content

Commit 0c539db

Browse files
committed
fix(processor): address nil pointer risks and formatting edge cases
- Add nil guards for inputMeasurements in normalise.go before accessing NoiseProfile and SpeechProfile - Add +Inf check in formatMetricLUFS for consistency with formatMetricDB - Add nil guards for result.Measurements in processor_test.go (4 locations) - Fix copy-paste comment error in analyzer.go Addresses review feedback from PR #5
1 parent 22b739e commit 0c539db

4 files changed

Lines changed: 8 additions & 8 deletions

File tree

internal/logging/table.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ const LUFSMeasurementFloor = -70.0
183183
// formatMetricLUFS formats a LUFS value with special handling for values below measurement floor.
184184
// Shows "< -70" for values below the ebur128 measurement threshold.
185185
func formatMetricLUFS(value float64, decimals int) string {
186-
if math.IsNaN(value) {
186+
if math.IsNaN(value) || math.IsInf(value, 1) {
187187
return MissingValue
188188
}
189189
// ebur128 can report values well below -70 for near-silent signals

internal/processor/analyzer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3727,7 +3727,7 @@ func MeasureOutputSpeechRegion(outputPath string, region SpeechRegion) (*SpeechC
37273727
}
37283728

37293729
if !rmsLevelFound {
3730-
metrics.RMSLevel = -60.0 // Conservative fallback for silence
3730+
metrics.RMSLevel = -60.0 // Conservative fallback
37313731
}
37323732

37333733
return metrics, nil

internal/processor/normalise.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ func applyLoudnormAndMeasure(
662662

663663
// Measure silence region in final output (same region as Pass 1 noise profile)
664664
// NOTE: inputPath now contains the normalised output after os.Rename above
665-
if inputMeasurements.NoiseProfile != nil {
665+
if inputMeasurements != nil && inputMeasurements.NoiseProfile != nil {
666666
silenceRegion := SilenceRegion{
667667
Start: inputMeasurements.NoiseProfile.Start,
668668
End: inputMeasurements.NoiseProfile.Start + inputMeasurements.NoiseProfile.Duration,
@@ -676,7 +676,7 @@ func applyLoudnormAndMeasure(
676676

677677
// Measure speech region in final output (same region as Pass 1 speech profile)
678678
// NOTE: inputPath now contains the normalised output after os.Rename above
679-
if inputMeasurements.SpeechProfile != nil {
679+
if inputMeasurements != nil && inputMeasurements.SpeechProfile != nil {
680680
speechRegion := SpeechRegion{
681681
Start: inputMeasurements.SpeechProfile.Region.Start,
682682
End: inputMeasurements.SpeechProfile.Region.End,

internal/processor/processor_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func TestProcessAudio(t *testing.T) {
7070
t.Error("ProcessAudio returned nil FilteredMeasurements")
7171
} else {
7272
// Verify silence sample measurements are captured in Pass 2 output (if NoiseProfile exists)
73-
if result.Measurements.NoiseProfile != nil {
73+
if result.Measurements != nil && result.Measurements.NoiseProfile != nil {
7474
t.Logf("NoiseProfile exists: Start=%v, Duration=%v", result.Measurements.NoiseProfile.Start, result.Measurements.NoiseProfile.Duration)
7575
if result.FilteredMeasurements.SilenceSample == nil {
7676
t.Error("FilteredMeasurements.SilenceSample is nil despite NoiseProfile existing")
@@ -83,7 +83,7 @@ func TestProcessAudio(t *testing.T) {
8383
}
8484

8585
// Verify speech sample measurements are captured in Pass 2 output (if SpeechProfile exists)
86-
if result.Measurements.SpeechProfile != nil {
86+
if result.Measurements != nil && result.Measurements.SpeechProfile != nil {
8787
t.Logf("SpeechProfile exists: Region=%v", result.Measurements.SpeechProfile.Region)
8888
if result.FilteredMeasurements.SpeechSample == nil {
8989
t.Error("FilteredMeasurements.SpeechSample is nil despite SpeechProfile existing")
@@ -99,7 +99,7 @@ func TestProcessAudio(t *testing.T) {
9999
// Verify final measurements are populated (Pass 4 output analysis after normalisation)
100100
if result.NormResult != nil && result.NormResult.FinalMeasurements != nil {
101101
// Verify silence sample measurements are captured in Pass 4 output (if NoiseProfile exists)
102-
if result.Measurements.NoiseProfile != nil {
102+
if result.Measurements != nil && result.Measurements.NoiseProfile != nil {
103103
if result.NormResult.FinalMeasurements.SilenceSample == nil {
104104
t.Error("FinalMeasurements.SilenceSample is nil despite NoiseProfile existing")
105105
} else {
@@ -109,7 +109,7 @@ func TestProcessAudio(t *testing.T) {
109109
}
110110

111111
// Verify speech sample measurements are captured in Pass 4 output (if SpeechProfile exists)
112-
if result.Measurements.SpeechProfile != nil {
112+
if result.Measurements != nil && result.Measurements.SpeechProfile != nil {
113113
if result.NormResult.FinalMeasurements.SpeechSample == nil {
114114
t.Error("FinalMeasurements.SpeechSample is nil despite SpeechProfile existing")
115115
} else {

0 commit comments

Comments
 (0)