| // Copyright 2015 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // +build darwin linux |
| |
| // Package al provides OpenAL Soft bindings for Go. |
| // |
| // Calls are not safe for concurrent use. |
| // |
| // More information about OpenAL Soft is available at |
| // http://www.openal.org/documentation/openal-1.1-specification.pdf. |
| // |
| // In order to use this package on Linux desktop distros, |
| // you will need OpenAL library as an external dependency. |
| // On Ubuntu 14.04 'Trusty', you may have to install this library |
| // by running the command below. |
| // |
| // sudo apt-get install libopenal-dev |
| // |
| // When compiled for Android, this package uses OpenAL Soft. Please add its |
| // license file to the open source notices of your application. |
| // OpenAL Soft's license file could be found at |
| // http://repo.or.cz/w/openal-soft.git/blob/HEAD:/COPYING. |
| package al // import "golang.org/x/mobile/exp/audio/al" |
| |
| // Enable enables a capability. |
| func Enable(capability int32) { |
| alEnable(capability) |
| } |
| |
| // Disable disables a capability. |
| func Disable(capability int32) { |
| alDisable(capability) |
| } |
| |
| // Enabled returns true if the specified capability is enabled. |
| func Enabled(capability int32) bool { |
| return alIsEnabled(capability) |
| } |
| |
| // Vector represents an vector in a Cartesian coordinate system. |
| type Vector [3]float32 |
| |
| // Orientation represents the angular position of an object in a |
| // right-handed Cartesian coordinate system. |
| // A cross product between the forward and up vector returns a vector |
| // that points to the right. |
| type Orientation struct { |
| // Forward vector is the direction that the object is looking at. |
| Forward Vector |
| // Up vector represents the rotation of the object. |
| Up Vector |
| } |
| |
| func orientationFromSlice(v []float32) Orientation { |
| return Orientation{ |
| Forward: Vector{v[0], v[1], v[2]}, |
| Up: Vector{v[3], v[4], v[5]}, |
| } |
| } |
| |
| func (v Orientation) slice() []float32 { |
| return []float32{v.Forward[0], v.Forward[1], v.Forward[2], v.Up[0], v.Up[1], v.Up[2]} |
| } |
| |
| func geti(param int) int32 { |
| return alGetInteger(param) |
| } |
| |
| func getf(param int) float32 { |
| return alGetFloat(param) |
| } |
| |
| func getString(param int) string { |
| return alGetString(param) |
| } |
| |
| // DistanceModel returns the distance model. |
| func DistanceModel() int32 { |
| return geti(paramDistanceModel) |
| } |
| |
| // SetDistanceModel sets the distance model. |
| func SetDistanceModel(v int32) { |
| alDistanceModel(v) |
| } |
| |
| // DopplerFactor returns the doppler factor. |
| func DopplerFactor() float32 { |
| return getf(paramDopplerFactor) |
| } |
| |
| // SetDopplerFactor sets the doppler factor. |
| func SetDopplerFactor(v float32) { |
| alDopplerFactor(v) |
| } |
| |
| // DopplerVelocity returns the doppler velocity. |
| func DopplerVelocity() float32 { |
| return getf(paramDopplerVelocity) |
| } |
| |
| // SetDopplerVelocity sets the doppler velocity. |
| func SetDopplerVelocity(v float32) { |
| alDopplerVelocity(v) |
| } |
| |
| // SpeedOfSound is the speed of sound in meters per second (m/s). |
| func SpeedOfSound() float32 { |
| return getf(paramSpeedOfSound) |
| } |
| |
| // SetSpeedOfSound sets the speed of sound, its unit should be meters per second (m/s). |
| func SetSpeedOfSound(v float32) { |
| alSpeedOfSound(v) |
| } |
| |
| // Vendor returns the vendor. |
| func Vendor() string { |
| return getString(paramVendor) |
| } |
| |
| // Version returns the version string. |
| func Version() string { |
| return getString(paramVersion) |
| } |
| |
| // Renderer returns the renderer information. |
| func Renderer() string { |
| return getString(paramRenderer) |
| } |
| |
| // Extensions returns the enabled extensions. |
| func Extensions() string { |
| return getString(paramExtensions) |
| } |
| |
| // Error returns the most recently generated error. |
| func Error() int32 { |
| return alGetError() |
| } |
| |
| // Source represents an individual sound source in 3D-space. |
| // They take PCM data, apply modifications and then submit them to |
| // be mixed according to their spatial location. |
| type Source uint32 |
| |
| // GenSources generates n new sources. These sources should be deleted |
| // once they are not in use. |
| func GenSources(n int) []Source { |
| return alGenSources(n) |
| } |
| |
| // PlaySources plays the sources. |
| func PlaySources(source ...Source) { |
| alSourcePlayv(source) |
| } |
| |
| // PauseSources pauses the sources. |
| func PauseSources(source ...Source) { |
| alSourcePausev(source) |
| } |
| |
| // StopSources stops the sources. |
| func StopSources(source ...Source) { |
| alSourceStopv(source) |
| } |
| |
| // RewindSources rewinds the sources to their beginning positions. |
| func RewindSources(source ...Source) { |
| alSourceRewindv(source) |
| } |
| |
| // DeleteSources deletes the sources. |
| func DeleteSources(source ...Source) { |
| alDeleteSources(source) |
| } |
| |
| // Gain returns the source gain. |
| func (s Source) Gain() float32 { |
| return getSourcef(s, paramGain) |
| } |
| |
| // SetGain sets the source gain. |
| func (s Source) SetGain(v float32) { |
| setSourcef(s, paramGain, v) |
| } |
| |
| // MinGain returns the source's minimum gain setting. |
| func (s Source) MinGain() float32 { |
| return getSourcef(s, paramMinGain) |
| } |
| |
| // SetMinGain sets the source's minimum gain setting. |
| func (s Source) SetMinGain(v float32) { |
| setSourcef(s, paramMinGain, v) |
| } |
| |
| // MaxGain returns the source's maximum gain setting. |
| func (s Source) MaxGain() float32 { |
| return getSourcef(s, paramMaxGain) |
| } |
| |
| // SetMaxGain sets the source's maximum gain setting. |
| func (s Source) SetMaxGain(v float32) { |
| setSourcef(s, paramMaxGain, v) |
| } |
| |
| // Position returns the position of the source. |
| func (s Source) Position() Vector { |
| v := Vector{} |
| getSourcefv(s, paramPosition, v[:]) |
| return v |
| } |
| |
| // SetPosition sets the position of the source. |
| func (s Source) SetPosition(v Vector) { |
| setSourcefv(s, paramPosition, v[:]) |
| } |
| |
| // Velocity returns the source's velocity. |
| func (s Source) Velocity() Vector { |
| v := Vector{} |
| getSourcefv(s, paramVelocity, v[:]) |
| return v |
| } |
| |
| // SetVelocity sets the source's velocity. |
| func (s Source) SetVelocity(v Vector) { |
| setSourcefv(s, paramVelocity, v[:]) |
| } |
| |
| // Orientation returns the orientation of the source. |
| func (s Source) Orientation() Orientation { |
| v := make([]float32, 6) |
| getSourcefv(s, paramOrientation, v) |
| return orientationFromSlice(v) |
| } |
| |
| // SetOrientation sets the orientation of the source. |
| func (s Source) SetOrientation(o Orientation) { |
| setSourcefv(s, paramOrientation, o.slice()) |
| } |
| |
| // State returns the playing state of the source. |
| func (s Source) State() int32 { |
| return getSourcei(s, paramSourceState) |
| } |
| |
| // BuffersQueued returns the number of the queued buffers. |
| func (s Source) BuffersQueued() int32 { |
| return getSourcei(s, paramBuffersQueued) |
| } |
| |
| // BuffersProcessed returns the number of the processed buffers. |
| func (s Source) BuffersProcessed() int32 { |
| return getSourcei(s, paramBuffersProcessed) |
| } |
| |
| // OffsetSeconds returns the current playback position of the source in seconds. |
| func (s Source) OffsetSeconds() int32 { |
| return getSourcei(s, paramSecOffset) |
| } |
| |
| // OffsetSample returns the sample offset of the current playback position. |
| func (s Source) OffsetSample() int32 { |
| return getSourcei(s, paramSampleOffset) |
| } |
| |
| // OffsetByte returns the byte offset of the current playback position. |
| func (s Source) OffsetByte() int32 { |
| return getSourcei(s, paramByteOffset) |
| } |
| |
| func getSourcei(s Source, param int) int32 { |
| return alGetSourcei(s, param) |
| } |
| |
| func getSourcef(s Source, param int) float32 { |
| return alGetSourcef(s, param) |
| } |
| |
| func getSourcefv(s Source, param int, v []float32) { |
| alGetSourcefv(s, param, v) |
| } |
| |
| func setSourcei(s Source, param int, v int32) { |
| alSourcei(s, param, v) |
| } |
| |
| func setSourcef(s Source, param int, v float32) { |
| alSourcef(s, param, v) |
| } |
| |
| func setSourcefv(s Source, param int, v []float32) { |
| alSourcefv(s, param, v) |
| } |
| |
| // QueueBuffers adds the buffers to the buffer queue. |
| func (s Source) QueueBuffers(buffers []Buffer) { |
| alSourceQueueBuffers(s, buffers) |
| } |
| |
| // UnqueueBuffers removes the specified buffers from the buffer queue. |
| func (s Source) UnqueueBuffers(buffers []Buffer) { |
| alSourceUnqueueBuffers(s, buffers) |
| } |
| |
| // ListenerGain returns the total gain applied to the final mix. |
| func ListenerGain() float32 { |
| return getListenerf(paramGain) |
| } |
| |
| // ListenerPosition returns the position of the listener. |
| func ListenerPosition() Vector { |
| v := Vector{} |
| getListenerfv(paramPosition, v[:]) |
| return v |
| } |
| |
| // ListenerVelocity returns the velocity of the listener. |
| func ListenerVelocity() Vector { |
| v := Vector{} |
| getListenerfv(paramVelocity, v[:]) |
| return v |
| } |
| |
| // ListenerOrientation returns the orientation of the listener. |
| func ListenerOrientation() Orientation { |
| v := make([]float32, 6) |
| getListenerfv(paramOrientation, v) |
| return orientationFromSlice(v) |
| } |
| |
| // SetListenerGain sets the total gain that will be applied to the final mix. |
| func SetListenerGain(v float32) { |
| setListenerf(paramGain, v) |
| } |
| |
| // SetListenerPosition sets the position of the listener. |
| func SetListenerPosition(v Vector) { |
| setListenerfv(paramPosition, v[:]) |
| } |
| |
| // SetListenerVelocity sets the velocity of the listener. |
| func SetListenerVelocity(v Vector) { |
| setListenerfv(paramVelocity, v[:]) |
| } |
| |
| // SetListenerOrientation sets the orientation of the listener. |
| func SetListenerOrientation(v Orientation) { |
| setListenerfv(paramOrientation, v.slice()) |
| } |
| |
| func getListenerf(param int) float32 { |
| return alGetListenerf(param) |
| } |
| |
| func getListenerfv(param int, v []float32) { |
| alGetListenerfv(param, v) |
| } |
| |
| func setListenerf(param int, v float32) { |
| alListenerf(param, v) |
| } |
| |
| func setListenerfv(param int, v []float32) { |
| alListenerfv(param, v) |
| } |
| |
| // A buffer represents a chunk of PCM audio data that could be buffered to an audio |
| // source. A single buffer could be shared between multiple sources. |
| type Buffer uint32 |
| |
| // GenBuffers generates n new buffers. The generated buffers should be deleted |
| // once they are no longer in use. |
| func GenBuffers(n int) []Buffer { |
| return alGenBuffers(n) |
| } |
| |
| // DeleteBuffers deletes the buffers. |
| func DeleteBuffers(buffers []Buffer) { |
| alDeleteBuffers(buffers) |
| } |
| |
| func getBufferi(b Buffer, param int) int32 { |
| return alGetBufferi(b, param) |
| } |
| |
| // Frequency returns the frequency of the buffer data in Hertz (Hz). |
| func (b Buffer) Frequency() int32 { |
| return getBufferi(b, paramFreq) |
| } |
| |
| // Bits return the number of bits used to represent a sample. |
| func (b Buffer) Bits() int32 { |
| return getBufferi(b, paramBits) |
| } |
| |
| // Channels return the number of the audio channels. |
| func (b Buffer) Channels() int32 { |
| return getBufferi(b, paramChannels) |
| } |
| |
| // Size returns the size of the data. |
| func (b Buffer) Size() int32 { |
| return getBufferi(b, paramSize) |
| } |
| |
| // BufferData buffers PCM data to the current buffer. |
| func (b Buffer) BufferData(format uint32, data []byte, freq int32) { |
| alBufferData(b, format, data, freq) |
| } |
| |
| // Valid returns true if the buffer exists and is valid. |
| func (b Buffer) Valid() bool { |
| return alIsBuffer(b) |
| } |