mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-28 13:16:41 +00:00
kodi: add PR5682
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
fbed78c45f
commit
b444bcbeff
141
packages/mediacenter/kodi/patches/kodi-999.92-PR5682.patch
Normal file
141
packages/mediacenter/kodi/patches/kodi-999.92-PR5682.patch
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
From 970ff0341f05a0adfe3ca79e5fba26a7070a12b7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: fritsch <Peter.Fruehberger@gmail.com>
|
||||||
|
Date: Sun, 9 Nov 2014 17:46:10 +0100
|
||||||
|
Subject: [PATCH 2/2] AESinkALSA: Allow fragmentation, e.g. even multiply of
|
||||||
|
PeriodSize
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp | 66 ++++++++++++++++++++++-------
|
||||||
|
xbmc/cores/AudioEngine/Sinks/AESinkALSA.h | 4 +-
|
||||||
|
2 files changed, 53 insertions(+), 17 deletions(-)
|
||||||
|
|
||||||
|
diff -Naur kodi-14-2d88a9a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp kodi-14-2d88a9a.patch/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp
|
||||||
|
--- kodi-14-2d88a9a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp 2014-11-09 22:28:18.035651639 +0100
|
||||||
|
+++ kodi-14-2d88a9a.patch/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp 2014-11-10 00:35:57.351393193 +0100
|
||||||
|
@@ -39,6 +39,8 @@
|
||||||
|
#include "utils/AMLUtils.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+
|
||||||
|
+#define AE_MIN_PERIODSIZE 256
|
||||||
|
#define ALSA_CHMAP_KERNEL_BLACKLIST
|
||||||
|
|
||||||
|
#define ALSA_OPTIONS (SND_PCM_NO_AUTO_FORMAT | SND_PCM_NO_AUTO_CHANNELS | SND_PCM_NO_AUTO_RESAMPLE)
|
||||||
|
@@ -86,7 +88,9 @@
|
||||||
|
m_formatSampleRateMul(0.0),
|
||||||
|
m_passthrough(false),
|
||||||
|
m_pcm(NULL),
|
||||||
|
- m_timeout(0)
|
||||||
|
+ m_timeout(0),
|
||||||
|
+ m_fragmented(false),
|
||||||
|
+ m_originalPeriodSize(AE_MIN_PERIODSIZE)
|
||||||
|
{
|
||||||
|
/* ensure that ALSA has been initialized */
|
||||||
|
if (!snd_config)
|
||||||
|
@@ -479,7 +483,8 @@
|
||||||
|
|
||||||
|
params += ",AES1=0x82,AES2=0x00";
|
||||||
|
|
||||||
|
- if (format.m_sampleRate == 192000) params += ",AES3=0x0e";
|
||||||
|
+ if (m_passthrough && format.m_channelLayout.Count() == 8) params += ",AES3=0x09";
|
||||||
|
+ else if (format.m_sampleRate == 192000) params += ",AES3=0x0e";
|
||||||
|
else if (format.m_sampleRate == 176400) params += ",AES3=0x0c";
|
||||||
|
else if (format.m_sampleRate == 96000) params += ",AES3=0x0a";
|
||||||
|
else if (format.m_sampleRate == 88200) params += ",AES3=0x08";
|
||||||
|
@@ -806,7 +811,19 @@
|
||||||
|
|
||||||
|
/* set the format parameters */
|
||||||
|
outconfig.sampleRate = sampleRate;
|
||||||
|
- outconfig.periodSize = periodSize;
|
||||||
|
+
|
||||||
|
+ /* if periodSize is too small Audio Engine might starve */
|
||||||
|
+ m_fragmented = false;
|
||||||
|
+ unsigned int fragments = 1;
|
||||||
|
+ if (periodSize < AE_MIN_PERIODSIZE)
|
||||||
|
+ {
|
||||||
|
+ fragments = std::ceil((double) AE_MIN_PERIODSIZE / periodSize);
|
||||||
|
+ CLog::Log(LOGDEBUG, "Audio Driver reports too low periodSize %d - will use %d fragments", (int) periodSize, (int) fragments);
|
||||||
|
+ m_fragmented = true;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ m_originalPeriodSize = periodSize;
|
||||||
|
+ outconfig.periodSize = fragments * periodSize;
|
||||||
|
outconfig.frameSize = snd_pcm_frames_to_bytes(m_pcm, 1);
|
||||||
|
|
||||||
|
m_bufferSize = (unsigned int)bufferSize;
|
||||||
|
@@ -893,27 +910,45 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
void *buffer = data[0]+offset*m_format.m_frameSize;
|
||||||
|
- int ret = snd_pcm_writei(m_pcm, buffer, frames);
|
||||||
|
- if (ret < 0)
|
||||||
|
- {
|
||||||
|
- CLog::Log(LOGERROR, "CAESinkALSA - snd_pcm_writei(%d) %s - trying to recover", ret, snd_strerror(ret));
|
||||||
|
- ret = snd_pcm_recover(m_pcm, ret, 1);
|
||||||
|
- if(ret < 0)
|
||||||
|
- {
|
||||||
|
- HandleError("snd_pcm_writei(1)", ret);
|
||||||
|
- ret = snd_pcm_writei(m_pcm, buffer, frames);
|
||||||
|
- if (ret < 0)
|
||||||
|
+ unsigned int amount = 0;
|
||||||
|
+ int64_t data_left = (int64_t) frames;
|
||||||
|
+ int frames_written = 0;
|
||||||
|
+
|
||||||
|
+ while (data_left > 0)
|
||||||
|
+ {
|
||||||
|
+ if (m_fragmented)
|
||||||
|
+ amount = std::min((unsigned int) data_left, m_originalPeriodSize);
|
||||||
|
+ else // take care as we can come here a second time if the sink does not eat all data
|
||||||
|
+ amount = (unsigned int) data_left;
|
||||||
|
+
|
||||||
|
+ int ret = snd_pcm_writei(m_pcm, buffer, amount);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ {
|
||||||
|
+ CLog::Log(LOGERROR, "CAESinkALSA - snd_pcm_writei(%d) %s - trying to recover", ret, snd_strerror(ret));
|
||||||
|
+ ret = snd_pcm_recover(m_pcm, ret, 1);
|
||||||
|
+ if(ret < 0)
|
||||||
|
{
|
||||||
|
- HandleError("snd_pcm_writei(2)", ret);
|
||||||
|
- ret = 0;
|
||||||
|
+ HandleError("snd_pcm_writei(1)", ret);
|
||||||
|
+ ret = snd_pcm_writei(m_pcm, buffer, amount);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ {
|
||||||
|
+ HandleError("snd_pcm_writei(2)", ret);
|
||||||
|
+ ret = 0;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- }
|
||||||
|
|
||||||
|
- if ( ret > 0 && snd_pcm_state(m_pcm) == SND_PCM_STATE_PREPARED)
|
||||||
|
- snd_pcm_start(m_pcm);
|
||||||
|
+ if ( ret > 0 && snd_pcm_state(m_pcm) == SND_PCM_STATE_PREPARED)
|
||||||
|
+ snd_pcm_start(m_pcm);
|
||||||
|
|
||||||
|
- return ret;
|
||||||
|
+ if (ret <= 0)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ frames_written += ret;
|
||||||
|
+ data_left -= ret;
|
||||||
|
+ buffer = data[0]+offset*m_format.m_frameSize + frames_written*m_format.m_frameSize;
|
||||||
|
+ }
|
||||||
|
+ return frames_written;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAESinkALSA::HandleError(const char* name, int err)
|
||||||
|
diff -Naur kodi-14-2d88a9a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h kodi-14-2d88a9a.patch/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h
|
||||||
|
--- kodi-14-2d88a9a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h 2014-11-09 22:28:18.036651638 +0100
|
||||||
|
+++ kodi-14-2d88a9a.patch/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h 2014-11-10 00:36:24.936426057 +0100
|
||||||
|
@@ -90,6 +90,10 @@
|
||||||
|
#endif
|
||||||
|
static CALSAHControlMonitor m_controlMonitor;
|
||||||
|
|
||||||
|
+ // support fragmentation, e.g. looping in the sink to get a certain amount of data onto the device
|
||||||
|
+ bool m_fragmented;
|
||||||
|
+ unsigned int m_originalPeriodSize;
|
||||||
|
+
|
||||||
|
struct ALSAConfig
|
||||||
|
{
|
||||||
|
unsigned int sampleRate;
|
@ -1,29 +0,0 @@
|
|||||||
From 22477eaf1286dd28fb87552d35e9c8a5dbc09658 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Rudi <r.ihle@s-t.de>
|
|
||||||
Date: Sat, 9 Aug 2014 18:09:03 +0200
|
|
||||||
Subject: [PATCH] AESinkALSA: Set correct value for AES3 when using HBR mode
|
|
||||||
|
|
||||||
According to the HDMI 1.4a document, the only acceptable value
|
|
||||||
for AES3 in HBR mode is 0x09, which corresponds to a frame rate
|
|
||||||
of 768000. Some sinks or drivers ignore this, but some do not.
|
|
||||||
---
|
|
||||||
xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp | 3 ++-
|
|
||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp
|
|
||||||
index c608231..322b8de 100644
|
|
||||||
--- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp
|
|
||||||
+++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp
|
|
||||||
@@ -156,7 +156,8 @@ void CAESinkALSA::GetAESParams(AEAudioFormat format, std::string& params)
|
|
||||||
|
|
||||||
params += ",AES1=0x82,AES2=0x00";
|
|
||||||
|
|
||||||
- if (format.m_sampleRate == 192000) params += ",AES3=0x0e";
|
|
||||||
+ if (m_passthrough && format.m_channelLayout.Count() == 8) params += ",AES3=0x09";
|
|
||||||
+ else if (format.m_sampleRate == 192000) params += ",AES3=0x0e";
|
|
||||||
else if (format.m_sampleRate == 176400) params += ",AES3=0x0c";
|
|
||||||
else if (format.m_sampleRate == 96000) params += ",AES3=0x0a";
|
|
||||||
else if (format.m_sampleRate == 88200) params += ",AES3=0x08";
|
|
||||||
--
|
|
||||||
2.0.3
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
|||||||
--- xbmc-master-14-dae6f76/./xbmc/cores/AudioEngine/AESinkFactory.cpp.orig 2014-07-07 18:30:37.000000000 +0200
|
|
||||||
+++ xbmc-master-14-dae6f76/./xbmc/cores/AudioEngine/AESinkFactory.cpp 2014-07-15 10:30:16.513471771 +0200
|
|
||||||
@@ -134,7 +134,7 @@
|
|
||||||
CLog::Log(LOGERROR, "Sink %s:%s returned invalid sample rate", driver.c_str(), device.c_str());
|
|
||||||
else if (format.m_channelLayout.Count() == 0)
|
|
||||||
CLog::Log(LOGERROR, "Sink %s:%s returned invalid channel layout", driver.c_str(), device.c_str());
|
|
||||||
- else if (format.m_frames < 256)
|
|
||||||
+ else if (format.m_frames < 96)
|
|
||||||
CLog::Log(LOGERROR, "Sink %s:%s returned invalid buffer size: %d", driver.c_str(), device.c_str(), format.m_frames);
|
|
||||||
else
|
|
||||||
return sink;
|
|
Loading…
x
Reference in New Issue
Block a user