MythTV master
audiooutputopensles.h
Go to the documentation of this file.
1#ifndef AUDIOOUTPUTOPENSLES
2#define AUDIOOUTPUTOPENSLES
3
4#include <QMutex>
5// For native audio
6#include <SLES/OpenSLES.h>
7#include <SLES/OpenSLES_Android.h>
8#include <jni.h>
9
10// MythTV headers
11#include "audiooutputbase.h"
12
13using slCreateEngine_t = SLresult (*)(
14 SLObjectItf*, SLuint32, const SLEngineOption*, SLuint32,
15 const SLInterfaceID*, const SLboolean*);
16
18{
20 public:
21 explicit AudioOutputOpenSLES(const AudioSettings &settings);
22 ~AudioOutputOpenSLES() override;
23
24 protected:
25 bool OpenDevice(void) override; // AudioOutputBase
26 void CloseDevice(void) override; // AudioOutputBase
27 void WriteAudio(unsigned char *aubuf, int size) override; // AudioOutputBase
28 int GetBufferedOnSoundcard(void) const override; // AudioOutputBase
29 AudioOutputSettings* GetOutputSettings(bool digital) override; // AudioOutputBase
30
31 // Volume control
32 int GetVolumeChannel(int channel) const override; // VolumeBase
33 void SetVolumeChannel(int channel, int volume) override; // VolumeBase
34
35 private:
36 int GetNumberOfBuffersQueued() const;
37
38 //static const uint kPacketCnt;
39
40 bool CreateEngine();
41 static void SPlayedCallback(SLAndroidSimpleBufferQueueItf caller, void *pContext);
42 void PlayedCallback(SLAndroidSimpleBufferQueueItf caller);
43 bool StartPlayer();
44 bool Stop();
45 bool Open();
46 void Close();
47
48 private:
49 /* OpenSL objects */
50 SLObjectItf m_engineObject {nullptr};
51 SLObjectItf m_outputMixObject {nullptr};
52 SLAndroidSimpleBufferQueueItf m_playerBufferQueue {nullptr};
53 SLObjectItf m_playerObject {nullptr};
54 SLVolumeItf m_volumeItf {nullptr};
55 SLEngineItf m_engineEngine {nullptr};
56 SLPlayItf m_playerPlay {nullptr};
57
58 /* OpenSL symbols */
59 void *m_soHandle {nullptr};
60
62 SLInterfaceID m_slIidEngine {nullptr};
63 SLInterfaceID m_slIidAndroidSimpleBufferQueue {nullptr};
64 SLInterfaceID m_slIidVolume {nullptr};
65 SLInterfaceID m_slIidPlay {nullptr};
66
67 /* audio buffered through opensles */
68 std::vector<uint8_t> m_buf;
69 int m_bufWriteBase {0}; // always fragment aligned
70 int m_bufWriteIndex {0}; // offset from base
71
72 /* if we can measure latency already */
73 bool m_started {false};
75
76 QMutex m_lock;
77
78};
79
80#endif // AUDIOOUTPUTOPENSLES
SLresult(*)(SLObjectItf *, SLuint32, const SLEngineOption *, SLuint32, const SLInterfaceID *, const SLboolean *) slCreateEngine_t
static void SPlayedCallback(SLAndroidSimpleBufferQueueItf caller, void *pContext)
std::vector< uint8_t > m_buf
void SetVolumeChannel(int channel, int volume) override
friend class AudioOutputOpenSLESPrivate
void WriteAudio(unsigned char *aubuf, int size) override
slCreateEngine_t m_slCreateEnginePtr
void PlayedCallback(SLAndroidSimpleBufferQueueItf caller)
AudioOutputSettings * GetOutputSettings(bool digital) override
AudioOutputOpenSLES(const AudioSettings &settings)
SLInterfaceID m_slIidEngine
int GetBufferedOnSoundcard(void) const override
Return the size in bytes of frames currently in the audio buffer adjusted with the audio playback lat...
int GetNumberOfBuffersQueued() const
SLAndroidSimpleBufferQueueItf m_playerBufferQueue
SLInterfaceID m_slIidVolume
SLInterfaceID m_slIidAndroidSimpleBufferQueue
int GetVolumeChannel(int channel) const override
bool OpenDevice(void) override
void CloseDevice(void) override