Added support for audio recording.
Added unhandled event handler.
This commit is contained in:
parent
06a38d8e4a
commit
4ae1db7969
37
allg5/audio.go
Normal file
37
allg5/audio.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package allg5
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define ALLEGRO_KCM_AUDIO_SRC
|
||||||
|
|
||||||
|
#include <allegro5/allegro_audio.h>
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
type Recorder struct {
|
||||||
|
recorder *C.ALLEGRO_AUDIO_RECORDER
|
||||||
|
Frequency int
|
||||||
|
Depth int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRecorder(fragments, samples, frequency, depth int) *Recorder {
|
||||||
|
var depthC C.ALLEGRO_AUDIO_DEPTH
|
||||||
|
switch depth {
|
||||||
|
case 16:
|
||||||
|
depthC = C.ALLEGRO_AUDIO_DEPTH_INT16
|
||||||
|
default:
|
||||||
|
depthC = C.ALLEGRO_AUDIO_DEPTH_UINT8
|
||||||
|
}
|
||||||
|
var rec = C.al_create_audio_recorder(C.size_t(fragments), C.uint(samples), C.uint(frequency), depthC, C.ALLEGRO_CHANNEL_CONF_1)
|
||||||
|
if rec == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &Recorder{rec, frequency, depth}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Recorder) Start() {
|
||||||
|
C.al_start_audio_recorder(r.recorder)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Recorder) Destroy() {
|
||||||
|
C.al_destroy_audio_recorder(r.recorder)
|
||||||
|
}
|
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
package allg5
|
package allg5
|
||||||
|
|
||||||
// #cgo pkg-config: allegro-5 allegro_font-5 allegro_image-5 allegro_primitives-5 allegro_ttf-5
|
// #cgo pkg-config: allegro-5 allegro_audio-5 allegro_font-5 allegro_image-5 allegro_primitives-5 allegro_ttf-5
|
||||||
import "C"
|
import "C"
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
package allg5
|
package allg5
|
||||||
|
|
||||||
// #cgo LDFLAGS: -lallegro -lallegro_font -lallegro_image -lallegro_primitives -lallegro_ttf
|
// #cgo LDFLAGS: -lallegro -lallegro_audio -lallegro_font -lallegro_image -lallegro_primitives -lallegro_ttf
|
||||||
import "C"
|
import "C"
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package allg5
|
package allg5
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
#define ALLEGRO_KCM_AUDIO_SRC
|
||||||
|
|
||||||
#include <allegro5/allegro.h>
|
#include <allegro5/allegro.h>
|
||||||
|
#include <allegro5/allegro_audio.h>
|
||||||
|
|
||||||
#define USER_EVENT_TYPE ALLEGRO_GET_EVENT_TYPE('u', 's', 'e', 'r')
|
#define USER_EVENT_TYPE ALLEGRO_GET_EVENT_TYPE('u', 's', 'e', 'r')
|
||||||
|
|
||||||
@ -133,6 +136,12 @@ type MouseMoveEvent struct {
|
|||||||
Pressure float32
|
Pressure float32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RecorderFragmentEvent struct {
|
||||||
|
EventBase
|
||||||
|
Buffer unsafe.Pointer
|
||||||
|
Samples int
|
||||||
|
}
|
||||||
|
|
||||||
type UserEvent struct {
|
type UserEvent struct {
|
||||||
EventBase
|
EventBase
|
||||||
}
|
}
|
||||||
@ -165,6 +174,10 @@ func (eq *EventQueue) RegisterKeyboard() {
|
|||||||
eq.register(C.al_get_keyboard_event_source())
|
eq.register(C.al_get_keyboard_event_source())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (eq *EventQueue) RegisterRecorder(rec *Recorder) {
|
||||||
|
eq.register(C.al_get_audio_recorder_event_source(rec.recorder))
|
||||||
|
}
|
||||||
|
|
||||||
func (eq *EventQueue) RegisterUserEvents(source *UserEventSource) {
|
func (eq *EventQueue) RegisterUserEvents(source *UserEventSource) {
|
||||||
eq.register(source.source)
|
eq.register(source.source)
|
||||||
}
|
}
|
||||||
@ -173,6 +186,9 @@ func (eq *EventQueue) mapEvent(e *C.ALLEGRO_EVENT) Event {
|
|||||||
any := (*C.ALLEGRO_ANY_EVENT)(unsafe.Pointer(e))
|
any := (*C.ALLEGRO_ANY_EVENT)(unsafe.Pointer(e))
|
||||||
eb := EventBase{float64(any.timestamp)}
|
eb := EventBase{float64(any.timestamp)}
|
||||||
switch any._type {
|
switch any._type {
|
||||||
|
case C.ALLEGRO_EVENT_AUDIO_RECORDER_FRAGMENT:
|
||||||
|
recorder := (*C.ALLEGRO_AUDIO_RECORDER_EVENT)(unsafe.Pointer(e))
|
||||||
|
return &RecorderFragmentEvent{eb, unsafe.Pointer(recorder.buffer), int(recorder.samples)}
|
||||||
case C.ALLEGRO_EVENT_DISPLAY_CLOSE:
|
case C.ALLEGRO_EVENT_DISPLAY_CLOSE:
|
||||||
return &DisplayCloseEvent{eb}
|
return &DisplayCloseEvent{eb}
|
||||||
case C.ALLEGRO_EVENT_DISPLAY_ORIENTATION:
|
case C.ALLEGRO_EVENT_DISPLAY_ORIENTATION:
|
||||||
|
@ -1,13 +1,19 @@
|
|||||||
package allg5
|
package allg5
|
||||||
|
|
||||||
// #include <allegro5/allegro.h>
|
/*
|
||||||
// #include <allegro5/allegro_font.h>
|
#define ALLEGRO_KCM_AUDIO_SRC
|
||||||
// #include <allegro5/allegro_image.h>
|
|
||||||
// #include <allegro5/allegro_primitives.h>
|
#include <allegro5/allegro.h>
|
||||||
// #include <allegro5/allegro_ttf.h>
|
#include <allegro5/allegro_audio.h>
|
||||||
// bool init() {
|
#include <allegro5/allegro_font.h>
|
||||||
// return al_init();
|
#include <allegro5/allegro_image.h>
|
||||||
// }
|
#include <allegro5/allegro_primitives.h>
|
||||||
|
#include <allegro5/allegro_ttf.h>
|
||||||
|
|
||||||
|
bool init() {
|
||||||
|
return al_init();
|
||||||
|
}
|
||||||
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -20,6 +26,7 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type InitConfig struct {
|
type InitConfig struct {
|
||||||
|
Audio bool
|
||||||
Font bool
|
Font bool
|
||||||
Image bool
|
Image bool
|
||||||
Primitives bool
|
Primitives bool
|
||||||
@ -27,13 +34,16 @@ type InitConfig struct {
|
|||||||
Mouse bool
|
Mouse bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var InitAll = InitConfig{true, true, true, true, true}
|
var InitAll = InitConfig{true, true, true, true, true, true}
|
||||||
|
|
||||||
// Init initializes the Allegro system
|
// Init initializes the Allegro system
|
||||||
func Init(config InitConfig) error {
|
func Init(config InitConfig) error {
|
||||||
if !bool(C.init()) {
|
if !bool(C.init()) {
|
||||||
return errors.New("failed to initialize Allegro")
|
return errors.New("failed to initialize Allegro")
|
||||||
}
|
}
|
||||||
|
if config.Audio && !bool(C.al_install_audio()) {
|
||||||
|
return errors.New("failed to initialize audio addon")
|
||||||
|
}
|
||||||
if config.Font && !bool(C.al_init_font_addon()) {
|
if config.Font && !bool(C.al_init_font_addon()) {
|
||||||
return errors.New("failed to initialize font addon")
|
return errors.New("failed to initialize font addon")
|
||||||
}
|
}
|
||||||
|
@ -34,13 +34,14 @@ func NewRenderer(w, h int, opts allg5.NewDisplayOptions) (*Renderer, error) {
|
|||||||
eq.RegisterDisplay(disp)
|
eq.RegisterDisplay(disp)
|
||||||
eq.RegisterUserEvents(user)
|
eq.RegisterUserEvents(user)
|
||||||
|
|
||||||
return &Renderer{disp, eq, map[string]*font{}, user, ui.MouseCursorDefault, ui.MouseCursorDefault}, nil
|
return &Renderer{disp, eq, nil, map[string]*font{}, user, ui.MouseCursorDefault, ui.MouseCursorDefault}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Renderer implements ui.Renderer using Allegro 5.
|
// Renderer implements ui.Renderer using Allegro 5.
|
||||||
type Renderer struct {
|
type Renderer struct {
|
||||||
disp *allg5.Display
|
disp *allg5.Display
|
||||||
eq *allg5.EventQueue
|
eq *allg5.EventQueue
|
||||||
|
unh func(allg5.Event)
|
||||||
ft map[string]*font
|
ft map[string]*font
|
||||||
user *allg5.UserEventSource
|
user *allg5.UserEventSource
|
||||||
cursor ui.MouseCursor
|
cursor ui.MouseCursor
|
||||||
@ -77,6 +78,10 @@ func (r *Renderer) PushEvents(t ui.EventTarget, wait bool) {
|
|||||||
t.Handle(&ui.MouseMoveEvent{MouseEvent: mouseEvent(e.MouseEvent), MouseWheel: float32(e.DeltaZ)})
|
t.Handle(&ui.MouseMoveEvent{MouseEvent: mouseEvent(e.MouseEvent), MouseWheel: float32(e.DeltaZ)})
|
||||||
case *allg5.UserEvent:
|
case *allg5.UserEvent:
|
||||||
t.Handle(&ui.RefreshEvent{EventBase: eventBase(e)})
|
t.Handle(&ui.RefreshEvent{EventBase: eventBase(e)})
|
||||||
|
default:
|
||||||
|
if r.unh != nil {
|
||||||
|
r.unh(e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ev = r.eq.Get()
|
ev = r.eq.Get()
|
||||||
}
|
}
|
||||||
@ -98,6 +103,10 @@ func (r *Renderer) PushEvents(t ui.EventTarget, wait bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Renderer) RegisterRecorder(rec *allg5.Recorder) {
|
||||||
|
r.eq.RegisterRecorder(rec)
|
||||||
|
}
|
||||||
|
|
||||||
func (r *Renderer) Refresh() {
|
func (r *Renderer) Refresh() {
|
||||||
r.user.EmitEvent()
|
r.user.EmitEvent()
|
||||||
}
|
}
|
||||||
@ -238,6 +247,10 @@ func (r *Renderer) SetMouseCursor(c ui.MouseCursor) {
|
|||||||
r.newCursor = c
|
r.newCursor = c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Renderer) SetUnhandledEventHandler(handler func(allg5.Event)) {
|
||||||
|
r.unh = handler
|
||||||
|
}
|
||||||
|
|
||||||
func (r *Renderer) SetWindowTitle(t string) {
|
func (r *Renderer) SetWindowTitle(t string) {
|
||||||
r.disp.SetWindowTitle(t)
|
r.disp.SetWindowTitle(t)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user