2#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
3#include <QAndroidJniObject>
4#include <QAndroidJniEnvironment>
7#include <QJniEnvironment>
9#define QAndroidJniEnvironment QJniEnvironment
10#define QAndroidJniObject QJniObject
12#include <android/log.h>
20#define ANDROID_EXCEPTION_CHECK \
21 if (env->ExceptionCheck()) { \
22 env->ExceptionDescribe(); \
23 env->ExceptionClear(); \
29#define ANDROID_EXCEPTION_CLEAR \
30 if (env->ExceptionCheck()) { \
31 env->ExceptionDescribe(); \
32 env->ExceptionClear(); \
35#define LOC QString("AudioTrack: ")
51#include <android/log.h>
95 case AV_CODEC_ID_EAC3:
98 case AV_CODEC_ID_TRUEHD:
103 LOG(VB_GENERAL, LOG_ERR,
LOC + __func__ + QString(
" No support for audio passthru encoding %1").arg(
m_codec));
124 LOG(VB_GENERAL, LOG_ERR,
LOC + __func__ + QString(
" No support for audio format %1").arg(
m_outputFormat));
134 "(IIII)V", encoding, sampleRate, minBufferSize,
channels);
139 LOG(VB_GENERAL, LOG_ERR,
LOC + __func__ + QString(
" Java Exception when creating AudioTrack"));
146 m_audioTrack->callMethod<
void>(
"setBitsPer10Frames",
"(I)V",bitsPer10Frames);
165 bool exception=
false;
171 int supportedrate = 0;
172 while (
int rate = settings->GetNextRate())
176 bufsize = QAndroidJniObject::callStaticMethod<jint>
177 (
"android/media/AudioTrack",
"getMinBufferSize",
"(III)I",
180 if (bufsize > 0 && !exception)
182 settings->AddSupportedRate(rate);
184 supportedrate = rate;
189 bufsize = QAndroidJniObject::callStaticMethod<jint>
190 (
"android/media/AudioTrack",
"getMinBufferSize",
"(III)I",
193 if (bufsize > 0 && !exception)
198 bufsize = QAndroidJniObject::callStaticMethod<jint>
199 (
"android/media/AudioTrack",
"getMinBufferSize",
"(III)I",
202 if (bufsize > 0 && !exception)
207 settings->AddSupportedChannels(
channels);
209 settings->setPassthrough(0);
216 bool exception=
false;
222 jboolean param =
true;
229 jbyteArray arr = env->NewByteArray(size);
230 env->SetByteArrayRegion(arr, 0, size,
reinterpret_cast<jbyte*
>(aubuf));
234 ret =
m_audioTrack->callMethod<jint>(
"write",
"([BI)I", arr, size);
237 env->DeleteLocalRef(arr);
238 if (ret != size || exception)
239 LOG(VB_GENERAL, LOG_ERR,
LOC + __func__
240 + QString(
" Audio Write failed, size %1 return %2 exception %3")
241 .arg(size).arg(ret).arg(exception));
243 LOG(VB_AUDIO | VB_TIMESTAMP, LOG_INFO,
LOC + __func__
244 + QString(
" WriteAudio size=%1 written=%2")
245 .arg(size).arg(ret));
259 bool exception=
false;
264 =
m_audioTrack->callMethod<jint>(
"getLatencyViaHeadPosition");
275 std::chrono::milliseconds timecode,
int in_frames)
278 (in_buffer, in_len, timecode,in_frames);
288 jboolean param = paused;
302 m_audioTrack->callMethod<
void>(
"setBitsPer10Frames",
"(I)V",bitsPer10Frames);
311 m_audioTrack->callMethod<
void>(
"setOutputThread",
"(Z)V",
true);
323 m_audioTrack->callMethod<
void>(
"setOutputThread",
"(Z)V",
false);
#define QAndroidJniEnvironment
static constexpr uint8_t CHANNELS_MAX
#define ANDROID_EXCEPTION_CLEAR
static constexpr uint8_t CHANNELS_MIN
#define ANDROID_EXCEPTION_CHECK
#define QAndroidJniObject
@ AF_ENCODING_DOLBY_TRUEHD
void Pause(bool paused) override
AudioOutputSettings * GetOutputSettings(bool digital) override
int GetBufferedOnSoundcard(void) const override
Return the size in bytes of frames currently in the audio buffer adjusted with the audio playback lat...
void StopOutputThread(void) override
bool OpenDevice(void) override
QAndroidJniObject * m_audioTrack
bool AddData(void *buffer, int len, std::chrono::milliseconds timecode, int frames) override
Add data to the audiobuffer for playback.
AudioOutputAudioTrack(const AudioSettings &settings)
void CloseDevice(void) override
bool StartOutputThread(void) override
void WriteAudio(unsigned char *aubuf, int size) override
void SetSourceBitrate(int rate) override
~AudioOutputAudioTrack() override
void KillAudio(void)
Kill the output thread and cleanup.
virtual void StopOutputThread(void)
void Reconfigure(const AudioSettings &settings) override
(Re)Configure AudioOutputBase
virtual bool StartOutputThread(void)
AudioFormat m_outputFormat
int m_outputBytesPerFrame
long m_soundcardBufferSize
void InitSettings(const AudioSettings &settings)
bool AddData(void *buffer, int len, std::chrono::milliseconds timecode, int frames) override
Add data to the audiobuffer and perform any required processing.
void Pause(bool paused) override
void SetSourceBitrate(int rate) override
Set the bitrate of the source material, reported in periodic AudioOutput::Events.
const int & channels() const
bool m_init
If set to false, AudioOutput instance will not try to initially open the audio device.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)