From 791eb12b3e616dd05078838731acc66782f8b6a1 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sun, 5 Oct 2014 14:05:25 +0100 Subject: [PATCH] [PiSink] Allow audio output latency to be set in settings [pisink] testing: Reduce audio output latency to 50ms --- .../resource.language.en_gb/resources/strings.po | 14 ++++++++++++++ system/settings/rbp.xml | 12 ++++++++++++ xbmc/cores/AudioEngine/Sinks/AESinkPi.cpp | 13 ++++++++----- xbmc/cores/AudioEngine/Sinks/AESinkPi.h | 1 + 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index fa37d7a02d9ac..65eedab00d753 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -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 "" diff --git a/system/settings/rbp.xml b/system/settings/rbp.xml index 6d703ae2feac1..b296cf65f14ed 100644 --- a/system/settings/rbp.xml +++ b/system/settings/rbp.xml @@ -108,6 +108,18 @@ PI:HDMI + + 3 + 50 + + 50 + 50 + 300 + + + 38193 + + 3 0 diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkPi.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkPi.cpp index 00b7787dd684b..33dd763a38e0a 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkPi.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkPi.cpp @@ -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) @@ -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), @@ -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") @@ -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); @@ -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) @@ -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(1000.0f * (delay - AUDIO_PLAYBUFFER))); + if (delay > m_latency) + KODI::TIME::Sleep(static_cast(1000.0f * (delay - m_latency))); return frames; } diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkPi.h b/xbmc/cores/AudioEngine/Sinks/AESinkPi.h index 3003bf90a97e9..0e9dec0b02540 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkPi.h +++ b/xbmc/cores/AudioEngine/Sinks/AESinkPi.h @@ -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;