16 #pragma GCC diagnostic push
17 #pragma GCC diagnostic ignored "-Wdocumentation"
19 #include <libavformat/avformat.h>
20 #include <libavcodec/avcodec.h>
21 #include <libavfilter/avfilter.h>
22 #ifdef HAVE_LIBAVFILTER_AVFILTERGRAPH_H
23 #include <libavfilter/avfiltergraph.h>
25 #include <libavutil/replaygain.h>
27 #pragma GCC diagnostic pop
35 extern void flogav (
const char *func,
int err);
46 #ifdef HAVE_AVCODECPARAMETERS
47 struct CodecParameterDeleter {
48 void operator() (AVCodecParameters *params) {
49 avcodec_parameters_free (¶ms);
56 avfilter_graph_free (&filter);
63 av_frame_free (&frame);
79 AVFilterContext *
pushFilter (AVFilterContext *prior_filter,
81 const char *optionformat =
nullptr, ...);
85 const AVStream *stream,
86 const AVSampleFormat output_format);
92 bool play (AVFrame *frame);
96 const AVCodecContext *context,
97 const AVStream *stream);
107 Output *out,
const AVSampleFormat output_format);
109 virtual bool playFrame (AVFrame *frame)
override;
117 avcodec_free_context (&coder);
126 int initializeStream (std::unique_ptr <AVCodecContext, CodecDeleter> &codec_context);
145 std::unique_ptr <Audio::LavAdapter>
output;
149 AVCodecContext *codec,
152 AVCodecContext *codec,
153 const int audio_stream);
157 virtual void setVolume (
float volume)
override;
160 virtual float playPoint (
void)
const override;
162 virtual void pausing (
void)
override;
163 virtual void resuming (
void)
override;
166 const std::string &media_url,
167 float audio_gain = 0);
Class to abstract away details of audio output system is in use.
Exception for audio output problems.
Definition: audiooutput.h:47
Adapter to feed a ffmpeg stream to an audio output.
Definition: ffmpegplayer.h:45
AVFilterContext * pushFilter(AVFilterContext *prior_filter, const char *name, const char *optionformat=nullptr,...)
Add a filter to the filter stack.
Definition: ffmpegadapter.cpp:74
void setVolume(float level)
Definition: ffmpegadapter.cpp:239
LavAdapter(const AVCodecContext *codec, const AVStream *stream, const AVSampleFormat output_format)
Adapt whatever output for input from ffmpeg.
Definition: ffmpegadapter.cpp:113
bool playFilteredPackets(const bool eof_return_value=true)
Read all the resulting frames coming out of the filter stack, and push them to the outputter.
Definition: ffmpegadapter.cpp:220
std::mutex adapter_mutex
Definition: ffmpegplayer.h:77
void flush()
Play any frames buffered in the filter.
Definition: ffmpegadapter.cpp:182
AVFilterContext * buffer_filter
Definition: ffmpegplayer.h:68
std::unique_ptr< AVFilterGraph, FilterGraphDeleter > filter_stack
Definition: ffmpegplayer.h:72
AVFilterContext * endpoint_filter
Definition: ffmpegplayer.h:71
virtual ~LavAdapter()
Definition: ffmpegadapter.cpp:177
AVFilterContext * format_filter
Definition: ffmpegplayer.h:70
bool play(AVFrame *frame)
Play a frame from a ffmpeg decoder.
Definition: ffmpegadapter.cpp:203
AVFilterContext * volume_filter
Definition: ffmpegplayer.h:69
static LavAdapter * getOutput(const AudioSettings &settings, const AVCodecContext *context, const AVStream *stream)
Choose an output, then get an adapter for libav and set it up to match the output's format.
Definition: ffmpegadapter.cpp:302
std::unique_ptr< AVFrame, FrameDeleter > output_frame
Definition: ffmpegplayer.h:76
virtual bool playFrame(AVFrame *frame)=0
Exception for ffmpeg audio output problems.
Definition: ffmpegplayer.h:38
LavAudioException(const char *func, int error)
Create an AudioException from a ffmpeg error.
Definition: ffmpegadapter.cpp:55
Adapter to feed a ffmpeg stream to a generic audio output.
Definition: ffmpegplayer.h:102
LavGenericAdapter(const AVCodecContext *codec, const AVStream *stream, Output *out, const AVSampleFormat output_format)
Adapt whatever output for input from ffmpeg.
Definition: ffmpegadapter.cpp:267
virtual bool playFrame(AVFrame *frame) override
Send a processed frame to the audio output device.
Definition: ffmpegadapter.cpp:282
~LavGenericAdapter()
Definition: ffmpegadapter.cpp:275
std::unique_ptr< Output > output
Definition: ffmpegplayer.h:103
ffmpeg audio player
Definition: ffmpegplayer.h:137
volatile Media::Player::State state
Definition: ffmpegplayer.h:144
float gain
Replay gain from track.
Definition: ffmpegplayer.h:140
virtual void setGain(float gain) override
Definition: ffmpegplayer.cpp:203
virtual void resuming(void) override
Called when the playback thread is resuming playback.
Definition: ffmpegplayer.cpp:197
bool playPacket(AVFrame *frame, AVCodecContext *codec, AVPacket *packet)
Definition: ffmpegplayer.cpp:220
virtual RESPONSE_CODE playerThread(void) override
Definition: ffmpegplayer.cpp:300
LavPlayer(const AudioSettings &AudioSettings, const std::string &media_url, float audio_gain=0)
Play a media file or URL using ffmpeg.
Definition: ffmpegplayer.cpp:165
virtual float trackDuration(void) const override
Length of track in seconds, or a negative number if unknown.
Definition: ffmpegplayer.cpp:178
volatile float duration
Length of song, in seconds.
Definition: ffmpegplayer.h:142
virtual State currentState(void) const override
Definition: ffmpegplayer.cpp:186
virtual void setVolume(float volume) override
Adjust volume in decibels.
Definition: ffmpegplayer.cpp:171
virtual void pausing(void) override
Called when the playback thread is pausing.
Definition: ffmpegplayer.cpp:191
std::unique_ptr< Audio::LavAdapter > output
Definition: ffmpegplayer.h:145
RESPONSE_CODE playStream(AVFormatContext *format, AVCodecContext *codec, const int audio_stream)
Definition: ffmpegplayer.cpp:267
virtual float playPoint(void) const override
Seconds from start, or a negative value if unknown.
Definition: ffmpegplayer.cpp:182
volatile float playpoint
Current point in song, in seconds.
Definition: ffmpegplayer.h:143
AudioSettings audio
Output settings.
Definition: ffmpegplayer.h:139
Base audio output class (abstract).
Definition: audiooutput.h:65
Essential data structures and support.
enum server_status_t RESPONSE_CODE
Classes dealing with audio output drivers and decoding/playing audio files.
Definition: audiooutput.cpp:48
void flogav(const char *func, int err)
Log an ffmpeg error.
Definition: ffmpegadapter.cpp:46
Definition: ffmpegplayer.h:54
void operator()(AVFilterGraph *filter)
Definition: ffmpegplayer.h:55
Definition: ffmpegplayer.h:61
void operator()(AVFrame *frame)
Definition: ffmpegplayer.h:62
Audio output device & driver parameters.
Definition: fundamentals.h:52