// au demonstrates basic audio library, vu/audio/al, capabilities. // It checks that OpenAL is installed and the bindings are working // by loading and playing a sound. func au() { al.Init() // map the bindings to the OpenAL dynamic library. // open the default device. if dev := al.OpenDevice(""); dev != 0 { defer al.CloseDevice(dev) // create a context on the device. if ctx := al.CreateContext(dev, nil); ctx != 0 { defer al.MakeContextCurrent(0) defer al.DestroyContext(ctx) al.MakeContextCurrent(ctx) // create buffers and sources var buffer, source uint32 al.GenBuffers(1, &buffer) al.GenSources(1, &source) // read in the audio data. ldr := load.NewLoader() wh, data, err := ldr.Wav("bloop") if err != nil { log.Printf("au: error loading audio file %s %s", "bloop", err) return } // copy the audio data into the buffer tag := &autag{} format := tag.audioFormat(wh) if format < 0 { log.Printf("au: error recognizing audio format") return } al.BufferData(buffer, int32(format), al.Pointer(&(data[0])), int32(wh.DataSize), int32(wh.Frequency)) // attach the source to a buffer. al.Sourcei(source, al.BUFFER, int32(buffer)) // check for any audio library errors that have happened up to this point. if openAlErr := al.GetError(); openAlErr != 0 { log.Printf("au: OpenAL error %d", openAlErr) return } // Start playback and give enough time for the playback to finish. al.SourcePlay(source) time.Sleep(500 * time.Millisecond) return } log.Printf("au: error, failed to get a context") } log.Printf("au: error, failed to get a device") }
// BindSound copies sound data to the sound card. If successfull then the // sound reference, snd, and sound data buffer reference, buff are updated // with valid references. func (a *openal) BindSound(snd, buff *uint64, d *Data) (err error) { if alerr := al.GetError(); alerr != al.NO_ERROR { log.Printf("openal.BindSound need to find and fix prior error %X", alerr) } // create the sound buffer and copy the audio data into the buffer var buff32, snd32 uint32 var format int32 if format, err = a.format(d); err == nil { al.GenBuffers(1, &buff32) al.BufferData(buff32, format, al.Pointer(&(d.AudioData[0])), int32(d.DataSize), int32(d.Frequency)) *buff = uint64(buff32) if alerr := al.GetError(); alerr != al.NO_ERROR { err = fmt.Errorf("Failed binding sound %s", d.Name) } else { al.GenSources(1, &snd32) al.Sourcei(snd32, al.BUFFER, int32(*buff)) *snd = uint64(snd32) } } return err }