mirror of
https://github.com/vsariola/sointu.git
synced 2025-05-28 03:10:24 -04:00
30 lines
713 B
Go
30 lines
713 B
Go
package oto
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"fmt"
|
|
"math"
|
|
)
|
|
|
|
// FloatBufferTo16BitLE is a naive helper method to convert []float32 buffers to
|
|
// 16-bit little-endian integer buffers.
|
|
// TODO: optimize/refactor this, current is far from the best solution
|
|
func FloatBufferTo16BitLE(buff []float32) ([]byte, error) {
|
|
var buf bytes.Buffer
|
|
for i, v := range buff {
|
|
var uv int16
|
|
if v < -1.0 {
|
|
uv = -math.MaxInt16
|
|
} else if v > 1.0 {
|
|
uv = math.MaxInt16
|
|
} else {
|
|
uv = int16(v * math.MaxInt16)
|
|
}
|
|
if err := binary.Write(&buf, binary.LittleEndian, uv); err != nil {
|
|
return nil, fmt.Errorf("error converting buffer (@ %v, value %v) to bytes: %w", i, v, err)
|
|
}
|
|
}
|
|
return buf.Bytes(), nil
|
|
}
|