MythTV master
audiooutputjack.h
Go to the documentation of this file.
1#ifndef AUDIOOUTPUTJACK
2#define AUDIOOUTPUTJACK
3
4// Qt headers
5#include <QCoreApplication>
6
7#include <jack/jack.h>
8#include <jack/statistics.h>
9#include "audiooutputbase.h"
10#include "audiooutputsettings.h"
11
13static constexpr int8_t JACK_CHANNELS_MIN { 2 };
14static constexpr int8_t JACK_CHANNELS_MAX { 8 };
15
16using jack_port_array = std::array<jack_port_t*,JACK_CHANNELS_MAX>;
17using jack_vol_array = std::array<int,JACK_CHANNELS_MAX>;
18
20{
22
23 public:
24 explicit AudioOutputJACK(const AudioSettings &settings);
25 ~AudioOutputJACK() override;
26
27 // Volume control
28 int GetVolumeChannel(int channel) const override; // VolumeBase
29 void SetVolumeChannel(int channel, int volume) override; // VolumeBase
30
31 protected:
32
33 // You need to implement the following functions
34 bool OpenDevice(void) override; // AudioOutputBase
35 void CloseDevice(void) override; // AudioOutputBase
36 void WriteAudio(unsigned char *aubuf, int size) override; // AudioOutputBase
37 int GetBufferedOnSoundcard(void) const override; // AudioOutputBase
38 AudioOutputSettings* GetOutputSettings(bool digital) override; // AudioOutputBase
39
40 // Overriding these to do nothing. Not needed here.
41 bool StartOutputThread(void) override; // AudioOutputBase
42 void StopOutputThread(void) override; // AudioOutputBase
43
44 private:
45
46 void VolumeInit(void);
47
48 // Our various callback functions
49 inline int JackCallback(jack_nframes_t nframes);
50 static int JackCallbackHelper(jack_nframes_t nframes, void *arg);
51 inline int JackXRunCallback();
52 static int JackXRunCallbackHelper(void *arg);
53 inline int JackGraphOrderCallback();
54 static int JackGraphOrderCallbackHelper(void *arg);
55
56 static jack_client_t* JackClientOpen(void);
57 const char** JackGetPorts(void);
58 bool JackConnectPorts(const char** /*matching_ports*/);
59 inline void JackClientClose(jack_client_t **client);
60
61 void DeinterleaveAudio(const float *aubuf, float **bufs,
62 int nframes, const jack_vol_array& channel_volumes);
63
66 jack_client_t *m_client {nullptr};
67 jack_client_t *m_staleClient {nullptr};
69 int m_jackXruns {0};
70 unsigned char *m_auBuf {nullptr};
71
72
73};
74
75#endif
76
static constexpr int8_t JACK_CHANNELS_MIN
maximum number of channels supported, avoids lots of mallocs
std::array< int, JACK_CHANNELS_MAX > jack_vol_array
static constexpr int8_t JACK_CHANNELS_MAX
std::array< jack_port_t *, JACK_CHANNELS_MAX > jack_port_array
static int JackXRunCallbackHelper(void *arg)
Q_DECLARE_TR_FUNCTIONS(AudioOutputJACK)
void CloseDevice(void) override
void JackClientClose(jack_client_t **client)
jack_client_t * m_client
static int JackCallbackHelper(jack_nframes_t nframes, void *arg)
const char ** JackGetPorts(void)
void StopOutputThread(void) override
void SetVolumeChannel(int channel, int volume) override
static int JackGraphOrderCallbackHelper(void *arg)
int JackCallback(jack_nframes_t nframes)
jack_vol_array m_chanVolumes
AudioOutputJACK(const AudioSettings &settings)
unsigned char * m_auBuf
AudioOutputSettings * GetOutputSettings(bool digital) override
~AudioOutputJACK() override
jack_client_t * m_staleClient
static jack_client_t * JackClientOpen(void)
void DeinterleaveAudio(const float *aubuf, float **bufs, int nframes, const jack_vol_array &channel_volumes)
void WriteAudio(unsigned char *aubuf, int size) override
bool OpenDevice(void) override
bool JackConnectPorts(const char **)
int GetVolumeChannel(int channel) const override
int GetBufferedOnSoundcard(void) const override
Return the size in bytes of frames currently in the audio buffer adjusted with the audio playback lat...
bool StartOutputThread(void) override
jack_port_array m_ports