1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm
#pragma once
#include "libvideostitch/stitchOutput.hpp"
#include "libvideostitch/plugin.hpp"
#include "libvideostitch/ptv.hpp"
#include "libvideostitch/config.hpp"
#include "libvideostitch/circularBuffer.hpp"
#include "portaudio.h"
#include <condition_variable>
#include <string>
#include <queue>
#include <thread>
namespace VideoStitch {
namespace Output {
/**
* PortAudio audio writer
*/
class PortAudioWriter : public AudioWriter {
public:
struct paDevice {
PaStream* stream;
PaStreamParameters params;
const PaDeviceInfo* devInfo;
double sampleRate;
mtime_t offset;
};
static Potential<PortAudioWriter> create(const Ptv::Value* config,
const VideoStitch::Plugin::VSWriterPlugin::Config& runtime);
static bool handles(const Ptv::Value* config);
virtual ~PortAudioWriter();
void pushAudio(Audio::Samples& audioSamples) override;
private:
PortAudioWriter(const Plugin::VSWriterPlugin::Config& runtime, const paDevice paDev);
void startStream();
// See portaudio.h
static int paPlayCallback(const void* inputBuffer, void* outputBuffer, unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags,
void* userData);
static void paStreamFinished(void* userData);
bool stopping;
paDevice dev;
std::mutex m;
CircularBuffer<float> audioData;
mtime_t audioDataTimestamp;
mtime_t audioDataTimestampLast;
size_t audioBufferSize;
bool audioBufferOverflow;
}; // class PortAudioWriter
} // namespace Output
} // namespace VideoStitch