Files
supersonic/backend/mpmedia.go
T
2023-10-18 23:25:57 +01:00

71 lines
1.5 KiB
Go

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"
)
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
}