package aoiprxkit import ( "encoding/binary" "fmt" ) // DecodeL24BE decodes signed 24-bit big-endian PCM into int32 samples sign-extended to 32 bits. func DecodeL24BE(payload []byte, channels int) ([]int32, error) { if channels < 1 { return nil, fmt.Errorf("invalid channels: %d", channels) } if len(payload)%3 != 0 { return nil, fmt.Errorf("payload length %d is not divisible by 3", len(payload)) } totalSamples := len(payload) / 3 if totalSamples%channels != 0 { return nil, fmt.Errorf("payload sample count %d is not divisible by channels %d", totalSamples, channels) } out := make([]int32, totalSamples) j := 0 for i := 0; i < len(payload); i += 3 { v := int32(payload[i])<<16 | int32(payload[i+1])<<8 | int32(payload[i+2]) if v&0x800000 != 0 { v |= ^int32(0xFFFFFF) } out[j] = v j++ } return out, nil } // DecodeS32LE decodes signed 32-bit little-endian PCM into int32 samples. func DecodeS32LE(payload []byte, channels int) ([]int32, error) { if channels < 1 { return nil, fmt.Errorf("invalid channels: %d", channels) } if len(payload)%4 != 0 { return nil, fmt.Errorf("payload length %d is not divisible by 4", len(payload)) } totalSamples := len(payload) / 4 if totalSamples%channels != 0 { return nil, fmt.Errorf("payload sample count %d is not divisible by channels %d", totalSamples, channels) } out := make([]int32, totalSamples) for i := 0; i < totalSamples; i++ { out[i] = int32(binary.LittleEndian.Uint32(payload[i*4 : i*4+4])) } return out, nil }