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