finish windows system media control

This commit is contained in:
aynakeya
2024-10-05 21:17:39 -07:00
parent e61f096bb2
commit e7c499ca7f
3 changed files with 62 additions and 2 deletions

View File

@@ -7,7 +7,9 @@ import (
"AynaLivePlayer/internal/playlist"
"AynaLivePlayer/internal/plugins"
"AynaLivePlayer/internal/source"
"AynaLivePlayer/internal/sysmediacontrol"
"AynaLivePlayer/internal/updater"
"AynaLivePlayer/pkg/config"
"AynaLivePlayer/plugin/diange"
"AynaLivePlayer/plugin/durationmgmt"
"AynaLivePlayer/plugin/qiege"
@@ -30,11 +32,15 @@ func Initialize() {
wshub.NewWsHub(),
)
updater.Initialize()
//sysmediacontrol.InitSystemMediaControl()
if config.General.EnableSMC {
sysmediacontrol.InitSystemMediaControl()
}
}
func Stop() {
//sysmediacontrol.Destroy()
if config.General.EnableSMC {
sysmediacontrol.Destroy()
}
liveroom.StopAndSave()
playlist.Close()
plugins.ClosePlugins()

View File

@@ -12,6 +12,7 @@ import (
"github.com/saltosystems/winrt-go/windows/foundation"
"github.com/saltosystems/winrt-go/windows/media"
"github.com/saltosystems/winrt-go/windows/media/playback"
"github.com/saltosystems/winrt-go/windows/storage/streams"
"syscall"
"unsafe"
)
@@ -74,6 +75,7 @@ func InitSystemMediaControl() {
_ = smtc.SetIsNextEnabled(true)
_ = smtc.SetIsPreviousEnabled(true)
_ = smtc.SetPlaybackStatus(media.MediaPlaybackStatusPlaying)
withDisplayUpdater(func(updater *media.SystemMediaTransportControlsDisplayUpdater) {
_ = updater.SetType(media.MediaPlaybackTypeMusic)
})
@@ -83,10 +85,60 @@ func InitSystemMediaControl() {
withMusicProperties(func(updater *media.SystemMediaTransportControlsDisplayUpdater, properties *media.MusicDisplayProperties) {
properties.SetArtist(data.Media.Info.Artist)
properties.SetTitle(data.Media.Info.Title)
properties.SetAlbumTitle(data.Media.Info.Album)
if data.Media.Info.Cover.Url != "" {
imgUri, _ := foundation.UriCreateUri(data.Media.Info.Cover.Url)
defer imgUri.Release()
stream, _ := streams.RandomAccessStreamReferenceCreateFromUri(imgUri)
defer stream.Release()
_ = updater.SetThumbnail(stream)
} else {
// todo: using cover data
}
_ = updater.Update()
})
if data.Removed {
smtc.SetPlaybackStatus(media.MediaPlaybackStatusChanging)
}
})
global.EventManager.RegisterA(events.PlayerPropertyPauseUpdate, "sysmediacontrol.update_paused", func(event *event.Event) {
if event.Data.(events.PlayerPropertyPauseUpdateEvent).Paused {
smtc.SetPlaybackStatus(media.MediaPlaybackStatusPaused)
} else {
smtc.SetPlaybackStatus(media.MediaPlaybackStatusPlaying)
}
})
pressedHandler := foundation.NewTypedEventHandler(
ole.NewGUID(buttonPressedEventGUID),
func(_ *foundation.TypedEventHandler, _ unsafe.Pointer, args unsafe.Pointer) {
eventArgs := (*media.SystemMediaTransportControlsButtonPressedEventArgs)(args)
defer eventArgs.Release()
switch val, _ := eventArgs.GetButton(); val {
case media.SystemMediaTransportControlsButtonPlay:
global.EventManager.CallA(
events.PlayerSetPauseCmd, events.PlayerSetPauseCmdEvent{Pause: false})
case media.SystemMediaTransportControlsButtonPause:
global.EventManager.CallA(
events.PlayerSetPauseCmd, events.PlayerSetPauseCmdEvent{Pause: true})
case media.SystemMediaTransportControlsButtonNext:
global.EventManager.CallA(
events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{})
case media.SystemMediaTransportControlsButtonPrevious:
global.EventManager.CallA(events.PlayerSeekCmd, events.PlayerSeekCmdEvent{
Position: 0,
Absolute: true,
})
}
},
)
_, _ = smtc.AddButtonPressed(pressedHandler)
pressedHandler.Release()
// todo: finish timeline properties
// cuz win 11 are not display timeline properties now
// i just ignore it
}
func Destroy() {