Skip to content

Commit 811680b

Browse files
committed
default silences wav
1 parent a32b7a3 commit 811680b

File tree

5 files changed

+136
-10
lines changed

5 files changed

+136
-10
lines changed

.version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v0.2.1
1+
v0.2.2

audio/utils/empty.go

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package utils
2+
3+
// AudioSilenceDefault creates a WAV silence buffer with 1000 samples
4+
func AudioSilenceDefault() []byte {
5+
// Create 1000 samples of silence (2000 bytes for 16-bit)
6+
empty := make([]byte, 1000)
7+
8+
headers := GenerateWavHeadersWithConfig(&WavHeader{
9+
Length: uint32(len(empty) + 44), // 44 is WAV header size
10+
WaveFormat: WAVE_FORMAT_PCM,
11+
Channels: 1,
12+
SampleRate: 8000,
13+
BitDepth: 16,
14+
Verbose: false,
15+
})
16+
17+
// Combine headers and empty samples
18+
result := make([]byte, len(headers)+len(empty))
19+
copy(result, headers)
20+
copy(result[len(headers):], empty)
21+
return result
22+
}
23+
24+
// AudioSilence creates a WAV silence buffer of specified duration in milliseconds
25+
func AudioSilence(durationMs int) []byte {
26+
// Calculate number of samples needed (8000Hz * (durationMs/1000))
27+
numSamples := (8000 * durationMs) / 1000
28+
29+
// Pre-allocate the exact buffer size needed (2 bytes per sample for 16-bit)
30+
empty := make([]byte, numSamples*2)
31+
32+
headers := GenerateWavHeadersWithConfig(&WavHeader{
33+
Length: uint32(len(empty) + 44), // 44 is WAV header size
34+
WaveFormat: WAVE_FORMAT_PCM,
35+
Channels: 1,
36+
SampleRate: 8000,
37+
BitDepth: 16,
38+
Verbose: false, // Set to false unless debugging
39+
})
40+
41+
// Pre-allocate the final buffer to avoid reallocation
42+
result := make([]byte, len(headers)+len(empty))
43+
copy(result, headers)
44+
copy(result[len(headers):], empty)
45+
return result
46+
}

audio/utils/empty_test.go

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package utils
2+
3+
import (
4+
"bytes"
5+
"testing"
6+
)
7+
8+
func TestAudioSilence(t *testing.T) {
9+
tests := []struct {
10+
name string
11+
durationMs int
12+
wantLen int // Expected total length including 44 byte header
13+
}{
14+
{
15+
name: "1 second silence",
16+
durationMs: 1000,
17+
wantLen: 16044, // 44 + (8000 * 2) bytes
18+
},
19+
{
20+
name: "500ms silence",
21+
durationMs: 500,
22+
wantLen: 8044, // 44 + (4000 * 2) bytes
23+
},
24+
{
25+
name: "100ms silence",
26+
durationMs: 100,
27+
wantLen: 1644, // 44 + (800 * 2) bytes
28+
},
29+
{
30+
name: "zero duration",
31+
durationMs: 0,
32+
wantLen: 44, // Just header
33+
},
34+
}
35+
36+
for _, tt := range tests {
37+
t.Run(tt.name, func(t *testing.T) {
38+
got := AudioSilence(tt.durationMs)
39+
40+
// Check total length
41+
if len(got) != tt.wantLen {
42+
t.Errorf("AudioSilence() length = %v, want %v", len(got), tt.wantLen)
43+
}
44+
45+
// Verify WAV header basics
46+
if !bytes.Equal(got[0:4], []byte("RIFF")) {
47+
t.Error("AudioSilence() invalid RIFF header")
48+
}
49+
if !bytes.Equal(got[8:12], []byte("WAVE")) {
50+
t.Error("AudioSilence() invalid WAVE format")
51+
}
52+
53+
// Verify silence (all bytes should be 0 after header)
54+
for i := 44; i < len(got); i++ {
55+
if got[i] != 0 {
56+
t.Errorf("AudioSilence() non-zero byte at position %d", i)
57+
break
58+
}
59+
}
60+
})
61+
}
62+
}
63+
64+
func TestAudioSilenceDefault(t *testing.T) {
65+
got := AudioSilenceDefault()
66+
wantLen := 1044 // 44 + (1000 * 2) bytes
67+
68+
// Check total length
69+
if len(got) != wantLen {
70+
t.Errorf("AudioSilenceDefault() length = %v, want %v", len(got), wantLen)
71+
}
72+
73+
// Verify WAV header basics
74+
if !bytes.Equal(got[0:4], []byte("RIFF")) {
75+
t.Error("AudioSilenceDefault() invalid RIFF header")
76+
}
77+
if !bytes.Equal(got[8:12], []byte("WAVE")) {
78+
t.Error("AudioSilenceDefault() invalid WAVE format")
79+
}
80+
81+
// Verify silence (all bytes should be 0 after header)
82+
for i := 44; i < len(got); i++ {
83+
if got[i] != 0 {
84+
t.Errorf("AudioSilenceDefault() non-zero byte at position %d", i)
85+
break
86+
}
87+
}
88+
}

audio/utils/wav_headers.go

-8
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,7 @@ func GenerateWavHeadersWithConfig(head *WavHeader) []byte {
7070
}
7171

7272
totalLength := head.Length - 8
73-
if totalLength < 0 {
74-
log.Printf("WARNING: Length is less than 8, defaulting to 0\n")
75-
totalLength = 0
76-
}
77-
7873
subChunk2Size := head.Length - 44
79-
if subChunk2Size < 0 {
80-
subChunk2Size = 0
81-
}
8274

8375
chunkID := []byte{'R', 'I', 'F', 'F'}
8476
format := []byte{'W', 'A', 'V', 'E'}

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module github.com/sopro-dev/sopro-core
22

3-
go 1.21.5
3+
go 1.23.4

0 commit comments

Comments
 (0)