player

package
v0.8.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 2, 2026 License: GPL-3.0 Imports: 26 Imported by: 0

Documentation

Index

Constants

View Source
const (
	SampleRate = 44100
	Channels   = 2
)
View Source
const CdnUrlQuarantineDuration = 15 * time.Minute
View Source
const MaxStateVolume = 65535

Variables

This section is empty.

Functions

func GetFormatBitrate added in v0.3.0

func GetFormatBitrate(format metadatapb.AudioFile_Format) int

Types

type AudioFormat added in v0.5.1

type AudioFormat int
const (
	AudioFormatUnknown AudioFormat = iota
	AudioFormatFLAC
	AudioFormatOGGVorbis
	AudioFormatMP3
	AudioFormatAAC
)

func GetAudioFileFormatAudioFormat added in v0.5.1

func GetAudioFileFormatAudioFormat(format metadatapb.AudioFile_Format) AudioFormat

GetAudioFileFormatAudioFormat maps metadatapb.AudioFile_Format to AudioFormat

type Event

type Event struct {
	Type EventType
}

type EventManager added in v0.3.0

type EventManager interface {
	PreStreamLoadNew(playbackId []byte, spotId librespot.SpotifyId, mediaPosition int64)
	PostStreamResolveAudioFile(playbackId []byte, targetBitrate int32, media *librespot.Media, file *metadata.AudioFile)
	PostStreamRequestAudioKey(playbackId []byte)
	PostStreamResolveStorage(playbackId []byte)
	PostStreamInitHttpChunkReader(playbackId []byte, reader *audio.HttpChunkedReader)

	OnPrimaryStreamUnload(stream *Stream, pos int64)
	PostPrimaryStreamLoad(stream *Stream, paused bool)

	OnPlayerPlay(stream *Stream, ctxUri string, shuffle bool, playOrigin *connectpb.PlayOrigin, track *connectpb.ProvidedTrack, pos int64)
	OnPlayerResume(stream *Stream, pos int64)
	OnPlayerPause(stream *Stream, ctxUri string, shuffle bool, playOrigin *connectpb.PlayOrigin, track *connectpb.ProvidedTrack, pos int64)
	OnPlayerSeek(stream *Stream, oldPos, newPos int64)
	OnPlayerSkipForward(stream *Stream, pos int64, skipTo bool)
	OnPlayerSkipBackward(stream *Stream, pos int64)
	OnPlayerEnd(stream *Stream, pos int64)

	Close()
}

type EventType

type EventType int
const (
	EventTypePlay EventType = iota
	EventTypeResume
	EventTypePause
	EventTypeStop
	EventTypeNotPlaying
)

type Options added in v0.2.0

type Options struct {
	Spclient *spclient.Spclient
	AudioKey *audio.KeyProvider
	Events   EventManager

	Log librespot.Logger

	// Cache, when non-nil, is used to store and retrieve encrypted audio files
	// on disk, avoiding a CDN download when a track is played again.
	Cache *cache.Cache

	// FlacEnabled specifies if FLAC files should be preferred when available.
	// When setting this to true, it is assumed that the PlayPlay plugin is provided.
	FlacEnabled bool

	// NormalisationEnabled specifies if the volume should be normalised according
	// to Spotify parameters. Only track normalization is supported.
	NormalisationEnabled bool
	// NormalisationUseAlbumGain specifies whether album gain instead of track gain
	// should be used for normalisation
	NormalisationUseAlbumGain bool
	// NormalisationPregain specifies the pre-gain to apply when normalising the volume
	// in dB. Use negative values to avoid clipping.
	NormalisationPregain float32

	// CrossfadeDuration specifies for how long tracks should overlap during
	// a track change. Zero disables crossfading.
	CrossfadeDuration time.Duration

	// CountryCode specifies the country code to use for media restrictions.
	CountryCode *string

	// AudioBackend specifies the audio backend to use (alsa, pulseaudio, etc).
	AudioBackend string
	// AudioBackendRuntimeSocket specifies a prefixed with protocol (e.g. `unix:` or `tcp:`) path
	// to a runtime socket of audio backend.
	//
	// This feature is support only for the pulseaudio backend.
	AudioBackendRuntimeSocket string
	// AudioDevice specifies the audio device name.
	//
	// This feature is support only for the alsa and pulseaudio backend.
	AudioDevice string
	// MixerDevice specifies the audio mixer name.
	//
	// This feature is support only for the alsa backend.
	MixerDevice string
	// MixerControlName specifies the mixer control name.
	//
	// This only works in combination with Mixer.
	MixerControlName string
	// AudioBufferTime is the buffer time in microseconds.
	//
	// This is only supported on the alsa backend.
	AudioBufferTime int
	// AudioPeriodCount is the number of periods to request.
	//
	// This is only supported on the alsa backend.
	AudioPeriodCount int

	// ExternalVolume specifies, if the volume is controlled outside the app.
	//
	// This is only supported on the alsa and pipe backends.
	// The PulseAudio backend always uses external volume.
	ExternalVolume bool

	// VolumeUpdate is a channel on which volume updates will be sent back to
	// Spotify. This must be a buffered channel.
	VolumeUpdate chan float32

	// AudioOutputPipe is the path to the output pipe.
	//
	// This is only supported on the pipe backend.
	AudioOutputPipe string

	// AudioOutputPipeFormat is the format of the output pipe.
	// Available formats are: "s16le", "s32le", "f32le". Default is "s16le".
	//
	// This is only supported on the pipe backend.
	AudioOutputPipeFormat string
}

