pianod2
multisource multiuser scriptable networked music player
mediaplayer.h
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <config.h>
13 
14 #include <ctime>
15 
16 #include <thread>
17 #include <mutex>
18 #include <condition_variable>
19 // #include <tardis>
20 #include <future>
21 
22 #include "fundamentals.h"
23 
24 #ifdef WITH_AVFOUNDATION
25 // This should be in osxplayer.h, but needs to be in a more public header file.
26 extern void wrapInNSApplication (void real_application(void));
27 #endif
28 
29 namespace Media {
31  class Initializer {
32  public:
33  Initializer ();
34  ~Initializer ();
35  };
36 
37  extern void reportLibrariesAndVersions(int verbose);
38 
46  class Player {
47  public:
48  typedef enum {
53  Done
54  } State;
55 
56  public:
57  virtual ~Player (void);
58  // Regulate playback
59  virtual void pause (void) = 0;
60  virtual void abort (void) = 0;
61  virtual void setVolume (float volume) = 0;
62  virtual void cue (void) = 0;
63  virtual void play (void) = 0;
64 
65  // Data retrieval functions
66  virtual float trackDuration (void) const = 0;
67  virtual float playPoint (void) const = 0;
68  virtual float playRemaining (void) const;
69  virtual RESPONSE_CODE completionStatus (void) = 0;
70 
71  virtual State currentState (void) const = 0;
73  inline bool ready(void) const {
74  return (currentState() >= Cueing);
75  };
77  inline bool playbackComplete (void) const {
78  return (currentState() == Done);
79  };
80 
82  virtual time_t getPauseTimeout (void);
83 
84  static Media::Player *getPlayer (const AudioSettings &settings,
85  const std::string &media_url,
86  float initial_gain);
87  };
88 
90  class ThreadedPlayer: public Player {
91  private:
92  volatile bool do_quit = false;
93  volatile bool do_pause = true;
94  std::mutex pause_mutex;
95  std::condition_variable pause_changed;
96 
98  std::future<RESPONSE_CODE> player_response;
99  void setThreadState (bool pause, bool quit);
100 
102  virtual void pause (void)override;
103  virtual void abort ()override;
104 
105  virtual void cue (void) override;
106  virtual void play (void) override;
107  virtual RESPONSE_CODE completionStatus (void) override;
108 
109  protected:
110  bool checkForPauseOrQuit (void);
111  virtual RESPONSE_CODE playerThread (void) = 0;
112 
113  public:
114 
115  virtual void pausing (void);
116  virtual void resuming (void);
117 
118  ThreadedPlayer (void);
119  virtual ~ThreadedPlayer (void);
120  };
121 }
122 
Initialize the media engines; uninitialize on destruction.
Definition: mediaplayer.h:31
~Initializer()
Uninitialize the media engine on prior to shutdown.
Definition: mediaplayer.cpp:203
Initializer()
Initialize the media engine on startup.
Definition: mediaplayer.cpp:179
Base class for playing audio from some source.
Definition: mediaplayer.h:46
virtual void play(void)=0
Start playback or resume playback if paused. If already playing, continue.
virtual float playRemaining(void) const
Seconds left in playback, or a negative number if unknown.
Definition: mediaplayer.cpp:141
virtual float trackDuration(void) const =0
Length of track in seconds, or a negative number if unknown.
Definition: tonegenplayer.cpp:111
virtual void abort(void)=0
Don't play the rest of the song.
virtual State currentState(void) const =0
Definition: tonegenplayer.cpp:118
virtual float playPoint(void) const =0
Seconds from start, or a negative value if unknown.
Definition: tonegenplayer.cpp:114
bool ready(void) const
Indicate if player has finished initializing.
Definition: mediaplayer.h:73
State
Definition: mediaplayer.h:48
@ Cueing
Player has been created and is ready to go, but not playing.
Definition: mediaplayer.h:51
@ DoesNotExist
Player doesn't exist.
Definition: mediaplayer.h:49
@ Done
Playback has completed or been aborted.
Definition: mediaplayer.h:53
@ Playing
Player is playing.
Definition: mediaplayer.h:52
@ Initializing
Player has been created but isn't doing anything yet.
Definition: mediaplayer.h:50
static Media::Player * getPlayer(const AudioSettings &settings, const std::string &media_url, float initial_gain)
Get the a media player currently compiled in the code.
Definition: mediaplayer.cpp:156
virtual ~Player(void)
Definition: mediaplayer.cpp:57
virtual void pause(void)=0
Pause playback. If already paused, do nothing.
virtual time_t getPauseTimeout(void)
When paused, get the time at which the song will expire.
Definition: mediaplayer.cpp:62
virtual RESPONSE_CODE completionStatus(void)=0
virtual void cue(void)=0
Starts thread in paused mode.
virtual void setVolume(float volume)=0
Adjust volume in decibels.
Definition: tonegenplayer.cpp:106
bool playbackComplete(void) const
Indicate if playback is complete and ready for cleanup.
Definition: mediaplayer.h:77
Base class for audio players that are spawned to a new thread.
Definition: mediaplayer.h:90
virtual void resuming(void)
Invoked when when resuming.
Definition: threadedmediaplayer.cpp:93
void setThreadState(bool pause, bool quit)
Definition: threadedmediaplayer.cpp:29
virtual void abort() override
Don't play the rest of the song.
Definition: threadedmediaplayer.cpp:41
virtual RESPONSE_CODE completionStatus(void) override
Get the player completion status, when it is done.
Definition: threadedmediaplayer.cpp:82
volatile bool do_pause
protected by pauseMutex
Definition: mediaplayer.h:93
virtual void play(void) override
Calls resume() to starting playback.
Definition: threadedmediaplayer.cpp:76
volatile bool do_quit
protected by pauseMutex
Definition: mediaplayer.h:92
virtual void pausing(void)
Invoked when pausing.
Definition: threadedmediaplayer.cpp:90
std::mutex pause_mutex
Definition: mediaplayer.h:94
virtual void cue(void) override
Starts thread in paused mode.
Definition: threadedmediaplayer.cpp:69
std::thread player_thread
Definition: mediaplayer.h:97
ThreadedPlayer(void)
Definition: threadedmediaplayer.cpp:96
bool checkForPauseOrQuit(void)
Definition: threadedmediaplayer.cpp:45
std::future< RESPONSE_CODE > player_response
Definition: mediaplayer.h:98
virtual RESPONSE_CODE playerThread(void)=0
virtual void pause(void) override
Implementations.
Definition: threadedmediaplayer.cpp:37
virtual ~ThreadedPlayer(void)
Definition: threadedmediaplayer.cpp:99
std::condition_variable pause_changed
Definition: mediaplayer.h:95
Essential data structures and support.
enum server_status_t RESPONSE_CODE
Media source, source parameters and player interfaces.
Definition: connection.h:22
void reportLibrariesAndVersions(int verbose)
Report media libraries in use and their versions.
Definition: mediaplayer.cpp:70
static std::thread * thread
Definition: osxplayer.mm:33
void wrapInNSApplication(void real_application(void))
The AVAudioPlayer works great, until end of song when it won't tell us that it's done.
Definition: osxplayer.mm:63
Audio output device & driver parameters.
Definition: fundamentals.h:52