From e22a16ea5a38bc3a8a2460145c8d1d928b851763 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Tue, 14 Mar 2023 18:08:21 -0700 Subject: [PATCH] expose MPV ReplayGain options --- player/libmpv.go | 8 ++++++++ player/player.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/player/libmpv.go b/player/libmpv.go index 52e4cde..6ccb973 100644 --- a/player/libmpv.go +++ b/player/libmpv.go @@ -104,6 +104,14 @@ func (m libmpv) SetProperty(name string, format MPVFormat, value any) error { return toMPVError(C.mpv_set_property(m.handle, cname, C.mpv_format(format), p)) } +func (m libmpv) SetPropertyString(name, value string) error { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + cvalue := C.CString(value) + defer C.free(unsafe.Pointer(cvalue)) + return toMPVError(C.mpv_set_property_string(m.handle, cname, cvalue)) +} + func (m libmpv) GetProperty(name string, format MPVFormat) (any, error) { cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) diff --git a/player/player.go b/player/player.go index 4d119cb..dee4bb0 100644 --- a/player/player.go +++ b/player/player.go @@ -38,12 +38,30 @@ const ( SeekRelativePercent ) +// One of "no", "track", or "album" +type ReplayGainMode string + +const ( + ReplayGainNone ReplayGainMode = "no" + ReplayGainTrack ReplayGainMode = "track" + ReplayGainAlbum ReplayGainMode = "album" +) + +// Replay Gain options (argument to SetReplayGainOptions). +type ReplayGainOptions struct { + Mode ReplayGainMode + FallbackGain float64 + PreampGain float64 +} + // Player encapsulates the mpv instance and provides functions // to control it and to check its status. type Player struct { mpv libmpv initialized bool vol int + replayGainOpts ReplayGainOptions + haveRGainOpts bool status Status seeking bool curPlaylistPos int64 @@ -99,6 +117,9 @@ func (p *Player) Init(audioExclusive bool) error { if audioExclusive { m.SetOptionString("audio-exclusive", "yes") } + if p.haveRGainOpts { + p.SetReplayGainOptions(p.replayGainOpts) + } if p.clientName != "" { m.SetOptionString("audio-client-name", p.clientName) @@ -232,6 +253,26 @@ func (p *Player) SetVolume(vol int) error { return nil } +// Sets the ReplayGain options of the player. +// Unlike most Player functions, SetReplayGainOptions can be called +// before Init, to set the initial volume of the player on startup. +func (p *Player) SetReplayGainOptions(options ReplayGainOptions) error { + p.replayGainOpts = options + p.haveRGainOpts = true + if p.initialized { + if err := p.mpv.SetPropertyString("replaygain", string(options.Mode)); err != nil { + return err + } + if err := p.mpv.SetProperty("replaygain-preamp", MPVFormatDouble, options.PreampGain); err != nil { + return err + } + if err := p.mpv.SetProperty("replaygain-fallback", MPVFormatDouble, options.FallbackGain); err != nil { + return err + } + } + return nil +} + // Gets the current volume of the player. func (p *Player) GetVolume() int { return p.vol