native functionality bridge

This commit is contained in:
zackslash
2023-10-19 15:48:56 +01:00
parent 7e6fd269db
commit e938d62cb3
5 changed files with 257 additions and 80 deletions
+1 -59
View File
@@ -1,70 +1,12 @@
package backend
/**
* This file handles implementation of MacOS native controls via the native 'MediaPlayer' framework
**/
// #cgo CFLAGS: -x objective-c
// #cgo LDFLAGS: -framework Cocoa -framework MediaPlayer
// #include "mpmediabridge.h"
import (
"C"
)
import (
"fmt"
"unsafe"
"github.com/dweymouth/supersonic/backend/mediaprovider"
"github.com/dweymouth/supersonic/player"
)
// MPMediaHandler is the handler for MacOS media controls and system events.
type MPMediaHandler struct {
player *player.Player
playbackManager *PlaybackManager
ArtURLLookup func(trackID string) (string, error)
}
func NewMPMediaHandler(player *player.Player, playbackManager *PlaybackManager) *MPMediaHandler {
mp := &MPMediaHandler{
player: player,
playbackManager: playbackManager,
}
mp.playbackManager.OnSongChange(func(track, _ *mediaprovider.Track) {
if mp.ArtURLLookup != nil {
mp.ArtURLLookup(track.CoverArtID)
}
cTitle := C.CString(track.Name)
defer C.free(unsafe.Pointer(cTitle))
artist := ""
if len(track.ArtistNames) > 0 {
artist = track.ArtistNames[0]
}
cArtist := C.CString(artist)
defer C.free(unsafe.Pointer(cArtist))
// TODO: pass in local URL for image (can be loaded via NSImage)
C.setNowPlayingInfo(cTitle, cArtist)
})
mp.player.OnStopped(func() {
// TODO: media stopped playing
fmt.Println("Stopped")
})
mp.player.OnPlaying(func() {
// TODO: media playing
fmt.Println("Playing")
})
mp.player.OnPaused(func() {
// TODO: media paused
fmt.Println("Paused")
})
return mp
}