35 lines
957 B
Go
35 lines
957 B
Go
// ABOUTME: Volume and mute helpers shared by audio output backends
|
|
// ABOUTME: Extracted from oto.go during the oto removal cleanup
|
|
package output
|
|
|
|
import "github.com/Sendspin/sendspin-go/pkg/audio"
|
|
|
|
// applyVolume applies volume and mute to samples with clipping protection.
|
|
// Samples are expected to be in the int32 24-bit range.
|
|
func applyVolume(samples []int32, volume int, muted bool) []int32 {
|
|
multiplier := getVolumeMultiplier(volume, muted)
|
|
|
|
result := make([]int32, len(samples))
|
|
for i, sample := range samples {
|
|
scaled := int64(float64(sample) * multiplier)
|
|
|
|
if scaled > audio.Max24Bit {
|
|
scaled = audio.Max24Bit
|
|
} else if scaled < audio.Min24Bit {
|
|
scaled = audio.Min24Bit
|
|
}
|
|
|
|
result[i] = int32(scaled)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// getVolumeMultiplier returns the float multiplier for a given volume/mute state.
|
|
func getVolumeMultiplier(volume int, muted bool) float64 {
|
|
if muted {
|
|
return 0.0
|
|
}
|
|
return float64(volume) / 100.0
|
|
}
|