Skip to content

Commit

Permalink
[PiSink] Allow audio output latency to be set in settings
Browse files Browse the repository at this point in the history
[pisink] testing: Reduce audio output latency to 50ms
  • Loading branch information
popcornmix committed Apr 3, 2020
1 parent 5d98919 commit 791eb12
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 5 deletions.
14 changes: 14 additions & 0 deletions addons/resource.language.en_gb/resources/strings.po
Original file line number Diff line number Diff line change
Expand Up @@ -22047,3 +22047,17 @@ msgstr ""
msgctxt "#38206"
msgid "Max"
msgstr ""

msgctxt "#38191"
msgid "Audio output latency"
msgstr ""

#: system/settings/rbp.xml
msgctxt "#38192"
msgid "Increase this to protect against underruns, reduce to have lower latency gui sounds"
msgstr ""

#: system/settings/rbp.xml
msgctxt "#38193"
msgid "%i ms"
msgstr ""
12 changes: 12 additions & 0 deletions system/settings/rbp.xml
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,18 @@
<setting id="audiooutput.audiodevice">
<default>PI:HDMI</default>
</setting>
<setting id="audiooutput.latency" type="integer" label="38191" help="38192">
<level>3</level>
<default>50</default>
<constraints>
<minimum>50</minimum>
<step>50</step>
<maximum>300</maximum>
</constraints>
<control type="spinner" format="string">
<formatlabel>38193</formatlabel>
</control>
</setting>
<setting id="audiooutput.plladjust" type="integer" label="38200" help="38201">
<level>3</level>
<default>0</default>
Expand Down
13 changes: 8 additions & 5 deletions xbmc/cores/AudioEngine/Sinks/AESinkPi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
#define CLASSNAME "CAESinkPi"

#define NUM_OMX_BUFFERS 2
#define AUDIO_PLAYBUFFER (0.1) // 100ms

#ifdef OMX_SKIP64BIT
static inline OMX_TICKS ToOMXTime(int64_t pts)
Expand All @@ -45,6 +44,7 @@ CAEDeviceInfo CAESinkPi::m_info;

CAESinkPi::CAESinkPi() :
m_sinkbuffer_sec_per_byte(0),
m_latency(0),
m_Initialized(false),
m_submitted(0),
m_omx_output(NULL),
Expand Down Expand Up @@ -213,6 +213,9 @@ bool CAESinkPi::Initialize(AEAudioFormat &format, std::string &device)
m_initDevice = device;
m_initFormat = format;

m_latency = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt("audiooutput.latency") * 1e-3;
m_latency = std::max(m_latency, 50e-3);

const std::string audioDevice = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE);

if (m_passthrough || audioDevice == "PI:HDMI")
Expand All @@ -238,7 +241,7 @@ bool CAESinkPi::Initialize(AEAudioFormat &format, std::string &device)
unsigned int sample_size = CAEUtil::DataFormatToBits(format.m_dataFormat) >> 3;
format.m_frameSize = sample_size * channels;
format.m_sampleRate = std::max(8000U, std::min(192000U, format.m_sampleRate));
format.m_frames = format.m_sampleRate * AUDIO_PLAYBUFFER / NUM_OMX_BUFFERS;
format.m_frames = format.m_sampleRate * m_latency / NUM_OMX_BUFFERS;

m_format = format;
m_sinkbuffer_sec_per_byte = 1.0 / (double)(m_format.m_frameSize * m_format.m_sampleRate);
Expand Down Expand Up @@ -456,7 +459,7 @@ void CAESinkPi::GetDelay(AEDelayStatus& status)

double CAESinkPi::GetCacheTotal()
{
return AUDIO_PLAYBUFFER;
return m_latency;
}

unsigned int CAESinkPi::AddPackets(uint8_t **data, unsigned int frames, unsigned int offset)
Expand Down Expand Up @@ -509,8 +512,8 @@ unsigned int CAESinkPi::AddPackets(uint8_t **data, unsigned int frames, unsigned
m_submitted++;
GetDelay(status);
delay = status.GetDelay();
if (delay > AUDIO_PLAYBUFFER)
KODI::TIME::Sleep(static_cast<int>(1000.0f * (delay - AUDIO_PLAYBUFFER)));
if (delay > m_latency)
KODI::TIME::Sleep(static_cast<int>(1000.0f * (delay - m_latency)));
return frames;
}

Expand Down
1 change: 1 addition & 0 deletions xbmc/cores/AudioEngine/Sinks/AESinkPi.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class CAESinkPi : public IAESink
AEAudioFormat m_initFormat;
AEAudioFormat m_format;
double m_sinkbuffer_sec_per_byte;
double m_latency;
static CAEDeviceInfo m_info;
bool m_Initialized;
uint32_t m_submitted;
Expand Down

0 comments on commit 791eb12

Please sign in to comment.