Skip to content

Instantly share code, notes, and snippets.

@adamryman
Created January 7, 2017 06:37
Show Gist options
  • Save adamryman/9166e33b4f73e6d3e9bc302847113c94 to your computer and use it in GitHub Desktop.
Save adamryman/9166e33b4f73e6d3e9bc302847113c94 to your computer and use it in GitHub Desktop.
Play wav files with go, slowed down it seems for now. Will work more later
package main
import (
"encoding/binary"
"fmt"
"math"
"os"
"github.com/mesilliac/pulse-simple"
"github.com/mjibson/go-dsp/wav"
)
func main() {
if len(os.Args) < 2 {
os.Exit(1)
}
f, err := os.Open(os.Args[1])
if err != nil {
fmt.Println(err)
os.Exit(1)
}
w, err := wav.New(f)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
ss := pulse.SampleSpec{pulse.SAMPLE_FLOAT32LE, 44100, 1}
pb, err := pulse.Playback("pulse-simple test", "playback test", &ss)
defer pb.Free()
defer pb.Drain()
if err != nil {
fmt.Printf("Could not create playback stream: %s\n", err)
return
}
playwav(pb, &ss, w)
}
func playwav(s *pulse.Stream, ss *pulse.SampleSpec, w *wav.Wav) {
data := make([]byte, 4*ss.Rate)
for {
for i := 0; i < int(ss.Rate); i++ {
sample, err := w.ReadFloats(1)
if err != nil {
fmt.Println(err)
return
}
bits := math.Float32bits(sample[0])
binary.LittleEndian.PutUint32(data[4*i:4*i+4], bits)
}
s.Write(data)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment