pianod2
multisource multiuser scriptable networked music player
gstreamplayer.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <config.h>
12 
13 #include <string>
14 #include <memory>
15 #include <mutex>
16 
17 #pragma GCC diagnostic push
18 #pragma GCC diagnostic ignored "-Wdocumentation"
19 #pragma GCC diagnostic ignored "-Wshadow"
20 #include <gst/gst.h>
21 #pragma GCC diagnostic pop
22 
23 #include "mediaplayer.h"
24 #include "audio/audiooutput.h"
25 #include "fundamentals.h"
26 
27 namespace Audio {
30  public:
31  GstreamerAudioException (const char *func, const char *error,
32  const char *what = nullptr, const char *what2 = nullptr);
33  GstreamerAudioException (const char *func, GError *error, const char *what = nullptr);
34 
35 // GstreamerAudioException (const std::string &func, const Glib::ustring &error);
36  };
37 
38 
39 
42  protected:
43  GstElement *pipeline;
44  GstElement *chain_start = nullptr;
45  GstElement *pipeline_last = nullptr;
46 
47  void add (GstElement *element);
48 
49  protected:
50  mutable std::recursive_mutex state_mutex;
51  mutable std::unique_ptr<GstreamerAudioException> pipeline_exception;
52  void throwDeferredException (const GstreamerAudioException &exception,
53  bool asynchronously = false) const;
54  inline void throwAsyncException (const GstreamerAudioException &exception) {
55  throwDeferredException (exception, true);
56  }
57 
58  void push (GstElement *item);
59  GstElement *createElement (const char *name,
60  const std::string &overrides = "");
61  GstState currentPipelineState () const;
62  void setPipelineState (GstState state);
63 
64  public:
66  virtual ~GstreamerSimplePipeline ();
67  };
68 
72  GstElement *input_pipeline_last = nullptr;
73  gulong signal_handler_id = 0;
74 
75  static void on_pad_added (GstElement *,
76  GstPad *pad,
77  gpointer instance);
78  void connectOutput(GstPad *pad);
79 
80  protected:
81  void push (GstElement *item);
82  void pushSource (GstElement *item);
83 
84  public:
86  virtual ~GstreamerDoublePipeline () = default;
87  };
88 
89 
92  protected:
93  const bool is_network = false;
94  const std::string url;
95 
96  private:
97  GstElement *media_source = nullptr;
98  GstElement *decoder = nullptr;
99 
100  public:
101  GstreamerMediaReader (const std::string &media_url, int timeout = 15);
102  };
103 
104 
105 
108  private:
109  static gboolean on_bus_message (GstBus *bus, GstMessage *message, gpointer instance);
110  bool notificationReceived (GstMessage *message);
111 
112  protected:
113  virtual bool notification (GstMessage *message);
114 
115  public:
116  GstreamerReaderWithBus (const std::string &media_url,
117  int timeout);
118  virtual ~GstreamerReaderWithBus ();
119  };
120 
121 
122 
123 
124 
125 
128  private:
130 
131  GstElement *replay_gainer = nullptr;
132  GstElement *volume_filter = nullptr;
133  GstElement *format_converter = nullptr;
134  GstElement *output_device = nullptr;
135 
136  // Regulate playback
137  virtual void pause (void) override;
138  virtual void abort (void) override;
139  virtual void cue (void) override;
140  virtual void play (void) override;
141  virtual RESPONSE_CODE completionStatus (void) override;
142 
143  // Implement MediaPlayer API
144  virtual void setVolume (float volume) override;
145  virtual State currentState (void) const override;
146  virtual float trackDuration (void) const override;
147  virtual float playPoint (void) const override;
148 
149  public:
150  GstreamerPlayer (const AudioSettings &audio_settings,
151  const std::string &media_url,
152  float initial_audio_gain);
153  virtual ~GstreamerPlayer ();
154  };
155 
156 
157 
160  private:
162 
163  GstElement *application_source = nullptr;
164  GstElement *format_converter = nullptr;
165  GstElement *output_device = nullptr;
166 
167  public:
168  GstreamerOutput (const AudioSettings &settings,
169  const AudioFormat &format);
170  virtual bool play (void *buffer, unsigned numberOfBytes) override;
171  };
172 
173 
174 }
175 
Class to abstract away details of audio output system is in use.
Exception for audio output problems.
Definition: audiooutput.h:47
virtual const char * what() const noexcept override
Definition: audiooutput.h:53
Exception for gstreamer audio output problems.
Definition: gstreamplayer.h:29
GstreamerAudioException(const char *func, const char *error, const char *what=nullptr, const char *what2=nullptr)
Definition: gstreamplayer.cpp:29
Class for gstreamer pipelines that need sources wired to downstream elements dynamically when autoplu...
Definition: gstreamplayer.h:71
void push(GstElement *item)
Push an output element into the filter graph.
Definition: gstreamplayer.cpp:221
gulong signal_handler_id
Definition: gstreamplayer.h:73
virtual ~GstreamerDoublePipeline()=default
void connectOutput(GstPad *pad)
Handle the pad added signal by connecting the decoder to the output chain.
Definition: gstreamplayer.cpp:239
static void on_pad_added(GstElement *, GstPad *pad, gpointer instance)
Callback function for pad-added signal.
Definition: gstreamplayer.cpp:232
void pushSource(GstElement *item)
Wire an element to the end of the source pipeline/filter graph.
Definition: gstreamplayer.cpp:206
GstElement * input_pipeline_last
Last item pushed on the stream.
Definition: gstreamplayer.h:72
Class for reading media streams via gstreamer.
Definition: gstreamplayer.h:91
GstElement * decoder
Autoplugger, which in turn wires up an audio decoder.
Definition: gstreamplayer.h:98
GstreamerMediaReader(const std::string &media_url, int timeout=15)
Base abstract class for reading a media file or URL using gstreamer.
Definition: gstreamplayer.cpp:264
const bool is_network
True if media is network streaming.
Definition: gstreamplayer.h:93
GstElement * media_source
Source element. Reads file or network.
Definition: gstreamplayer.h:97
const std::string url
Media URL or filename.
Definition: gstreamplayer.h:94
Audio output class utilizing gstreamer for output.
Definition: gstreamplayer.h:159
GstreamerOutput(const AudioSettings &settings, const AudioFormat &format)
Definition: gstreamplayer.cpp:485
AudioSettings audio
Output settings.
Definition: gstreamplayer.h:161
GstElement * format_converter
Convert audio to required format for output.
Definition: gstreamplayer.h:164
GstElement * application_source
Element for application to push data into.
Definition: gstreamplayer.h:163
virtual bool play(void *buffer, unsigned numberOfBytes) override
Play output.
Definition: gstreamplayer.cpp:520
GstElement * output_device
Send audio to somewhere.
Definition: gstreamplayer.h:165
Play media or a stream using gstreamer.
Definition: gstreamplayer.h:127
virtual void setVolume(float volume) override
Adjust volume in decibels.
Definition: gstreamplayer.cpp:416
GstreamerPlayer(const AudioSettings &audio_settings, const std::string &media_url, float initial_audio_gain)
Play a media file or URL using gstreamer.
Definition: gstreamplayer.cpp:390
GstElement * format_converter
Convert audio to required format for output.
Definition: gstreamplayer.h:133
virtual void abort(void) override
Don't play the rest of the song.
Definition: gstreamplayer.cpp:454
GstElement * volume_filter
Make volume adjustments.
Definition: gstreamplayer.h:132
virtual void cue(void) override
Starts thread in paused mode.
Definition: gstreamplayer.cpp:450
virtual RESPONSE_CODE completionStatus(void) override
Definition: gstreamplayer.cpp:472
virtual float trackDuration(void) const override
Length of track in seconds, or a negative number if unknown.
Definition: gstreamplayer.cpp:420
virtual void pause(void) override
Pause playback. If already paused, do nothing.
Definition: gstreamplayer.cpp:442
virtual float playPoint(void) const override
Seconds from start, or a negative value if unknown.
Definition: gstreamplayer.cpp:431
GstElement * output_device
Send audio to somewhere.
Definition: gstreamplayer.h:134
virtual void play(void) override
Start playback or resume playback if paused. If already playing, continue.
Definition: gstreamplayer.cpp:446
virtual ~GstreamerPlayer()
Definition: gstreamplayer.cpp:411
GstElement * replay_gainer
Apply replay gain as necessary.
Definition: gstreamplayer.h:131
AudioSettings audio
Output settings.
Definition: gstreamplayer.h:129
virtual State currentState(void) const override
Definition: gstreamplayer.cpp:458
Base class for gstreamer pipelines, both readers and outputs.
Definition: gstreamplayer.h:107
static gboolean on_bus_message(GstBus *bus, GstMessage *message, gpointer instance)
Definition: gstreamplayer.cpp:313
bool notificationReceived(GstMessage *message)
Handle an event notification from the stream.
Definition: gstreamplayer.cpp:318
virtual bool notification(GstMessage *message)
Definition: gstreamplayer.cpp:371
GstreamerReaderWithBus(const std::string &media_url, int timeout)
Definition: gstreamplayer.cpp:299
virtual ~GstreamerReaderWithBus()
Definition: gstreamplayer.cpp:310
Base class for gstreamer pipelines.
Definition: gstreamplayer.h:41
GstElement * createElement(const char *name, const std::string &overrides="")
Create a gstreamer element and add it to the pipeline/bin, unwired.
Definition: gstreamplayer.cpp:170
std::recursive_mutex state_mutex
Definition: gstreamplayer.h:50
void throwAsyncException(const GstreamerAudioException &exception)
Definition: gstreamplayer.h:54
GstElement * chain_start
First item pushed on the stream after setup.
Definition: gstreamplayer.h:44
GstreamerSimplePipeline()
Definition: gstreamplayer.cpp:51
GstElement * pipeline_last
Last item pushed on the stream.
Definition: gstreamplayer.h:45
GstState currentPipelineState() const
Query the pipeline's current state.
Definition: gstreamplayer.cpp:84
void add(GstElement *element)
Definition: gstreamplayer.cpp:156
void setPipelineState(GstState state)
Set the pipeline's state.
Definition: gstreamplayer.cpp:110
void push(GstElement *item)
Wire an item to the pipeline/filter graph.
Definition: gstreamplayer.cpp:143
void throwDeferredException(const GstreamerAudioException &exception, bool asynchronously=false) const
"Throw" an exception from an asyncrhonous player thread.
Definition: gstreamplayer.cpp:69
GstElement * pipeline
Filter graph for elements.
Definition: gstreamplayer.h:43
virtual ~GstreamerSimplePipeline()
Definition: gstreamplayer.cpp:60
std::unique_ptr< GstreamerAudioException > pipeline_exception
Asynchronous exception.
Definition: gstreamplayer.h:51
Base audio output class (abstract).
Definition: audiooutput.h:65
Base class for playing audio from some source.
Definition: mediaplayer.h:46
State
Definition: mediaplayer.h:48
Essential data structures and support.
enum server_status_t RESPONSE_CODE
Public interface for media players.
Classes dealing with audio output drivers and decoding/playing audio files.
Definition: audiooutput.cpp:48
Audio format, somewhat ripped off from libao.
Definition: audiooutput.h:29
Audio output device & driver parameters.
Definition: fundamentals.h:52