func OpenAudio(desired, obtained_orNil *AudioSpec) int { if alreadyOpened { panic("more than 1 audio stream currently not supported") } // copy handle to user-defined callback function, if defined // it is perfectly supported to not specify the callback function // in that case you will use default SendAudio semantics // note that if you specify a callback and use SendAudio, a hangup will instead happen // when calling SendAudio if nil != desired.UserDefinedCallback { userDefinedCallback = desired.UserDefinedCallback } else { // default playback (16-bit signed) userDefinedCallback = DownstreamPlaybackS16 PlayLoop = make(chan AudioEvent) } var C_desired, C_obtained *C.SDL_AudioSpec C_desired = new(C.SDL_AudioSpec) C_desired.freq = C.int(desired.Freq) C_desired.format = C.Uint16(desired.Format) C_desired.channels = C.Uint8(desired.Channels) C_desired.samples = C.Uint16(desired.Samples) // there is an unique C callback acting as proxy to the different Go callbacks // see streamContext() C_desired.callback = C.callback_getCallback() if obtained_orNil != nil { if desired != obtained_orNil { C_obtained = new(C.SDL_AudioSpec) } else { C_obtained = C_desired } } status := C.SDL_OpenAudio(C_desired, C_obtained) if status == 0 { alreadyOpened = true } if obtained_orNil != nil { obtained := obtained_orNil obtained.Freq = int(C_obtained.freq) obtained.Format = uint16(C_obtained.format) obtained.Channels = uint8(C_obtained.channels) obtained.Samples = uint16(C_obtained.samples) obtained.Out_Silence = uint8(C_obtained.silence) obtained.Out_Size = uint32(C_obtained.size) } return int(status) }
func Init() { if ok := C.SDL_InitSubSystem(C.SDL_INIT_AUDIO); ok < 0 { panic(ok) } var want C.SDL_AudioSpec want.freq = 48000 want.format = C.AUDIO_S16 want.channels = 2 want.callback = (C.SDL_AudioCallback)(unsafe.Pointer(C.audio_callback_go_cgo)) var have C.SDL_AudioSpec if dev = C.SDL_OpenAudioDevice(nil, 0, &want, &have, 0); dev == 0 { panic("dev=0") } }
func OpenAudio(desired, obtained *AudioSpec, callback func(*byte, int)) bool { var cdesired C.SDL_AudioSpec var cobtained C.SDL_AudioSpec cdesired.freq = C.int(desired.Freq) cdesired.format = C.SDL_AudioFormat(int(desired.Format)) cdesired.channels = C.Uint8(desired.Channels) cdesired.samples = C.Uint16(desired.Samples) cdesired.size = C.Uint32(0) cdesired.callback = C.go_sdl2_get_callback() cdesired.userdata = unsafe.Pointer(&callback) ret := C.SDL_OpenAudio(&cdesired, &cobtained) if obtained != nil { obtained.Freq = int32(cobtained.freq) obtained.Format = AudioFormat(int(cobtained.format)) obtained.Channels = uint8(cobtained.channels) obtained.Silence = uint8(cobtained.silence) obtained.Samples = uint16(cobtained.samples) obtained.Size = uint32(cobtained.size) } return int(ret) == 0 }
func OpenAudio(desired, obtained_orNil *AudioSpec) int { var C_desired, C_obtained *C.SDL_AudioSpec C_desired = new(C.SDL_AudioSpec) C_desired.freq = C.int(desired.Freq) C_desired.format = C.Uint16(desired.Format) C_desired.channels = C.Uint8(desired.Channels) C_desired.samples = C.Uint16(desired.Samples) C_desired.callback = C.callback_getCallback() if obtained_orNil != nil { if desired != obtained_orNil { C_obtained = new(C.SDL_AudioSpec) } else { C_obtained = C_desired } } status := C.SDL_OpenAudio(C_desired, C_obtained) if status == 0 { mutex.Lock() opened++ mutex.Unlock() } if obtained_orNil != nil { obtained := obtained_orNil obtained.Freq = int(C_obtained.freq) obtained.Format = uint16(C_obtained.format) obtained.Channels = uint8(C_obtained.channels) obtained.Samples = uint16(C_obtained.samples) obtained.Out_Silence = uint8(C_obtained.silence) obtained.Out_Size = uint32(C_obtained.size) } return int(status) }
func OpenAudioDevice(device string, iscapture bool, desired, obtained *AudioSpec, allowed_changes bool, callback func(*byte, int)) bool { var cdesired C.SDL_AudioSpec var cobtained C.SDL_AudioSpec cdevice := C.CString(device) defer C.free(unsafe.Pointer(cdevice)) cdesired.freq = C.int(desired.Freq) cdesired.format = C.SDL_AudioFormat(int(desired.Format)) cdesired.channels = C.Uint8(desired.Channels) cdesired.samples = C.Uint16(desired.Samples) cdesired.size = C.Uint32(0) cdesired.callback = C.go_sdl2_get_callback() cdesired.userdata = unsafe.Pointer(&callback) ret := C.SDL_OpenAudioDevice(cdevice, C.int(bool2int(iscapture)), &cdesired, &cobtained, C.int(bool2int(allowed_changes))) if obtained != nil { obtained.Freq = int32(cobtained.freq) obtained.Format = AudioFormat(int(cobtained.format)) obtained.Channels = uint8(cobtained.channels) obtained.Silence = uint8(cobtained.silence) obtained.Samples = uint16(cobtained.samples) obtained.Size = uint32(cobtained.size) } return int(ret) == 0 }