type Player

type Player struct {
	// contains filtered or unexported fields
}

func NewPlayer

func NewPlayer(opts *Options) (*Player, error)

func (*Player) Close

func (p *Player) Close()

func (*Player) HasBeenPlayingFor

func (p *Player) HasBeenPlayingFor() time.Duration

func (*Player) NewStream

func (p *Player) NewStream(ctx context.Context, client *http.Client, spotId librespot.SpotifyId, bitrate int, mediaPosition int64) (*Stream, error)

func (*Player) Pause

func (p *Player) Pause() error

func (*Player) Play

func (p *Player) Play() error

func (*Player) PositionMs

func (p *Player) PositionMs() int64

func (*Player) Receive

func (p *Player) Receive() <-chan Event

func (*Player) ReopenOutput added in v0.8.0

func (p *Player) ReopenOutput(device string) error

ReopenOutput reopens the audio output on the given device without touching the Spotify session, preserving the current playback position, paused state and volume. If playback is currently active it switches devices live (with a brief audio gap); if nothing is playing it just records the device for the next output open. It returns an error if the new device fails to open, in which case playback is left stopped.

func (*Player) SeekMs

func (p *Player) SeekMs(pos int64) error

func (*Player) SetPrimaryStream

func (p *Player) SetPrimaryStream(source librespot.AudioSource, paused, drop bool) error

func (*Player) SetSecondaryStream

func (p *Player) SetSecondaryStream(source librespot.AudioSource)

func (*Player) SetVolume

func (p *Player) SetVolume(val uint32)

func (*Player) Stop

func (p *Player) Stop()

type Stream

type Stream struct {
	PlaybackId []byte

	// RequestedId is the id this stream was created for, before any relinking
	// to an alternative track. Callers keep referring to the stream by the id
	// they requested, which may differ from the media's own id.
	RequestedId librespot.SpotifyId

	Source librespot.AudioSource
	Media  *librespot.Media
	File   *metadatapb.AudioFile
}

func (*Stream) Is

func (s *Stream) Is(id librespot.SpotifyId) bool

type SwitchingAudioSource

type SwitchingAudioSource struct {
	// contains filtered or unexported fields
}

func NewSwitchingAudioSource

func NewSwitchingAudioSource(crossfadeSamples int) *SwitchingAudioSource

NewSwitchingAudioSource creates an audio source that switches seamlessly between a primary and a prefetched secondary source.

If crossfadeSamples is greater than zero, track transitions overlap by up to that many samples (interleaved, so frames times channels) with an equal-power crossfade. A value of zero disables crossfading and preserves gapless behavior.

func (*SwitchingAudioSource) Close

func (s *SwitchingAudioSource) Close() error

func (*SwitchingAudioSource) Done

func (s *SwitchingAudioSource) Done() <-chan struct{}

func (*SwitchingAudioSource) PositionMs

func (s *SwitchingAudioSource) PositionMs() int64

func (*SwitchingAudioSource) Read

func (s *SwitchingAudioSource) Read(p []float32) (n int, err error)

func (*SwitchingAudioSource) SetPositionMs

func (s *SwitchingAudioSource) SetPositionMs(pos int64) error

func (*SwitchingAudioSource) SetPrimary

func (s *SwitchingAudioSource) SetPrimary(source librespot.AudioSource)

func (*SwitchingAudioSource) SetSecondary

func (s *SwitchingAudioSource) SetSecondary(source librespot.AudioSource)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL