barnard/gumble/go-openal/openal/buffer.go

208 lines
5.9 KiB
Go

// Copyright 2009 Peter H. Froehlich. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package openal
/*
#include <stdlib.h>
#cgo darwin LDFLAGS: -framework OpenAL
#include "local.h"
#include "wrapper.h"
*/
import "C"
import "unsafe"
// Buffers are storage space for sample data.
type Buffer uint32
// Attributes that can be queried with Buffer.Geti().
const (
alFrequency = 0x2001
alBits = 0x2002
alChannels = 0x2003
alSize = 0x2004
)
type Buffers []Buffer
// NewBuffers() creates n fresh buffers.
// Renamed, was GenBuffers.
func NewBuffers(n int) (buffers Buffers) {
buffers = make(Buffers, n)
C.walGenBuffers(C.ALsizei(n), unsafe.Pointer(&buffers[0]))
return
}
// Delete() deletes the given buffers.
func (self Buffers) Delete() {
n := len(self)
C.walDeleteBuffers(C.ALsizei(n), unsafe.Pointer(&self[0]))
}
// Renamed, was Bufferf.
func (self Buffer) setf(param int32, value float32) {
C.alBufferf(C.ALuint(self), C.ALenum(param), C.ALfloat(value))
}
// Renamed, was Buffer3f.
func (self Buffer) set3f(param int32, value1, value2, value3 float32) {
C.alBuffer3f(C.ALuint(self), C.ALenum(param), C.ALfloat(value1), C.ALfloat(value2), C.ALfloat(value3))
}
// Renamed, was Bufferfv.
func (self Buffer) setfv(param int32, values []float32) {
C.walBufferfv(C.ALuint(self), C.ALenum(param), unsafe.Pointer(&values[0]))
}
// Renamed, was Bufferi.
func (self Buffer) seti(param int32, value int32) {
C.alBufferi(C.ALuint(self), C.ALenum(param), C.ALint(value))
}
// Renamed, was Buffer3i.
func (self Buffer) set3i(param int32, value1, value2, value3 int32) {
C.alBuffer3i(C.ALuint(self), C.ALenum(param), C.ALint(value1), C.ALint(value2), C.ALint(value3))
}
// Renamed, was Bufferiv.
func (self Buffer) setiv(param int32, values []int32) {
C.walBufferiv(C.ALuint(self), C.ALenum(param), unsafe.Pointer(&values[0]))
}
// Renamed, was GetBufferf.
func (self Buffer) getf(param int32) float32 {
return float32(C.walGetBufferf(C.ALuint(self), C.ALenum(param)))
}
// Renamed, was GetBuffer3f.
func (self Buffer) get3f(param int32) (value1, value2, value3 float32) {
var v1, v2, v3 float32
C.walGetBuffer3f(C.ALuint(self), C.ALenum(param), unsafe.Pointer(&v1),
unsafe.Pointer(&v2), unsafe.Pointer(&v3))
value1, value2, value3 = v1, v2, v3
return
}
// Renamed, was GetBufferfv.
func (self Buffer) getfv(param int32, values []float32) {
C.walGetBufferfv(C.ALuint(self), C.ALenum(param), unsafe.Pointer(&values[0]))
return
}
// Renamed, was GetBufferi.
func (self Buffer) geti(param int32) int32 {
return int32(C.walGetBufferi(C.ALuint(self), C.ALenum(param)))
}
// Renamed, was GetBuffer3i.
func (self Buffer) get3i(param int32) (value1, value2, value3 int32) {
var v1, v2, v3 int32
C.walGetBuffer3i(C.ALuint(self), C.ALenum(param), unsafe.Pointer(&v1),
unsafe.Pointer(&v2), unsafe.Pointer(&v3))
value1, value2, value3 = v1, v2, v3
return
}
// Renamed, was GetBufferiv.
func (self Buffer) getiv(param int32, values []int32) {
C.walGetBufferiv(C.ALuint(self), C.ALenum(param), unsafe.Pointer(&values[0]))
}
type Format uint32
func (f Format) SampleSize() int {
switch f {
case FormatMono8:
return 1
case FormatMono16:
return 2
case FormatStereo8:
return 2
case FormatStereo16:
return 4
default:
return 1
}
}
// Format of sound samples passed to Buffer.SetData().
const (
FormatMono8 Format = 0x1100
FormatMono16 Format = 0x1101
FormatStereo8 Format = 0x1102
FormatStereo16 Format = 0x1103
)
// SetData() specifies the sample data the buffer should use.
// For FormatMono16 and FormatStereo8 the data slice must be a
// multiple of two bytes long; for FormatStereo16 the data slice
// must be a multiple of four bytes long. The frequency is given
// in Hz.
// Renamed, was BufferData.
func (self Buffer) SetData(format Format, data []byte, frequency int32) {
C.alBufferData(C.ALuint(self), C.ALenum(format), unsafe.Pointer(&data[0]),
C.ALsizei(len(data)), C.ALsizei(frequency))
}
func (self Buffer) SetDataInt16(format Format, data []int16, frequency int32) {
C.alBufferData(C.ALuint(self), C.ALenum(format), unsafe.Pointer(&data[0]),
C.ALsizei(len(data)*2), C.ALsizei(frequency))
}
func (self Buffer) SetDataMono8(data []byte, frequency int32) {
C.alBufferData(C.ALuint(self), C.ALenum(FormatMono8), unsafe.Pointer(&data[0]),
C.ALsizei(len(data)), C.ALsizei(frequency))
}
func (self Buffer) SetDataMono16(data []int16, frequency int32) {
C.alBufferData(C.ALuint(self), C.ALenum(FormatMono16), unsafe.Pointer(&data[0]),
C.ALsizei(len(data)*2), C.ALsizei(frequency))
}
func (self Buffer) SetDataStereo8(data [][2]byte, frequency int32) {
C.alBufferData(C.ALuint(self), C.ALenum(FormatStereo8), unsafe.Pointer(&data[0]),
C.ALsizei(len(data)*2), C.ALsizei(frequency))
}
func (self Buffer) SetDataStereo16(data [][2]int16, frequency int32) {
C.alBufferData(C.ALuint(self), C.ALenum(FormatStereo16), unsafe.Pointer(&data[0]),
C.ALsizei(len(data)*4), C.ALsizei(frequency))
}
// NewBuffer() creates a single buffer.
// Convenience function, see NewBuffers().
func NewBuffer() Buffer {
return Buffer(C.walGenBuffer())
}
// Delete() deletes a single buffer.
// Convenience function, see DeleteBuffers().
func (self Buffer) Delete() {
C.walDeleteSource(C.ALuint(self))
}
// GetFrequency() returns the frequency, in Hz, of the buffer's sample data.
// Convenience method.
func (self Buffer) GetFrequency() uint32 {
return uint32(self.geti(alFrequency))
}
// GetBits() returns the resolution, either 8 or 16 bits, of the buffer's sample data.
// Convenience method.
func (self Buffer) GetBits() uint32 {
return uint32(self.geti(alBits))
}
// GetChannels() returns the number of channels, either 1 or 2, of the buffer's sample data.
// Convenience method.
func (self Buffer) GetChannels() uint32 {
return uint32(self.geti(alChannels))
}
// GetSize() returns the size, in bytes, of the buffer's sample data.
// Convenience method.
func (self Buffer) GetSize() uint32 {
return uint32(self.geti(alSize))
}