1 ///
2 /// Output using ffmpeg's libavdevices libraries.
3 ///	@file		avdeviceoutput.h - pianod2
4 ///	@author		Perette Barella
5 ///	@date		2016-02-04
6 ///	@copyright	Copyright (c) 2016-2018 Devious Fish. All rights reserved.
7 ///
8 
9 #ifndef __pianod2__avdeviceoutput__
10 #define __pianod2__avdeviceoutput__
11 
12 #include <config.h>
13 
14 #include <memory>
15 
16 #pragma GCC diagnostic push
17 #pragma GCC diagnostic ignored "-Wdocumentation"
18 extern "C" {
19 #include <libavformat/avformat.h>
20 #include <libavcodec/avcodec.h>
21 }
22 #pragma GCC diagnostic pop
23 
24 #include "audiooutput.h"
25 
26 namespace Audio {
27     /// Output class for libavdevice.
28     class AvDeviceOutput : public Output {
29         struct CodecDeleter {
operatorCodecDeleter30             void operator() (AVCodecContext *coder) {
31                 avcodec_free_context (&coder);
32             }
33         };
34 
35         AVCodec *codec = nullptr;
36         AVFormatContext *context = nullptr;
37         AVStream *stream = nullptr;
38         std::unique_ptr <AVCodecContext, CodecDeleter> codec_context;
39         AVPacket packet;
40         int min_flush_time = 0; ///< milliseconds
41         int max_flush_time = 2000; ///< milliseconds
42         const int flush_time_quanta = 100; ///< milliseconds
43     public:
44         AvDeviceOutput (const AudioSettings &settings,
45                         const AudioFormat &format);
46         virtual ~AvDeviceOutput ();
47         virtual bool play (void *buffer, unsigned numberOfBytes) override;
48     };
49 
50 }
51 
52 #endif /* defined(__pianod2__avdeviceoutput__) */
53