Initial release: RadiantWave v1.0
This commit is contained in:
+651
@@ -0,0 +1,651 @@
|
||||
package sdl
|
||||
|
||||
/*
|
||||
#include "sdl_wrapper.h"
|
||||
|
||||
#if !(SDL_VERSION_ATLEAST(2,0,4))
|
||||
|
||||
#if defined(WARN_OUTDATED)
|
||||
#pragma message("SDL_QueueAudio is not supported before SDL 2.0.4")
|
||||
#endif
|
||||
|
||||
static int SDL_QueueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 len)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
static Uint32 SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev_id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static void SDL_ClearQueuedAudio(SDL_AudioDeviceID dev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !(SDL_VERSION_ATLEAST(2,0,5))
|
||||
|
||||
#if defined(WARN_OUTDATED)
|
||||
#pragma message("SDL_DequeueAudio is not supported before SDL 2.0.5")
|
||||
#endif
|
||||
|
||||
static int SDL_DequeueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 len)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !(SDL_VERSION_ATLEAST(2,0,7))
|
||||
|
||||
struct _SDL_AudioStream;
|
||||
typedef struct _SDL_AudioStream SDL_AudioStream;
|
||||
|
||||
|
||||
#if defined(WARN_OUTDATED)
|
||||
#pragma message("SDL_NewAudioStream is not supported before SDL 2.0.7")
|
||||
#endif
|
||||
|
||||
static SDL_AudioStream * SDL_NewAudioStream(const SDL_AudioFormat src_format, const Uint8 src_channels, const int src_rate, const SDL_AudioFormat dst_format, const Uint8 dst_channels, const int dst_rate)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#if defined(WARN_OUTDATED)
|
||||
#pragma message("SDL_AudioStreamPut is not supported before SDL 2.0.7")
|
||||
#endif
|
||||
|
||||
static int SDL_AudioStreamPut(SDL_AudioStream *stream, const void *buf, int len)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#if defined(WARN_OUTDATED)
|
||||
#pragma message("SDL_AudioStreamGet is not supported before SDL 2.0.7")
|
||||
#endif
|
||||
|
||||
static int SDL_AudioStreamGet(SDL_AudioStream *stream, void *buf, int len)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#if defined(WARN_OUTDATED)
|
||||
#pragma message("SDL_AudioStreamAvailable is not supported before SDL 2.0.7")
|
||||
#endif
|
||||
|
||||
static int SDL_AudioStreamAvailable(SDL_AudioStream *stream)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#if defined(WARN_OUTDATED)
|
||||
#pragma message("SDL_AudioStreamFlush is not supported before SDL 2.0.7")
|
||||
#endif
|
||||
|
||||
static int SDL_AudioStreamFlush(SDL_AudioStream *stream)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#if defined(WARN_OUTDATED)
|
||||
#pragma message("SDL_AudioStreamClear is not supported before SDL 2.0.7")
|
||||
#endif
|
||||
|
||||
static int SDL_AudioStreamClear(SDL_AudioStream *stream)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#if defined(WARN_OUTDATED)
|
||||
#pragma message("SDL_FreeAudioStream is not supported before SDL 2.0.7")
|
||||
#endif
|
||||
|
||||
static void SDL_FreeAudioStream(SDL_AudioStream *stream)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if !(SDL_VERSION_ATLEAST(2,0,16))
|
||||
|
||||
#if defined(WARN_OUTDATED)
|
||||
#pragma message("SDL_GetAudioDeviceSpec is not supported before SDL 2.0.16")
|
||||
#endif
|
||||
|
||||
static int SDL_GetAudioDeviceSpec(int index, int iscapture, SDL_AudioSpec *spec)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
*/
|
||||
import "C"
|
||||
import (
|
||||
"reflect"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// Audio format masks.
|
||||
// (https://wiki.libsdl.org/SDL_AudioFormat)
|
||||
const (
|
||||
AUDIO_MASK_BITSIZE = C.SDL_AUDIO_MASK_BITSIZE // (0xFF)
|
||||
AUDIO_MASK_DATATYPE = C.SDL_AUDIO_MASK_DATATYPE // (1<<8)
|
||||
AUDIO_MASK_ENDIAN = C.SDL_AUDIO_MASK_ENDIAN // (1<<12)
|
||||
AUDIO_MASK_SIGNED = C.SDL_AUDIO_MASK_SIGNED // (1<<15)
|
||||
)
|
||||
|
||||
// Audio format values.
|
||||
// (https://wiki.libsdl.org/SDL_AudioFormat)
|
||||
const (
|
||||
AUDIO_S8 = C.AUDIO_S8 // signed 8-bit samples
|
||||
AUDIO_U8 = C.AUDIO_U8 // unsigned 8-bit samples
|
||||
|
||||
AUDIO_S16LSB = C.AUDIO_S16LSB // signed 16-bit samples in little-endian byte order
|
||||
AUDIO_S16MSB = C.AUDIO_S16MSB // signed 16-bit samples in big-endian byte order
|
||||
AUDIO_S16SYS = C.AUDIO_S16SYS // signed 16-bit samples in native byte order
|
||||
AUDIO_S16 = C.AUDIO_S16 // AUDIO_S16LSB
|
||||
AUDIO_U16LSB = C.AUDIO_U16LSB // unsigned 16-bit samples in little-endian byte order
|
||||
AUDIO_U16MSB = C.AUDIO_U16MSB // unsigned 16-bit samples in big-endian byte order
|
||||
AUDIO_U16SYS = C.AUDIO_U16SYS // unsigned 16-bit samples in native byte order
|
||||
AUDIO_U16 = C.AUDIO_U16 // AUDIO_U16LSB
|
||||
|
||||
AUDIO_S32LSB = C.AUDIO_S32LSB // 32-bit integer samples in little-endian byte order
|
||||
AUDIO_S32MSB = C.AUDIO_S32MSB // 32-bit integer samples in big-endian byte order
|
||||
AUDIO_S32SYS = C.AUDIO_S32SYS // 32-bit integer samples in native byte order
|
||||
AUDIO_S32 = C.AUDIO_S32 // AUDIO_S32LSB
|
||||
|
||||
AUDIO_F32LSB = C.AUDIO_F32LSB // 32-bit floating point samples in little-endian byte order
|
||||
AUDIO_F32MSB = C.AUDIO_F32MSB // 32-bit floating point samples in big-endian byte order
|
||||
AUDIO_F32SYS = C.AUDIO_F32SYS // 32-bit floating point samples in native byte order
|
||||
AUDIO_F32 = C.AUDIO_F32 // AUDIO_F32LSB
|
||||
)
|
||||
|
||||
// AllowedChanges flags specify how SDL should behave when a device cannot offer a specific feature. If the application requests a feature that the hardware doesn't offer, SDL will always try to get the closest equivalent. Used in OpenAudioDevice().
|
||||
// (https://wiki.libsdl.org/SDL_OpenAudioDevice)
|
||||
const (
|
||||
AUDIO_ALLOW_FREQUENCY_CHANGE = C.SDL_AUDIO_ALLOW_FREQUENCY_CHANGE
|
||||
AUDIO_ALLOW_FORMAT_CHANGE = C.SDL_AUDIO_ALLOW_FORMAT_CHANGE
|
||||
AUDIO_ALLOW_CHANNELS_CHANGE = C.SDL_AUDIO_ALLOW_CHANNELS_CHANGE
|
||||
AUDIO_ALLOW_ANY_CHANGE = C.SDL_AUDIO_ALLOW_ANY_CHANGE
|
||||
)
|
||||
|
||||
// An enumeration of audio device states used in GetAudioDeviceStatus() and GetAudioStatus().
|
||||
// (https://wiki.libsdl.org/SDL_AudioStatus)
|
||||
const (
|
||||
AUDIO_STOPPED AudioStatus = C.SDL_AUDIO_STOPPED // audio device is stopped
|
||||
AUDIO_PLAYING = C.SDL_AUDIO_PLAYING // audio device is playing
|
||||
AUDIO_PAUSED = C.SDL_AUDIO_PAUSED // audio device is paused
|
||||
)
|
||||
|
||||
// MIX_MAXVOLUME is the full audio volume value used in MixAudioFormat() and AudioFormat().
|
||||
// (https://wiki.libsdl.org/SDL_MixAudioFormat)
|
||||
const MIX_MAXVOLUME = C.SDL_MIX_MAXVOLUME // full audio volume
|
||||
|
||||
// AudioFormat is an enumeration of audio formats.
|
||||
// (https://wiki.libsdl.org/SDL_AudioFormat)
|
||||
type AudioFormat uint16
|
||||
|
||||
// AudioCallback is a function to call when the audio device needs more data.`
|
||||
// (https://wiki.libsdl.org/SDL_AudioSpec)
|
||||
type AudioCallback C.SDL_AudioCallback
|
||||
|
||||
// AudioFilter is the filter list used in AudioCVT() (internal use)
|
||||
// (https://wiki.libsdl.org/SDL_AudioCVT)
|
||||
type AudioFilter C.SDL_AudioFilter
|
||||
|
||||
// AudioDeviceID is ID of an audio device previously opened with OpenAudioDevice().
|
||||
// (https://wiki.libsdl.org/SDL_OpenAudioDevice)
|
||||
type AudioDeviceID uint32
|
||||
|
||||
// AudioStatus is an enumeration of audio device states.
|
||||
// (https://wiki.libsdl.org/SDL_AudioStatus)
|
||||
type AudioStatus uint32
|
||||
type cAudioStatus C.SDL_AudioStatus
|
||||
|
||||
// AudioSpec contains the audio output format. It also contains a callback that is called when the audio device needs more data.
|
||||
// (https://wiki.libsdl.org/SDL_AudioSpec)
|
||||
type AudioSpec struct {
|
||||
Freq int32 // DSP frequency (samples per second)
|
||||
Format AudioFormat // audio data format
|
||||
Channels uint8 // number of separate sound channels
|
||||
Silence uint8 // audio buffer silence value (calculated)
|
||||
Samples uint16 // audio buffer size in samples (power of 2)
|
||||
_ uint16 // padding
|
||||
Size uint32 // audio buffer size in bytes (calculated)
|
||||
Callback AudioCallback // the function to call when the audio device needs more data
|
||||
UserData unsafe.Pointer // a pointer that is passed to callback (otherwise ignored by SDL)
|
||||
}
|
||||
type cAudioSpec C.SDL_AudioSpec
|
||||
|
||||
// AudioCVT contains audio data conversion information.
|
||||
// (https://wiki.libsdl.org/SDL_AudioCVT)
|
||||
type AudioCVT struct {
|
||||
Needed int32 // set to 1 if conversion possible
|
||||
SrcFormat AudioFormat // source audio format
|
||||
DstFormat AudioFormat // target audio format
|
||||
RateIncr float64 // rate conversion increment
|
||||
Buf unsafe.Pointer // the buffer to hold entire audio data. Use AudioCVT.BufAsSlice() for access via a Go slice
|
||||
Len int32 // length of original audio buffer
|
||||
LenCVT int32 // length of converted audio buffer
|
||||
LenMult int32 // buf must be len*len_mult big
|
||||
LenRatio float64 // given len, final size is len*len_ratio
|
||||
filters [10]AudioFilter // filter list (internal use)
|
||||
filterIndex int32 // current audio conversion function (internal use)
|
||||
}
|
||||
type cAudioCVT C.SDL_AudioCVT
|
||||
|
||||
// AudioStream is a new audio conversion interface.
|
||||
// (https://wiki.libsdl.org/SDL_AudioStream)
|
||||
type AudioStream C.SDL_AudioStream
|
||||
|
||||
func (fmt AudioFormat) c() C.SDL_AudioFormat {
|
||||
return C.SDL_AudioFormat(fmt)
|
||||
}
|
||||
|
||||
func (id AudioDeviceID) c() C.SDL_AudioDeviceID {
|
||||
return C.SDL_AudioDeviceID(id)
|
||||
}
|
||||
|
||||
func (as *AudioSpec) cptr() *C.SDL_AudioSpec {
|
||||
return (*C.SDL_AudioSpec)(unsafe.Pointer(as))
|
||||
}
|
||||
|
||||
func (cvt *AudioCVT) cptr() *C.SDL_AudioCVT {
|
||||
return (*C.SDL_AudioCVT)(unsafe.Pointer(cvt))
|
||||
}
|
||||
|
||||
func (stream *AudioStream) cptr() *C.SDL_AudioStream {
|
||||
return (*C.SDL_AudioStream)(unsafe.Pointer(stream))
|
||||
}
|
||||
|
||||
// BitSize returns audio formats bit size.
|
||||
// (https://wiki.libsdl.org/SDL_AudioFormat)
|
||||
func (fmt AudioFormat) BitSize() uint8 {
|
||||
return uint8(fmt & AUDIO_MASK_BITSIZE)
|
||||
}
|
||||
|
||||
// IsFloat reports whether audio format is float.
|
||||
// (https://wiki.libsdl.org/SDL_AudioFormat)
|
||||
func (fmt AudioFormat) IsFloat() bool {
|
||||
return (fmt & AUDIO_MASK_DATATYPE) > 0
|
||||
}
|
||||
|
||||
// IsBigEndian reports whether audio format is big-endian.
|
||||
// (https://wiki.libsdl.org/SDL_AudioFormat)
|
||||
func (fmt AudioFormat) IsBigEndian() bool {
|
||||
return (fmt & AUDIO_MASK_ENDIAN) > 0
|
||||
}
|
||||
|
||||
// IsSigned reports whether audio format is signed.
|
||||
// (https://wiki.libsdl.org/SDL_AudioFormat)
|
||||
func (fmt AudioFormat) IsSigned() bool {
|
||||
return (fmt & AUDIO_MASK_SIGNED) > 0
|
||||
}
|
||||
|
||||
// IsInt reports whether audio format is integer.
|
||||
// (https://wiki.libsdl.org/SDL_AudioFormat)
|
||||
func (fmt AudioFormat) IsInt() bool {
|
||||
return !fmt.IsFloat()
|
||||
}
|
||||
|
||||
// IsLittleEndian reports whether audio format is little-endian.
|
||||
// (https://wiki.libsdl.org/SDL_AudioFormat)
|
||||
func (fmt AudioFormat) IsLittleEndian() bool {
|
||||
return !fmt.IsBigEndian()
|
||||
}
|
||||
|
||||
// IsUnsigned reports whether audio format is unsigned.
|
||||
// (https://wiki.libsdl.org/SDL_AudioFormat)
|
||||
func (fmt AudioFormat) IsUnsigned() bool {
|
||||
return !fmt.IsSigned()
|
||||
}
|
||||
|
||||
// AllocBuf allocates the requested memory for AudioCVT buffer.
|
||||
func (cvt *AudioCVT) AllocBuf(size uintptr) {
|
||||
cvt.Buf = C.malloc(C.size_t(size))
|
||||
}
|
||||
|
||||
// FreeBuf deallocates the memory previously allocated from AudioCVT buffer.
|
||||
func (cvt *AudioCVT) FreeBuf() {
|
||||
C.free(cvt.Buf)
|
||||
}
|
||||
|
||||
// BufAsSlice returns AudioCVT.buf as byte slice.
|
||||
// NOTE: Must be used after ConvertAudio() because it uses LenCVT as slice length.
|
||||
func (cvt AudioCVT) BufAsSlice() []byte {
|
||||
var b []byte
|
||||
sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b))
|
||||
sliceHeader.Len = int(cvt.LenCVT)
|
||||
sliceHeader.Cap = int(cvt.Len * cvt.LenMult)
|
||||
sliceHeader.Data = uintptr(unsafe.Pointer(cvt.Buf))
|
||||
return b
|
||||
}
|
||||
|
||||
// GetNumAudioDrivers returns the number of built-in audio drivers.
|
||||
// (https://wiki.libsdl.org/SDL_GetNumAudioDrivers)
|
||||
func GetNumAudioDrivers() int {
|
||||
return int(C.SDL_GetNumAudioDrivers())
|
||||
}
|
||||
|
||||
// GetAudioDriver returns the name of a built in audio driver.
|
||||
// (https://wiki.libsdl.org/SDL_GetAudioDriver)
|
||||
func GetAudioDriver(index int) string {
|
||||
return string(C.GoString(C.SDL_GetAudioDriver(C.int(index))))
|
||||
}
|
||||
|
||||
// AudioInit initializes a particular audio driver.
|
||||
// (https://wiki.libsdl.org/SDL_AudioInit)
|
||||
func AudioInit(driverName string) error {
|
||||
_driverName := C.CString(driverName)
|
||||
defer C.free(unsafe.Pointer(_driverName))
|
||||
if C.SDL_AudioInit(_driverName) != 0 {
|
||||
return GetError()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// AudioQuit shuts down audio if you initialized it with AudioInit().
|
||||
// (https://wiki.libsdl.org/SDL_AudioQuit)
|
||||
func AudioQuit() {
|
||||
C.SDL_AudioQuit()
|
||||
}
|
||||
|
||||
// GetCurrentAudioDriver returns the name of the current audio driver.
|
||||
// (https://wiki.libsdl.org/SDL_GetCurrentAudioDriver)
|
||||
func GetCurrentAudioDriver() string {
|
||||
return string(C.GoString(C.SDL_GetCurrentAudioDriver()))
|
||||
}
|
||||
|
||||
// OpenAudio opens the audio device. New programs might want to use OpenAudioDevice() instead.
|
||||
// (https://wiki.libsdl.org/SDL_OpenAudio)
|
||||
func OpenAudio(desired, obtained *AudioSpec) error {
|
||||
if C.SDL_OpenAudio(desired.cptr(), obtained.cptr()) != 0 {
|
||||
return GetError()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetNumAudioDevices returns the number of built-in audio devices.
|
||||
// (https://wiki.libsdl.org/SDL_GetNumAudioDevices)
|
||||
func GetNumAudioDevices(isCapture bool) int {
|
||||
return int(C.SDL_GetNumAudioDevices(C.int(Btoi(isCapture))))
|
||||
}
|
||||
|
||||
// GetAudioDeviceName returns the name of a specific audio device.
|
||||
// (https://wiki.libsdl.org/SDL_GetAudioDeviceName)
|
||||
func GetAudioDeviceName(index int, isCapture bool) string {
|
||||
return string(C.GoString(C.SDL_GetAudioDeviceName(C.int(index), C.int(Btoi(isCapture)))))
|
||||
}
|
||||
|
||||
// OpenAudioDevice opens a specific audio device.
|
||||
// (https://wiki.libsdl.org/SDL_OpenAudioDevice)
|
||||
func OpenAudioDevice(device string, isCapture bool, desired, obtained *AudioSpec, allowedChanges int) (AudioDeviceID, error) {
|
||||
_device := C.CString(device)
|
||||
if device == "" {
|
||||
_device = nil
|
||||
}
|
||||
defer C.free(unsafe.Pointer(_device))
|
||||
if id := AudioDeviceID(C.SDL_OpenAudioDevice(_device, C.int(Btoi(isCapture)), desired.cptr(), obtained.cptr(), C.int(allowedChanges))); id > 0 {
|
||||
return id, nil
|
||||
}
|
||||
return 0, GetError()
|
||||
}
|
||||
|
||||
// GetAudioStatus returns the current audio state of the audio device. New programs might want to use GetAudioDeviceStatus() instead.
|
||||
// (https://wiki.libsdl.org/SDL_GetAudioStatus)
|
||||
func GetAudioStatus() AudioStatus {
|
||||
return (AudioStatus)(C.SDL_GetAudioStatus())
|
||||
}
|
||||
|
||||
// GetAudioDeviceStatus returns the current audio state of an audio device.
|
||||
// (https://wiki.libsdl.org/SDL_GetAudioDeviceStatus)
|
||||
func GetAudioDeviceStatus(dev AudioDeviceID) AudioStatus {
|
||||
return (AudioStatus)(C.SDL_GetAudioDeviceStatus(dev.c()))
|
||||
}
|
||||
|
||||
// PauseAudio pauses and unpauses the audio device. New programs might want to use SDL_PauseAudioDevice() instead.
|
||||
// (https://wiki.libsdl.org/SDL_PauseAudio)
|
||||
func PauseAudio(pauseOn bool) {
|
||||
C.SDL_PauseAudio(C.int(Btoi(pauseOn)))
|
||||
}
|
||||
|
||||
// PauseAudioDevice pauses and unpauses audio playback on a specified device.
|
||||
// (https://wiki.libsdl.org/SDL_PauseAudioDevice)
|
||||
func PauseAudioDevice(dev AudioDeviceID, pauseOn bool) {
|
||||
C.SDL_PauseAudioDevice(dev.c(), C.int(Btoi(pauseOn)))
|
||||
}
|
||||
|
||||
// LoadWAVRW loads a WAVE from the data source, automatically freeing that source if freeSrc is true.
|
||||
// (https://wiki.libsdl.org/SDL_LoadWAV_RW)
|
||||
func LoadWAVRW(src *RWops, freeSrc bool) ([]byte, *AudioSpec) {
|
||||
var _audioBuf *C.Uint8
|
||||
var _audioLen C.Uint32
|
||||
audioSpec := (*AudioSpec)(unsafe.Pointer(C.SDL_LoadWAV_RW(src.cptr(), C.int(Btoi(freeSrc)), (&AudioSpec{}).cptr(), &_audioBuf, &_audioLen)))
|
||||
|
||||
var b []byte
|
||||
sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b))
|
||||
sliceHeader.Len = (int)(_audioLen)
|
||||
sliceHeader.Cap = (int)(_audioLen)
|
||||
sliceHeader.Data = uintptr(unsafe.Pointer(_audioBuf))
|
||||
return b, audioSpec
|
||||
}
|
||||
|
||||
// LoadWAV loads a WAVE from a file.
|
||||
// (https://wiki.libsdl.org/SDL_LoadWAV)
|
||||
func LoadWAV(file string) ([]byte, *AudioSpec) {
|
||||
_file := C.CString(file)
|
||||
_rb := C.CString("rb")
|
||||
defer C.free(unsafe.Pointer(_file))
|
||||
defer C.free(unsafe.Pointer(_rb))
|
||||
|
||||
var _audioBuf *C.Uint8
|
||||
var _audioLen C.Uint32
|
||||
audioSpec := (*AudioSpec)(unsafe.Pointer(C.SDL_LoadWAV_RW(C.SDL_RWFromFile(_file, _rb), 1, (&AudioSpec{}).cptr(), &_audioBuf, &_audioLen)))
|
||||
|
||||
var b []byte
|
||||
sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b))
|
||||
sliceHeader.Len = (int)(_audioLen)
|
||||
sliceHeader.Cap = (int)(_audioLen)
|
||||
sliceHeader.Data = uintptr(unsafe.Pointer(_audioBuf))
|
||||
return b, audioSpec
|
||||
}
|
||||
|
||||
// FreeWAV frees data previously allocated with LoadWAV() or LoadWAVRW().
|
||||
// (https://wiki.libsdl.org/SDL_FreeWAV)
|
||||
func FreeWAV(audioBuf []uint8) {
|
||||
sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&audioBuf))
|
||||
_audioBuf := (*C.Uint8)(unsafe.Pointer(sliceHeader.Data))
|
||||
C.SDL_FreeWAV(_audioBuf)
|
||||
}
|
||||
|
||||
// BuildAudioCVT initializes an AudioCVT structure for conversion.
|
||||
// (https://wiki.libsdl.org/SDL_BuildAudioCVT)
|
||||
func BuildAudioCVT(cvt *AudioCVT, srcFormat AudioFormat, srcChannels uint8, srcRate int, dstFormat AudioFormat, dstChannels uint8, dstRate int) (converted bool, err error) {
|
||||
switch int(C.SDL_BuildAudioCVT(cvt.cptr(), srcFormat.c(), C.Uint8(srcChannels), C.int(srcRate), dstFormat.c(), C.Uint8(dstChannels), C.int(dstRate))) {
|
||||
case 1:
|
||||
return true, nil
|
||||
case 0:
|
||||
return false, nil
|
||||
}
|
||||
return false, GetError()
|
||||
}
|
||||
|
||||
// ConvertAudio converts audio data to a desired audio format.
|
||||
// (https://wiki.libsdl.org/SDL_ConvertAudio)
|
||||
func ConvertAudio(cvt *AudioCVT) error {
|
||||
_cvt := (*C.SDL_AudioCVT)(unsafe.Pointer(cvt))
|
||||
if C.SDL_ConvertAudio(_cvt) != 0 {
|
||||
return GetError()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// QueueAudio queues more audio on non-callback devices.
|
||||
// (https://wiki.libsdl.org/SDL_QueueAudio)
|
||||
func QueueAudio(dev AudioDeviceID, data []byte) error {
|
||||
sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&data))
|
||||
_data := unsafe.Pointer(sliceHeader.Data)
|
||||
_len := (C.Uint32)(sliceHeader.Len)
|
||||
if C.SDL_QueueAudio(dev.c(), _data, _len) != 0 {
|
||||
return GetError()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DequeueAudio dequeues more audio on non-callback devices. Returns the number of bytes dequeued, which could be less than requested
|
||||
// (https://wiki.libsdl.org/SDL_DequeueAudio)
|
||||
func DequeueAudio(dev AudioDeviceID, data []byte) (n int, err error) {
|
||||
sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&data))
|
||||
_data := unsafe.Pointer(sliceHeader.Data)
|
||||
_len := (C.Uint32)(sliceHeader.Len)
|
||||
if dequeued := int(C.SDL_DequeueAudio(dev.c(), _data, _len)); dequeued > 0 {
|
||||
return dequeued, nil
|
||||
}
|
||||
return 0, GetError()
|
||||
}
|
||||
|
||||
// GetQueuedAudioSize returns the number of bytes of still-queued audio.
|
||||
// (https://wiki.libsdl.org/SDL_GetQueuedAudioSize)
|
||||
func GetQueuedAudioSize(dev AudioDeviceID) uint32 {
|
||||
return uint32(C.SDL_GetQueuedAudioSize(dev.c()))
|
||||
}
|
||||
|
||||
// ClearQueuedAudio drops any queued audio data waiting to be sent to the hardware.
|
||||
// (https://wiki.libsdl.org/SDL_ClearQueuedAudio)
|
||||
func ClearQueuedAudio(dev AudioDeviceID) {
|
||||
C.SDL_ClearQueuedAudio(dev.c())
|
||||
}
|
||||
|
||||
// MixAudio mixes audio data. New programs might want to use MixAudioFormat() instead.
|
||||
// (https://wiki.libsdl.org/SDL_MixAudio)
|
||||
func MixAudio(dst, src *uint8, len uint32, volume int) {
|
||||
_dst := (*C.Uint8)(unsafe.Pointer(dst))
|
||||
_src := (*C.Uint8)(unsafe.Pointer(src))
|
||||
C.SDL_MixAudio(_dst, _src, C.Uint32(len), C.int(volume))
|
||||
}
|
||||
|
||||
// MixAudioFormat mixes audio data in a specified format.
|
||||
// (https://wiki.libsdl.org/SDL_MixAudioFormat)
|
||||
func MixAudioFormat(dst, src *uint8, format AudioFormat, len uint32, volume int) {
|
||||
_dst := (*C.Uint8)(unsafe.Pointer(dst))
|
||||
_src := (*C.Uint8)(unsafe.Pointer(src))
|
||||
C.SDL_MixAudioFormat(_dst, _src, format.c(), C.Uint32(len), C.int(volume))
|
||||
}
|
||||
|
||||
// LockAudio locks the audio device. New programs might want to use LockAudioDevice() instead.
|
||||
// (https://wiki.libsdl.org/SDL_LockAudio)
|
||||
func LockAudio() {
|
||||
C.SDL_LockAudio()
|
||||
}
|
||||
|
||||
// LockAudioDevice locks out the audio callback function for a specified device.
|
||||
// (https://wiki.libsdl.org/SDL_LockAudioDevice)
|
||||
func LockAudioDevice(dev AudioDeviceID) {
|
||||
C.SDL_LockAudioDevice(dev.c())
|
||||
}
|
||||
|
||||
// UnlockAudio unlocks the audio device. New programs might want to use UnlockAudioDevice() instead.
|
||||
// (https://wiki.libsdl.org/SDL_UnlockAudio)
|
||||
func UnlockAudio() {
|
||||
C.SDL_UnlockAudio()
|
||||
}
|
||||
|
||||
// UnlockAudioDevice unlocks the audio callback function for a specified device.
|
||||
// (https://wiki.libsdl.org/SDL_UnlockAudioDevice)
|
||||
func UnlockAudioDevice(dev AudioDeviceID) {
|
||||
C.SDL_UnlockAudioDevice(dev.c())
|
||||
}
|
||||
|
||||
// CloseAudio closes the audio device. New programs might want to use CloseAudioDevice() instead.
|
||||
// (https://wiki.libsdl.org/SDL_CloseAudio)
|
||||
func CloseAudio() {
|
||||
C.SDL_CloseAudio()
|
||||
}
|
||||
|
||||
// CloseAudioDevice shuts down audio processing and closes the audio device.
|
||||
// (https://wiki.libsdl.org/SDL_CloseAudioDevice)
|
||||
func CloseAudioDevice(dev AudioDeviceID) {
|
||||
C.SDL_CloseAudioDevice(dev.c())
|
||||
}
|
||||
|
||||
// NewAudioStream creates a new audio stream
|
||||
// TODO: (https://wiki.libsdl.org/SDL_NewAudioStream)
|
||||
func NewAudioStream(srcFormat AudioFormat, srcChannels uint8, srcRate int, dstFormat AudioFormat, dstChannels uint8, dstRate int) (stream *AudioStream, err error) {
|
||||
_srcFormat := C.SDL_AudioFormat(srcFormat)
|
||||
_srcChannels := C.Uint8(srcChannels)
|
||||
_srcRate := C.int(srcRate)
|
||||
_dstFormat := C.SDL_AudioFormat(dstFormat)
|
||||
_dstChannels := C.Uint8(dstChannels)
|
||||
_dstRate := C.int(dstRate)
|
||||
|
||||
stream = (*AudioStream)(C.SDL_NewAudioStream(_srcFormat, _srcChannels, _srcRate, _dstFormat, _dstChannels, _dstRate))
|
||||
if stream == nil {
|
||||
err = GetError()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Put adds data to be converted/resampled to the stream
|
||||
// TODO: (https://wiki.libsdl.org/SDL_AudioStreamPut)
|
||||
func (stream *AudioStream) Put(buf []byte) (err error) {
|
||||
sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
|
||||
_buf := unsafe.Pointer(sliceHeader.Data)
|
||||
_len := C.int(len(buf))
|
||||
ret := int(C.SDL_AudioStreamPut(stream.cptr(), _buf, _len))
|
||||
err = errorFromInt(ret)
|
||||
return
|
||||
}
|
||||
|
||||
// Get gets converted/resampled data from the stream. Returns the number of bytes read from the stream.
|
||||
// (https://wiki.libsdl.org/SDL_AudioStreamGet)
|
||||
func (stream *AudioStream) Get(buf []byte) (n int, err error) {
|
||||
sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
|
||||
_buf := unsafe.Pointer(sliceHeader.Data)
|
||||
_len := C.int(len(buf))
|
||||
if ret := int(C.SDL_AudioStreamGet(stream.cptr(), _buf, _len)); ret < 0 {
|
||||
return 0, errorFromInt(ret)
|
||||
} else {
|
||||
return ret, nil
|
||||
}
|
||||
}
|
||||
|
||||
// Available gets the number of converted/resampled bytes available
|
||||
// (https://wiki.libsdl.org/SDL_AudioStreamAvailable)
|
||||
func (stream *AudioStream) Available() (n int) {
|
||||
n = int(C.SDL_AudioStreamAvailable(stream.cptr()))
|
||||
return
|
||||
}
|
||||
|
||||
// Flush tells the stream that you're done sending data, and anything being buffered
|
||||
// should be converted/resampled and made available immediately.
|
||||
// TODO: (https://wiki.libsdl.org/SDL_AudioStreamFlush)
|
||||
func (stream *AudioStream) Flush() (err error) {
|
||||
ret := int(C.SDL_AudioStreamFlush(stream.cptr()))
|
||||
err = errorFromInt(ret)
|
||||
return
|
||||
}
|
||||
|
||||
// Clear clears any pending data in the stream without converting it
|
||||
// TODO: (https://wiki.libsdl.org/SDL_AudioStreamClear)
|
||||
func (stream *AudioStream) Clear() {
|
||||
C.SDL_AudioStreamClear(stream.cptr())
|
||||
}
|
||||
|
||||
// Free frees the audio stream
|
||||
// TODO: (https://wiki.libsdl.org/SDL_AudoiStreamFree)
|
||||
func (stream *AudioStream) Free() {
|
||||
C.SDL_FreeAudioStream(stream.cptr())
|
||||
}
|
||||
|
||||
// GetAudioDeviceSpec returns the preferred audio format of a specific audio device.
|
||||
// (https://wiki.libsdl.org/SDL_GetAudioDeviceSpec)
|
||||
func GetAudioDeviceSpec(index int, isCapture bool) (spec *AudioSpec, err error) {
|
||||
spec = &AudioSpec{}
|
||||
err = errorFromInt(int(C.SDL_GetAudioDeviceSpec(C.int(index), C.int(Btoi(isCapture)), spec.cptr())))
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user