pianod2
multisource multiuser scriptable networked music player
mediamanager.h
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <config.h>
13 
14 #include <cstdio>
15 #include <ctime>
16 
17 #include <string>
18 #include <unordered_map>
19 #include <vector>
20 #include <functional>
21 #include <functional>
22 
23 #include "fundamentals.h"
24 #include "callback.h"
25 #include "logging.h"
26 #include "musictypes.h"
27 #include "filter.h"
28 #include "ownership.h"
29 #include "mediaunit.h"
30 #include "interpreter.h"
31 
32 class PianodConnection;
33 namespace Tuner {
34  class Tuner;
35 }
36 
37 namespace Media {
42  class Manager : public Source, public PianodInterpreter, private std::unordered_map<Source::SerialNumber, Source * const > {
43  friend class Tuner::Tuner;
44  public:
45  using base_container = std::unordered_map<Source::SerialNumber, Source * const >;
46  using base_container::begin;
47  using base_container::end;
48 
50  class Callbacks {
51  public:
53  std::function<void (const Source * const)> sourceReady;
55  std::function<void (const Source * const)> sourceOffline;
57  std::function<bool (const Source * const)> canRemoveSource;
59  std::function<void (const Source * const)> sourceRemoved;
61  std::function<void (RESPONSE_CODE, const char *)> statusNotification = Source::defaultStatusHandler;
62  };
63 
66 
67  private:
68  using SourceList = std::vector<Source *>;
69 
73 
76 
77  void handleSourceStateChange (Source * const source);
78  void redirectingStatusHandler (RESPONSE_CODE status, const char *detail);
79 
80  SourceList getRealSources () const;
83 
84  // Interpreter support
85  public:
88  virtual const Parsnip::Parser::Definitions &getParserDefinitions () override;
90  private:
91  virtual bool authorizedCommand (Parsnip::Parser::CommandId command, PianodConnection &conn) override;
92  virtual ResponseCollector handleCommand (Parsnip::Parser::CommandId command, const Parsnip::Data &options, PianodConnection &conn) override;
93 
95  bool add (Source * const src);
96 
97  public:
98  Manager (void);
99  ~Manager (void);
100 
101  // Manager routines
102  Source * const get (const SerialNumber serial) const;
103  Source * const get (const std::string &type, const std::string &ident) const;
104  Source * const add (SourcePtr &&src);
105  Media::Source * const getSource (const Parsnip::Data &options);
107  bool erase (Source * const source);
108  void resetLockout ();
109 
110  inline bool areSourcesReady () const {
112  }
113  inline bool areSourcesPending () const {
116  }
117  inline SourceList getReadySources () const {
118  return getRealSources (State::READY);
119  }
120 
121  // Capabilities routines
122  virtual bool canExpandToAllSongs (void) const override;
123 
124  // Source API routines
125  virtual bool flush (void) override;
126  virtual float periodic (void) override;
127  virtual const char *kind (void) const override;
128 
129  virtual PlaylistList getPlaylists (const Filter &filter = Filter::All) override;
130  virtual MusicThingie *getAnythingById (const SplitId &id) override;
131  MusicThingie *getAnythingById (const std::string &id);
132  virtual PianodPlaylist *getMixPlaylist (void) override;
133  virtual PianodPlaylist *getEverythingPlaylist (void) override;
134  virtual PianodPlaylist *getTransientPlaylist (const Filter &criteria) override;
135 
136 
137  virtual Player *getPlayer (const AudioSettings &audio, PianodSong *song) override;
138  virtual SongList getRandomSongs (PianodPlaylist *playlist, const UserList &users,
139  SelectionMethod selectionMethod) override;
140  virtual ThingieList getSuggestions (const Filter &filter, SearchRange where) override;
141 
142  virtual PianodPlaylist *createPlaylist (const char *name,
143  MusicThingie::Type type,
144  MusicThingie *from) override;
145  virtual PianodPlaylist *createPlaylist (const char *name, const Filter &filter) override;
146 
147  // Typecasts
148  virtual MusicThingie *getSuggestion (MusicThingie *thing,
149  MusicThingie::Type type,
150  SearchRange where) override;
151  };
152 }
153 
155 
Callback manager.
A template class to manage callback, delegate and notification functions.
Definition: callback.h:21
Track data filter.
Definition: filter.h:38
static const Filter All
Selects all tracks.
Definition: filter.h:220
Notifications/Delegates provided by the media manager.
Definition: mediamanager.h:50
std::function< void(const Source *const)> sourceReady
Notification sent when a source is ready (goes online).
Definition: mediamanager.h:53
std::function< void(const Source *const)> sourceRemoved
Final notification that a source is being removed.
Definition: mediamanager.h:59
std::function< void(RESPONSE_CODE, const char *)> statusNotification
Subscription for alert messages from all sources.
Definition: mediamanager.h:61
std::function< void(const Source *const)> sourceOffline
Notification sent when a source goes offline or is about to be removed.
Definition: mediamanager.h:55
std::function< bool(const Source *const)> canRemoveSource
Delegate that can veto source removal.
Definition: mediamanager.h:57
The Media::Manager contains a collection of all sources.
Definition: mediamanager.h:42
virtual PlaylistList getPlaylists(const Filter &filter=Filter::All) override
Retrieve the source's playlists.
Definition: managersource.cpp:43
virtual SongList getRandomSongs(PianodPlaylist *playlist, const UserList &users, SelectionMethod selectionMethod) override
Definition: managersource.cpp:168
void redirectingStatusHandler(RESPONSE_CODE status, const char *detail)
Handle an alert by passing it to callbacks.
Definition: mediamanager.cpp:272
Retainer< PianodPlaylist * > mix_playlist
Definition: mediamanager.h:70
void handleSourceStateChange(Source *const source)
Respond to a source's state change.
Definition: mediamanager.cpp:223
bool areSourcesInState(Source::State state) const
Check if there are any sources in a given state.
Definition: mediamanager.cpp:177
virtual ThingieList getSuggestions(const Filter &filter, SearchRange where) override
Definition: managersource.cpp:115
std::unordered_map< Source::SerialNumber, Source *const > base_container
Definition: mediamanager.h:45
static const Parsnip::OptionParser::Definitions & source_id_parser_definitions()
Definition: managercommand.cpp:42
virtual PianodPlaylist * getMixPlaylist(void) override
Definition: managersource.cpp:51
Retainer< PianodPlaylist * > transient_playlist
Definition: mediamanager.h:72
virtual Player * getPlayer(const AudioSettings &audio, PianodSong *song) override
Play a song, gathering statistics and substituting proxies if enabled.
Definition: managersource.cpp:60
virtual bool authorizedCommand(Parsnip::Parser::CommandId command, PianodConnection &conn) override
Check whether a command is authorized.
Definition: managercommand.cpp:134
virtual PianodPlaylist * getEverythingPlaylist(void) override
Definition: managersource.cpp:55
Filter transient_criteria
Criteria for selecting items into the transient playlist.
Definition: mediamanager.h:75
bool add(Source *const src)
Add a source.
Definition: mediamanager.cpp:94
CallbackManager< Manager, Callbacks > callback
Callback manager provides API for registering and removing callbacks.
Definition: mediamanager.h:65
~Manager(void)
Definition: mediamanager.cpp:56
virtual bool canExpandToAllSongs(void) const override
Indicate if arbitrary tracks can be requested from this source.
Definition: managersource.cpp:35
virtual PianodPlaylist * createPlaylist(const char *name, MusicThingie::Type type, MusicThingie *from) override
Create a playlist using a thingie as an initial seed.
Definition: managersource.cpp:144
virtual float periodic(void) override
Perform periodic activities and remove sources that deferred removal.
Definition: mediamanager.cpp:240
virtual MusicThingie * getAnythingById(const SplitId &id) override
Retrieve a playlist, song, album or artist by ID.
Definition: mediamanager.cpp:288
static const Parsnip::Parser::Definitions & parser_definitions()
Definition: managercommand.cpp:53
bool erase(Source *const source)
Remove a source.
Definition: mediamanager.cpp:152
virtual PianodPlaylist * getTransientPlaylist(const Filter &criteria) override
If any source has the necessary capabilities, and some items match the criteria, then stash the crite...
Definition: managersource.cpp:155
Source *const get(const SerialNumber serial) const
Retrieve a source by serial number.
Definition: mediamanager.cpp:70
virtual MusicThingie * getSuggestion(MusicThingie *thing, MusicThingie::Type type, SearchRange where) override
Retrieve an equivalent or related album, artist, or song from a source.
Definition: managersource.cpp:140
static const PianodSchema::CommandIds & json_request_names(PianodSchema &schema)
Retrieve names for our JSON requests, and make schema revisions.
Definition: managercommand.cpp:81
bool areSourcesPending() const
Definition: mediamanager.h:113
SourceList getReadySources() const
Definition: mediamanager.h:117
virtual bool flush(void) override
Ask all the sources to persist any data.
Definition: mediamanager.cpp:211
Media::Source *const getSource(const Parsnip::Data &options)
Get a source commands predicate (either by ID or type and name).
Definition: managercommand.cpp:107
Retainer< PianodPlaylist * > everything_playlist
Definition: mediamanager.h:71
virtual const char * kind(void) const override
A unique string identifying the type of source.
Definition: managersource.cpp:27
void resetLockout()
Reset a temporary lockout so playback can be attempted immediately.
Definition: mediamanager.cpp:166
virtual ResponseCollector handleCommand(Parsnip::Parser::CommandId command, const Parsnip::Data &options, PianodConnection &conn) override
Command handler.
Definition: managercommand.cpp:154
SourceList getRealSources() const
Get all sources (excluding the manager itself).
Definition: mediamanager.cpp:186
ResponseGroup reportStatistics(Media::Source *const source)
Send statistics data for a source.
Definition: managercommand.cpp:118
Manager(void)
Definition: mediamanager.cpp:33
std::vector< Source * > SourceList
Definition: mediamanager.h:68
bool areSourcesReady() const
Definition: mediamanager.h:110
virtual const Parsnip::Parser::Definitions & getParserDefinitions() override
Retrieve the parser definitions handled by the interpreter.
Definition: managercommand.cpp:74
Base class for playing audio from some source.
Definition: mediaplayer.h:46
Base class that wraps any audio source, such as Pandora, Spotify, or local music.
Definition: mediaunit.h:68
State state
Definition: mediaunit.h:80
const std::string & name(void) const
Get the name of this source.
Definition: mediasource.cpp:38
static void defaultStatusHandler(RESPONSE_CODE status, const char *detail)
Log status and alert messages by sending them to stdout.
Definition: mediasource.cpp:74
State
Definition: mediaunit.h:74
@ READY
Fully initialized and ready to play music.
@ INITIALIZING
Nothing known yet.
@ VALID
Credentials valid/data exists, but still initializing or offline.
unsigned long SerialNumber
Definition: mediaunit.h:71
Mechanism to split MusicThingie IDs into source identifier, type and inner ID.
Definition: mediaunit.h:195
Base class for songs, albums, artists, playlists, genres, etc.
Definition: musictypes.h:77
Type
Definition: musictypes.h:86
Generic data type.
Definition: parsnip.h:81
std::vector< const char * > Definitions
Definition: parsnip_command.h:90
std::vector< Definition > Definitions
Definition: parsnip_command.h:117
int CommandId
Definition: parsnip_command.h:109
Connection to a pianod client, along with context and state of that connection.
Definition: connection.h:54
Interpreter class based on Parsnip template, customized base for pianod interpreters with the additio...
Definition: interpreter.h:101
Base class for playlists, but still a MusicThingie.
Definition: musictypes.h:416
Definition: interpreter.h:57
std::map< std::string, CommandId > CommandIds
Definition: interpreter.h:59
Base class for songs, these are also MusicThingies, artists and albums.
Definition: musictypes.h:339
A container for lists of playlists.
Definition: retainedlist.h:324
A response collector/aggregator.
Definition: response.h:197
Container for multiple Responses.
Definition: response.h:155
A container for holding songs.
Definition: retainedlist.h:328
Base class for storing lists of thingies, which need to be reference counted accurately.
Definition: retainedlist.h:20
Tuner maintains a set of playlists and their inclusion or exclusion from the current mix,...
Definition: tuner.h:74
Track filter.
Essential data structures and support.
std::vector< const class User * > UserList
Definition: fundamentals.h:348
enum server_status_t RESPONSE_CODE
SearchRange
Definition: fundamentals.h:35
pianod command processing.
Debug/event logging interface.
Media::Manager * media_manager
Definition: mediamanager.cpp:295
Public interface for sources, which provide an interface interfaces to select available music,...
Playlist / Artist / Album / Song data types.
Media source, source parameters and player interfaces.
Definition: connection.h:22
std::unique_ptr< Source > SourcePtr
Definition: mediaunit.h:192
SelectionMethod
The manner in which shuffling is performed.
Definition: mediaunit.h:55
Store and maintain mixes and perform autotuning.
Definition: mediamanager.h:33
Access control for objects.
Audio output device & driver parameters.
Definition: fundamentals.h:52