Skip to content

Commit

Permalink
[WIP] Experimental windows support (libretro#14)
Browse files Browse the repository at this point in the history
* Experimental windows support

* Encapsulate setVolume

* Add .appveyor.yml

* Try to get dependencies

* Badge

* Fix gopath

* Fix gcc

* Set os

* Try to fix gcc path

* Fix audio

* Fix audio

* Perform tests

* Test script

* Portable libretro package

* Typo

* Simplify code

* Windows audio stubs

* Code cleaning

* Fix windows audio init stub

* This should fix linux builds

* Improve appveyor

* Working audio on windows

* golang.org/x/mobile/exp/audio/al is fixed for windows

* Try to set include path for openal

* Try to copy the headers into the right path

* Slashes

* -r flag

* cp dlls

* Disable go vet

* Remove unused function
  • Loading branch information
kivutar committed May 24, 2018
1 parent 9f63a67 commit 377f211
Show file tree
Hide file tree
Showing 12 changed files with 190 additions and 62 deletions.
36 changes: 36 additions & 0 deletions .appveyor.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
os: Visual Studio 2015

version: 0.1.0.{build}

platform: x64

clone_folder: c:\gopath\src\github.com\kivutar\go-playthemall

environment:
GOPATH: c:\gopath
CC: gcc.exe

install:
- echo %PATH%
- echo %GOPATH%
- set PATH=C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;C:\MinGW\bin;%GOPATH%\bin;c:\go\bin;%PATH%
- go version
- gcc --version
- go env
- appveyor DownloadFile http://kcat.strangesoft.net/openal-binaries/openal-soft-1.18.2-bin.zip
- 7z x openal-soft-1.18.2-bin.zip
- cp -r openal-soft-1.18.2-bin/include/* C:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev1/mingw64/x86_64-w64-mingw32/include/
- cp -r openal-soft-1.18.2-bin/libs/Win64/* C:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev1/mingw64/x86_64-w64-mingw32/lib/

build_script:
- go get -t -v ./...
- go build

before_test:
- go get github.com/golang/lint/golint
- go get honnef.co/go/tools/cmd/megacheck

test_script:
- go test -v -race ./...
- megacheck ./...
- golint -set_exit_status $(go list ./...)
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# Compiled binaries
/go-playthemall
go-playthemall
go-playthemall.exe
settings.json
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# go-playthemall [![Build Status](https://travis-ci.org/kivutar/go-playthemall.svg?branch=master)](https://travis-ci.org/kivutar/go-playthemall)
# go-playthemall [![Build Status](https://travis-ci.org/kivutar/go-playthemall.svg?branch=master)](https://travis-ci.org/kivutar/go-playthemall) [![Build status](https://ci.appveyor.com/api/projects/status/kd0mhl1ly5fdnqgt?svg=true)](https://ci.appveyor.com/project/kivutar/go-playthemall)

go-playthemall is an attempt to write a libretro frontend in go.

Expand Down
4 changes: 4 additions & 0 deletions audio.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ var audio struct {
resPtr int32
}

func audioSetVolume(vol float32) {
audio.source.SetGain(vol)
}

func audioInit(rate int32) {
err := al.OpenDevice()
if err != nil {
Expand Down
1 change: 1 addition & 0 deletions go-playthemall.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ func main() {
}

for !window.ShouldClose() {
glfw.SwapInterval(1)
glfw.PollEvents()
if !g.menuActive {
if g.coreRunning {
Expand Down
2 changes: 0 additions & 2 deletions input.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,8 @@ func joystickCallback(joy int, event int) {
switch event {
case 262145:
message = fmt.Sprintf("Joystick #%d plugged: %s.", joy, glfw.GetJoystickName(glfw.Joystick(joy)))
break
case 262146:
message = fmt.Sprintf("Joystick #%d unplugged.", joy)
break
default:
message = fmt.Sprintf("Joystick #%d unhandled event: %d.", joy, event)
}
Expand Down
28 changes: 28 additions & 0 deletions input_binds_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package main

import "github.com/kivutar/go-playthemall/libretro"

var joyBinds = map[string]joybinds{
"Microsoft X-Box 360 pad": xbox360JoyBinds,
}

// FIXME Joypad bindings fox Xbox360 pad on Windows
var xbox360JoyBinds = joybinds{
bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadB,
bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadA,
bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadY,
bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX,
bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadL,
bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadR,
bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadSelect,
bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadStart,
bind{btn, 8, 0, 0}: menuActionMenuToggle,
bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadL3,
bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadR3,
bind{axis, 6, -1, -0.5}: libretro.DeviceIDJoypadLeft,
bind{axis, 6, 1, 0.5}: libretro.DeviceIDJoypadRight,
bind{axis, 7, -1, -0.5}: libretro.DeviceIDJoypadUp,
bind{axis, 7, 1, 0.5}: libretro.DeviceIDJoypadDown,
bind{axis, 2, 1, 0.5}: libretro.DeviceIDJoypadL2,
bind{axis, 5, 1, 0.5}: libretro.DeviceIDJoypadR2,
}
71 changes: 22 additions & 49 deletions libretro/libretro.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package libretro

/*
#cgo LDFLAGS: -ldl
#include "libretro.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
void bridge_retro_init(void *f);
void bridge_retro_deinit(void *f);
Expand Down Expand Up @@ -46,32 +44,6 @@ import (
"unsafe"
)

// Core is an instance of a dynalically loaded libretro core
type Core struct {
handle unsafe.Pointer

symRetroInit unsafe.Pointer
symRetroDeinit unsafe.Pointer
symRetroAPIVersion unsafe.Pointer
symRetroGetSystemInfo unsafe.Pointer
symRetroGetSystemAVInfo unsafe.Pointer
symRetroSetEnvironment unsafe.Pointer
symRetroSetVideoRefresh unsafe.Pointer
symRetroSetInputPoll unsafe.Pointer
symRetroSetInputState unsafe.Pointer
symRetroSetAudioSample unsafe.Pointer
symRetroSetAudioSampleBatch unsafe.Pointer
symRetroRun unsafe.Pointer
symRetroReset unsafe.Pointer
symRetroLoadGame unsafe.Pointer
symRetroUnloadGame unsafe.Pointer
symRetroSerializeSize unsafe.Pointer
symRetroSerialize unsafe.Pointer
symRetroUnserialize unsafe.Pointer

videoRefresh videoRefreshFunc
}

// GameGeometry represents the geometry of a game, with its aspect ratio, with and height
type GameGeometry struct {
AspectRatio float64
Expand Down Expand Up @@ -215,29 +187,30 @@ func Load(sofile string) (Core, error) {
core := Core{}

mu.Lock()
core.handle = C.dlopen(C.CString(sofile), C.RTLD_NOW)
if core.handle == nil {
return core, errors.New("dlopen failed")
var err error
core.handle, err = DlOpen(sofile)
if err != nil {
return core, err
}

core.symRetroInit = C.dlsym(core.handle, C.CString("retro_init"))
core.symRetroDeinit = C.dlsym(core.handle, C.CString("retro_deinit"))
core.symRetroAPIVersion = C.dlsym(core.handle, C.CString("retro_api_version"))
core.symRetroGetSystemInfo = C.dlsym(core.handle, C.CString("retro_get_system_info"))
core.symRetroGetSystemAVInfo = C.dlsym(core.handle, C.CString("retro_get_system_av_info"))
core.symRetroSetEnvironment = C.dlsym(core.handle, C.CString("retro_set_environment"))
core.symRetroSetVideoRefresh = C.dlsym(core.handle, C.CString("retro_set_video_refresh"))
core.symRetroSetInputPoll = C.dlsym(core.handle, C.CString("retro_set_input_poll"))
core.symRetroSetInputState = C.dlsym(core.handle, C.CString("retro_set_input_state"))
core.symRetroSetAudioSample = C.dlsym(core.handle, C.CString("retro_set_audio_sample"))
core.symRetroSetAudioSampleBatch = C.dlsym(core.handle, C.CString("retro_set_audio_sample_batch"))
core.symRetroRun = C.dlsym(core.handle, C.CString("retro_run"))
core.symRetroReset = C.dlsym(core.handle, C.CString("retro_reset"))
core.symRetroLoadGame = C.dlsym(core.handle, C.CString("retro_load_game"))
core.symRetroUnloadGame = C.dlsym(core.handle, C.CString("retro_unload_game"))
core.symRetroSerializeSize = C.dlsym(core.handle, C.CString("retro_serialize_size"))
core.symRetroSerialize = C.dlsym(core.handle, C.CString("retro_serialize"))
core.symRetroUnserialize = C.dlsym(core.handle, C.CString("retro_unserialize"))
core.symRetroInit = core.DlSym("retro_init")
core.symRetroDeinit = core.DlSym("retro_deinit")
core.symRetroAPIVersion = core.DlSym("retro_api_version")
core.symRetroGetSystemInfo = core.DlSym("retro_get_system_info")
core.symRetroGetSystemAVInfo = core.DlSym("retro_get_system_av_info")
core.symRetroSetEnvironment = core.DlSym("retro_set_environment")
core.symRetroSetVideoRefresh = core.DlSym("retro_set_video_refresh")
core.symRetroSetInputPoll = core.DlSym("retro_set_input_poll")
core.symRetroSetInputState = core.DlSym("retro_set_input_state")
core.symRetroSetAudioSample = core.DlSym("retro_set_audio_sample")
core.symRetroSetAudioSampleBatch = core.DlSym("retro_set_audio_sample_batch")
core.symRetroRun = core.DlSym("retro_run")
core.symRetroReset = core.DlSym("retro_reset")
core.symRetroLoadGame = core.DlSym("retro_load_game")
core.symRetroUnloadGame = core.DlSym("retro_unload_game")
core.symRetroSerializeSize = core.DlSym("retro_serialize_size")
core.symRetroSerialize = core.DlSym("retro_serialize")
core.symRetroUnserialize = core.DlSym("retro_unserialize")
mu.Unlock()

C.bridge_retro_set_environment(core.symRetroSetEnvironment, C.coreEnvironment_cgo)
Expand Down
52 changes: 52 additions & 0 deletions libretro/libretro_notwindows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// +build !windows

package libretro

import (
"errors"
"unsafe"
)

/*
#cgo LDFLAGS: -ldl
#include <dlfcn.h>
*/
import "C"

// Core is an instance of a dynalically loaded libretro core
type Core struct {
handle unsafe.Pointer

symRetroInit unsafe.Pointer
symRetroDeinit unsafe.Pointer
symRetroAPIVersion unsafe.Pointer
symRetroGetSystemInfo unsafe.Pointer
symRetroGetSystemAVInfo unsafe.Pointer
symRetroSetEnvironment unsafe.Pointer
symRetroSetVideoRefresh unsafe.Pointer
symRetroSetInputPoll unsafe.Pointer
symRetroSetInputState unsafe.Pointer
symRetroSetAudioSample unsafe.Pointer
symRetroSetAudioSampleBatch unsafe.Pointer
symRetroRun unsafe.Pointer
symRetroReset unsafe.Pointer
symRetroLoadGame unsafe.Pointer
symRetroUnloadGame unsafe.Pointer
symRetroSerializeSize unsafe.Pointer
symRetroSerialize unsafe.Pointer
symRetroUnserialize unsafe.Pointer
}

// DlSym loads a symbol from a dynamic library
func (core *Core) DlSym(name string) unsafe.Pointer {
return C.dlsym(core.handle, C.CString(name))
}

// DlOpen opens a dynamic library
func DlOpen(path string) (unsafe.Pointer, error) {
h := C.dlopen(C.CString(path), C.RTLD_NOW)
if h == nil {
return h, errors.New("dlopen failed")
}
return h, nil
}
41 changes: 41 additions & 0 deletions libretro/libretro_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package libretro

import (
"syscall"
"unsafe"
)

// Core is an instance of a dynalically loaded libretro core
type Core struct {
handle syscall.Handle

symRetroInit unsafe.Pointer
symRetroDeinit unsafe.Pointer
symRetroAPIVersion unsafe.Pointer
symRetroGetSystemInfo unsafe.Pointer
symRetroGetSystemAVInfo unsafe.Pointer
symRetroSetEnvironment unsafe.Pointer
symRetroSetVideoRefresh unsafe.Pointer
symRetroSetInputPoll unsafe.Pointer
symRetroSetInputState unsafe.Pointer
symRetroSetAudioSample unsafe.Pointer
symRetroSetAudioSampleBatch unsafe.Pointer
symRetroRun unsafe.Pointer
symRetroReset unsafe.Pointer
symRetroLoadGame unsafe.Pointer
symRetroUnloadGame unsafe.Pointer
symRetroSerializeSize unsafe.Pointer
symRetroSerialize unsafe.Pointer
symRetroUnserialize unsafe.Pointer
}

// DlSym loads a symbol from a dynamic library
func (core *Core) DlSym(name string) unsafe.Pointer {
tmp, _ := syscall.GetProcAddress(core.handle, name)
return unsafe.Pointer(tmp)
}

// DlOpen opens a dynamic library
func DlOpen(path string) (syscall.Handle, error) {
return syscall.LoadLibrary(path)
}
5 changes: 1 addition & 4 deletions savestates.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,5 @@ func loadState() error {
return err
}
err = g.core.Unserialize(bytes, s)
if err != nil {
return err
}
return nil
return err
}
7 changes: 2 additions & 5 deletions settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ var incrCallbacks = map[string]settingCallbackIncrement{
v := f.Value().(float32)
v += 0.1 * float32(direction)
f.Set(v)
audio.source.SetGain(v)
audioSetVolume(v)
saveSettings()
},
}
Expand All @@ -74,10 +74,7 @@ func loadSettings() error {
return err
}
err = json.Unmarshal(b, &settings)
if err != nil {
return err
}
return nil
return err
}

func saveSettings() error {
Expand Down

0 comments on commit 377f211

Please sign in to comment.