61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
package asteriskws
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"math"
|
|
"time"
|
|
|
|
"ai-operator/internal/audio"
|
|
"ai-operator/internal/media"
|
|
)
|
|
|
|
func GenerateSilence(codec media.Codec, duration time.Duration, sampleRate int) []byte {
|
|
if duration <= 0 || sampleRate <= 0 {
|
|
return nil
|
|
}
|
|
switch codec {
|
|
case media.CodecSLIN16:
|
|
case media.CodecULaw:
|
|
samples := int(duration.Seconds() * float64(sampleRate))
|
|
out := make([]byte, samples)
|
|
for i := range out {
|
|
out[i] = 0xff
|
|
}
|
|
return out
|
|
default:
|
|
return nil
|
|
}
|
|
samples := int(duration.Seconds() * float64(sampleRate))
|
|
return make([]byte, samples*2)
|
|
}
|
|
|
|
func GenerateSineToneSLIN16(frequencyHz float64, duration time.Duration, sampleRate int, amplitude float64) []byte {
|
|
if frequencyHz <= 0 || duration <= 0 || sampleRate <= 0 {
|
|
return nil
|
|
}
|
|
if amplitude < 0 {
|
|
amplitude = 0
|
|
}
|
|
if amplitude > 1 {
|
|
amplitude = 1
|
|
}
|
|
samples := int(duration.Seconds() * float64(sampleRate))
|
|
out := make([]byte, samples*2)
|
|
for i := 0; i < samples; i++ {
|
|
v := int16(math.Sin(2*math.Pi*frequencyHz*float64(i)/float64(sampleRate)) * amplitude * math.MaxInt16)
|
|
binary.LittleEndian.PutUint16(out[i*2:], uint16(v))
|
|
}
|
|
return out
|
|
}
|
|
|
|
func GenerateSineTone(codec media.Codec, frequencyHz float64, duration time.Duration, sampleRate int, amplitude float64) []byte {
|
|
pcm := GenerateSineToneSLIN16(frequencyHz, duration, sampleRate, amplitude)
|
|
if codec == media.CodecULaw {
|
|
return audio.EncodeULaw(pcm)
|
|
}
|
|
if codec == media.CodecSLIN16 {
|
|
return pcm
|
|
}
|
|
return nil
|
|
}
|