Files
LocalAI/backend/go/gemxcpp/native.go
T
Richard Palethorpe 3de91d48d9 feat(motion): add GEM-X backend and duplex streaming API
Add the GEM-X native backend with live pose and root displacement output, bounded duplex WebSocket streaming, session authorization, metrics and usage accounting. Share the embedded bidirectional RPC channel adapter across streaming backends.

Include backend build and gallery integration, API documentation, schemas and tests.

Assisted-by: Codex:gpt-6
Signed-off-by: Richard Palethorpe <io@richiejp.com>
(cherry picked from commit 016dc3d71a)
2026-10-13 08:27:24 +00:00

53 lines
1.8 KiB
Go

// SPDX-License-Identifier: MIT
package main
import (
"bytes"
"fmt"
"github.com/ebitengine/purego"
)
var liveCreate func(string, string, string, string, string, *uint32, int64, *uintptr, *byte, uint64) int32
var liveDestroy func(uintptr)
var liveDefinition func(uintptr, *byte, uint64, *uint64, *byte, uint64) int32
var liveReset func(uintptr, *byte, uint64) int32
var liveSubmit func(uintptr, *byte, uint64, uint32, uint32, uint64, uint64, int64, *float32, uint64, uint64, *uintptr, *byte, uint64) int32
var resultDestroy func(uintptr)
var resultInfo func(uintptr, *uint64, *int64, *uint64, *uint64, *uint32, *uint32, *byte, uint64) int32
var resultIntervalStart func(uintptr, *int64, *byte, uint64) int32
var resultCopy func(uintptr, uint32, *float32, uint64, *uint64, *byte, uint64) int32
func loadNativeLibrary(path string) error {
lib, err := purego.Dlopen(path, purego.RTLD_NOW|purego.RTLD_GLOBAL)
if err != nil {
return err
}
for _, b := range []struct {
fn any
name string
}{
{&liveCreate, "localai_gemx_create"}, {&liveDestroy, "gemx_live_destroy"},
{&liveDefinition, "gemx_live_definition"}, {&liveReset, "gemx_live_reset"},
{&liveSubmit, "gemx_live_submit"}, {&resultDestroy, "gemx_live_result_destroy"},
{&resultInfo, "gemx_live_result_info"}, {&resultCopy, "gemx_live_result_copy"},
} {
symbol, err := purego.Dlsym(lib, b.name)
if err != nil {
return fmt.Errorf("streaming ABI: %w", err)
}
purego.RegisterFunc(b.fn, symbol)
}
// Optional additive ABI; old libraries can still stream poses.
resultIntervalStart = nil
if symbol, err := purego.Dlsym(lib, "gemx_live_result_interval_start"); err == nil {
purego.RegisterFunc(&resultIntervalStart, symbol)
}
return nil
}
func nativeError(code int32, buf []byte) error {
if code == 0 {
return nil
}
return fmt.Errorf("gemx (%d): %s", code, bytes.TrimRight(buf, "\x00"))
}