Example #1
0
File: au.go Project: skyview059/vu
// 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")
}
Example #2
0
// 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
}