mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-29 13:46:49 +00:00
projects/Odroid_C2: Revert HK Audio & enable multichannel PCM & HD passthrough
Firstly revert all custom HardKernel Kernel audio mods for HiFi Shield and USB DAC The HardKernel HiFi Shield Plus works out of the box after these patches anyway. - tweak linux.aarch64.conf - add AML PCM 8CH patch Then add kszaq's - enable multichannel PCM and HD Audio passthrough: This patch enables multichannel PCM, Dolby TrueHD and DTS-HD MA audio passthrough to capable AVRs. - remove asound.conf as it is no longer needed - add ALSA configuration to enable multichannel PCM output - add Kodi patch to set digital_codec parameter on audio type change - remove Kodi workaround to identify audio output as SPDIF - add Kodi workaround to identify audio output as HDMI and choose a proper device for passthrough - add kernel patch to limit available sampling frequencies
This commit is contained in:
parent
ea3920fcf4
commit
9920d90f5f
@ -1,12 +0,0 @@
|
||||
pcm.!default {
|
||||
type plug
|
||||
slave {
|
||||
pcm "hw:0,0"
|
||||
format S16_LE
|
||||
}
|
||||
}
|
||||
|
||||
ctl.!default {
|
||||
type hw
|
||||
card 0
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
#
|
||||
# Configuration for Amlogic M8 Audio
|
||||
#
|
||||
|
||||
AML-M8AUDIO.pcm.default {
|
||||
@args [ CARD ]
|
||||
@args.CARD { type string }
|
||||
type plug
|
||||
slave.pcm {
|
||||
@func concat
|
||||
strings [ "dmix:" $CARD ]
|
||||
}
|
||||
}
|
||||
|
||||
<confdir:pcm/front.conf>
|
||||
|
||||
AML-M8AUDIO.pcm.front.0 {
|
||||
@args [ CARD ]
|
||||
@args.CARD { type string }
|
||||
type hw
|
||||
card $CARD
|
||||
device 0
|
||||
format S32_LE
|
||||
}
|
||||
|
||||
<confdir:pcm/surround71.conf>
|
||||
|
||||
AML-M8AUDIO.pcm.surround71.0 {
|
||||
@args [ CARD ]
|
||||
@args.CARD { type string }
|
||||
type route
|
||||
ttable.0.0 1
|
||||
ttable.1.1 1
|
||||
ttable.2.6 1
|
||||
ttable.3.7 1
|
||||
ttable.4.3 1
|
||||
ttable.5.2 1
|
||||
ttable.6.4 1
|
||||
ttable.7.5 1
|
||||
slave.pcm {
|
||||
type plug
|
||||
slave {
|
||||
pcm {
|
||||
type hw
|
||||
card $CARD
|
||||
device 0
|
||||
}
|
||||
channels 8
|
||||
format S32_LE
|
||||
}
|
||||
}
|
||||
}
|
@ -2648,13 +2648,10 @@ CONFIG_SND_SOC=y
|
||||
# CONFIG_SND_DESIGNWARE_I2S is not set
|
||||
CONFIG_SND_AML_M8_SOC=y
|
||||
CONFIG_SND_AML_M8=y
|
||||
CONFIG_SND_ODROID_HDMI=y
|
||||
CONFIG_SND_ODROID_DAC=y
|
||||
# CONFIG_SND_AML_G9TV is not set
|
||||
CONFIG_SND_SOC_I2C_AND_SPI=y
|
||||
CONFIG_SND_SOC_DUMMY_CODEC=y
|
||||
CONFIG_SND_SOC_PCM2BT=y
|
||||
CONFIG_SND_SOC_PCM5102=y
|
||||
# CONFIG_SND_SIMPLE_CARD is not set
|
||||
# CONFIG_SOUND_PRIME is not set
|
||||
|
||||
|
@ -0,0 +1,102 @@
|
||||
From a49dd2258d46279466d5aaba44d1f0ee06253ff2 Mon Sep 17 00:00:00 2001
|
||||
From: kszaq <kszaquitto@gmail.com>
|
||||
Date: Sun, 4 Sep 2016 00:51:03 +0200
|
||||
Subject: [PATCH] [aml] Multichannel-PCM and HD Audio passthrough
|
||||
|
||||
1. If we want passthrough, is should be redirected to device 1. To make sure device 1 output is enabled, set device 0 to stereo.
|
||||
2. Set digital_codec parameter to notify sound driver about audio format.
|
||||
3. Amlogic wants 48kHz for EAC3 passthrough.
|
||||
4. Identify Amlogic audio output as HDMI.
|
||||
---
|
||||
xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp | 59 +++++++++++++++++++++++++++--
|
||||
1 file changed, 55 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp
|
||||
index 6a9066b..9741e3e 100644
|
||||
--- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp
|
||||
+++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp
|
||||
@@ -38,6 +38,7 @@
|
||||
#include "settings/AdvancedSettings.h"
|
||||
#if defined(HAS_LIBAMCODEC)
|
||||
#include "utils/AMLUtils.h"
|
||||
+#include "utils/SysfsUtils.h"
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_POSIX
|
||||
@@ -534,13 +535,57 @@ bool CAESinkALSA::Initialize(AEAudioFormat &format, std::string &device)
|
||||
{
|
||||
m_passthrough = false;
|
||||
}
|
||||
-#if defined(HAS_LIBAMCODEC)
|
||||
- if (aml_present())
|
||||
+
|
||||
+ if (device.find("M8AUDIO") != std::string::npos)
|
||||
{
|
||||
+ int aml_digital_codec = 0;
|
||||
+
|
||||
+ if (m_passthrough)
|
||||
+ {
|
||||
+ /* Open 2 channels at device 0 to enable device 1 output to HDMI */
|
||||
+ ALSAConfig m_inconfig, m_outconfig;
|
||||
+ snd_config_t *config;
|
||||
+ m_inconfig = inconfig;
|
||||
+ m_inconfig.channels = 2;
|
||||
+ snd_config_copy(&config, snd_config);
|
||||
+ OpenPCMDevice("hw:AMLM8AUDIO,0", "", m_inconfig.channels, &m_pcm, config);
|
||||
+ snd_config_delete(config);
|
||||
+ InitializeHW(m_inconfig, m_outconfig);
|
||||
+
|
||||
+ /* Passthrough is supported only by device 1 */
|
||||
+ device = "hw:AMLM8AUDIO,1";
|
||||
+
|
||||
+ switch(format.m_streamInfo.m_type)
|
||||
+ {
|
||||
+ case CAEStreamInfo::STREAM_TYPE_AC3:
|
||||
+ aml_digital_codec = 2;
|
||||
+ break;
|
||||
+
|
||||
+ case CAEStreamInfo::STREAM_TYPE_DTS_512:
|
||||
+ case CAEStreamInfo::STREAM_TYPE_DTS_1024:
|
||||
+ case CAEStreamInfo::STREAM_TYPE_DTS_2048:
|
||||
+ case CAEStreamInfo::STREAM_TYPE_DTSHD_CORE:
|
||||
+ aml_digital_codec = 3;
|
||||
+ break;
|
||||
+
|
||||
+ case CAEStreamInfo::STREAM_TYPE_EAC3:
|
||||
+ aml_digital_codec = 4;
|
||||
+ inconfig.sampleRate = 48000;
|
||||
+ break;
|
||||
+
|
||||
+ case CAEStreamInfo::STREAM_TYPE_DTSHD:
|
||||
+ aml_digital_codec = 8;
|
||||
+ break;
|
||||
+
|
||||
+ case CAEStreamInfo::STREAM_TYPE_TRUEHD:
|
||||
+ aml_digital_codec = 7;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
aml_set_audio_passthrough(m_passthrough);
|
||||
- device = "default";
|
||||
+ SysfsUtils::SetInt("/sys/class/audiodsp/digital_codec", aml_digital_codec);
|
||||
}
|
||||
-#endif
|
||||
|
||||
if (inconfig.channels == 0)
|
||||
{
|
||||
@@ -1550,6 +1595,12 @@ void CAESinkALSA::EnumerateDevice(AEDeviceInfoList &list, const std::string &dev
|
||||
info.m_dataFormats.push_back(i);
|
||||
}
|
||||
|
||||
+ if (info.m_displayName.find("M8AUDIO") != std::string::npos)
|
||||
+ {
|
||||
+ info.m_displayNameExtra = "HDMI";
|
||||
+ info.m_deviceType = AE_DEVTYPE_HDMI;
|
||||
+ }
|
||||
+
|
||||
if (info.m_deviceType == AE_DEVTYPE_HDMI)
|
||||
{
|
||||
// we don't trust ELD information and push back our supported formats explicitely
|
||||
--
|
||||
1.8.3.1
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,79 @@
|
||||
From a7d02c5cbc830b1a49d9de7c2941edce3d4f2da0 Mon Sep 17 00:00:00 2001
|
||||
From: Zongdong Jiao <zongdong.jiao@amlogic.com>
|
||||
Date: Thu, 10 Dec 2015 20:01:32 +0800
|
||||
Subject: [PATCH] PD#116527: hdmitx20: add PCM 8ch feature
|
||||
|
||||
Change-Id: I2208275be4c4a9c5442441945f9d4a83099f75ff
|
||||
---
|
||||
drivers/amlogic/hdmi/hdmi_tx_20/hw/hdmi_tx_hw.c | 24 ++++++++++++++++++++----
|
||||
1 file changed, 20 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/amlogic/hdmi/hdmi_tx_20/hw/hdmi_tx_hw.c b/drivers/amlogic/hdmi/hdmi_tx_20/hw/hdmi_tx_hw.c
|
||||
index a1dc9e0..f6d1006 100644
|
||||
--- a/drivers/amlogic/hdmi/hdmi_tx_20/hw/hdmi_tx_hw.c
|
||||
+++ b/drivers/amlogic/hdmi/hdmi_tx_20/hw/hdmi_tx_hw.c
|
||||
@@ -2075,13 +2075,20 @@ static void set_aud_info_pkt(struct hdmitx_dev *hdev,
|
||||
hdmitx_set_reg_bits(HDMITX_DWC_FC_AUDICONF0, 7, 4, 3);
|
||||
hdmitx_wr_reg(HDMITX_DWC_FC_AUDICONF2, 0x13);
|
||||
break;
|
||||
+ case CT_PCM:
|
||||
+ hdmitx_set_reg_bits(HDMITX_DWC_FC_AUDICONF0,
|
||||
+ audio_param->channel_num, 4, 3);
|
||||
+ if (audio_param->channel_num == 0x7)
|
||||
+ hdmitx_wr_reg(HDMITX_DWC_FC_AUDICONF2, 0x13);
|
||||
+ else
|
||||
+ hdmitx_wr_reg(HDMITX_DWC_FC_AUDICONF2, 0x00);
|
||||
+ break;
|
||||
case CT_DTS:
|
||||
case CT_DTS_HD:
|
||||
default:
|
||||
/* CC: 2ch */
|
||||
hdmitx_set_reg_bits(HDMITX_DWC_FC_AUDICONF0, 1, 4, 3);
|
||||
hdmitx_wr_reg(HDMITX_DWC_FC_AUDICONF2, 0x0);
|
||||
- hdmitx_wr_reg(HDMITX_DWC_FC_AUDICONF2, 0x0);
|
||||
break;
|
||||
}
|
||||
hdmitx_wr_reg(HDMITX_DWC_FC_AUDICONF3, 0);
|
||||
@@ -2162,6 +2169,14 @@ static void set_aud_samp_pkt(struct hdmitx_dev *hdev,
|
||||
hdmitx_set_reg_bits(HDMITX_DWC_FC_AUDSCONF, 1, 0, 1);
|
||||
break;
|
||||
case CT_PCM: /* AudSamp */
|
||||
+ hdmitx_set_reg_bits(HDMITX_DWC_AUD_SPDIF1, 0, 7, 1);
|
||||
+ hdmitx_set_reg_bits(HDMITX_DWC_AUD_SPDIF1, 0, 6, 1);
|
||||
+ hdmitx_set_reg_bits(HDMITX_DWC_AUD_SPDIF1, 24, 0, 5);
|
||||
+ if (audio_param->channel_num == 0x7)
|
||||
+ hdmitx_set_reg_bits(HDMITX_DWC_FC_AUDSCONF, 1, 0, 1);
|
||||
+ else
|
||||
+ hdmitx_set_reg_bits(HDMITX_DWC_FC_AUDSCONF, 0, 0, 1);
|
||||
+ break;
|
||||
case CT_AC_3:
|
||||
case CT_DOLBY_D:
|
||||
case CT_DTS:
|
||||
@@ -2171,7 +2186,7 @@ static void set_aud_samp_pkt(struct hdmitx_dev *hdev,
|
||||
hdmitx_set_reg_bits(HDMITX_DWC_AUD_SPDIF1, 0, 6, 1);
|
||||
hdmitx_set_reg_bits(HDMITX_DWC_AUD_SPDIF1, 24, 0, 5);
|
||||
hdmitx_set_reg_bits(HDMITX_DWC_FC_AUDSCONF, 0, 0, 1);
|
||||
- break;
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2207,7 +2222,8 @@ static int hdmitx_set_audmode(struct hdmitx_dev *hdev,
|
||||
tx_aud_src = 0;
|
||||
pr_info("hdmitx tx_aud_src = %d\n", tx_aud_src);
|
||||
|
||||
- set_hdmi_audio_source(tx_aud_src ? 1 : 2);
|
||||
+ /* set_hdmi_audio_source(tx_aud_src ? 1 : 2); */
|
||||
+ set_hdmi_audio_source(2);
|
||||
|
||||
/* config IP */
|
||||
/* Configure audio */
|
||||
@@ -3808,7 +3824,7 @@ static void config_hdmi20_tx(enum hdmi_vic vic,
|
||||
data32 |= (0 << 0);
|
||||
hdmitx_wr_reg(HDMITX_DWC_FC_AUDICONF1, data32);
|
||||
|
||||
- hdmitx_wr_reg(HDMITX_DWC_FC_AUDICONF2, 0x13);
|
||||
+ hdmitx_wr_reg(HDMITX_DWC_FC_AUDICONF2, 0x00);
|
||||
|
||||
data32 = 0;
|
||||
data32 |= (1 << 5);
|
@ -0,0 +1,45 @@
|
||||
From 852df2b075af5c13bea74baaf85bbde6c7f351e4 Mon Sep 17 00:00:00 2001
|
||||
From: Jamie Coldhill <wrxtasy@amnet.net.au>
|
||||
Date: Fri, 16 Sep 2016 19:15:19 +0800
|
||||
Subject: [PATCH] Report only working frequecies and bit depths
|
||||
|
||||
---
|
||||
sound/soc/aml/m8/aml_i2s_dai.c | 5 ++---
|
||||
sound/soc/aml/m8/aml_spdif_codec.c | 5 ++---
|
||||
2 files changed, 4 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/sound/soc/aml/m8/aml_i2s_dai.c b/sound/soc/aml/m8/aml_i2s_dai.c
|
||||
index 7f86c32..690faf6 100644
|
||||
--- a/sound/soc/aml/m8/aml_i2s_dai.c
|
||||
+++ b/sound/soc/aml/m8/aml_i2s_dai.c
|
||||
@@ -343,9 +343,8 @@ static int aml_dai_i2s_resume(struct snd_soc_dai *dai)
|
||||
#define aml_dai_i2s_resume NULL
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
-#define AML_DAI_I2S_RATES (SNDRV_PCM_RATE_8000_384000)
|
||||
-#define AML_DAI_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
|
||||
- SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
|
||||
+#define AML_DAI_I2S_RATES SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000
|
||||
+#define AML_DAI_I2S_FORMATS SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE
|
||||
|
||||
static struct snd_soc_dai_ops aml_dai_i2s_ops = {
|
||||
.startup = aml_dai_i2s_startup,
|
||||
diff --git a/sound/soc/aml/m8/aml_spdif_codec.c b/sound/soc/aml/m8/aml_spdif_codec.c
|
||||
index 5ef287b..85f2833 100644
|
||||
--- a/sound/soc/aml/m8/aml_spdif_codec.c
|
||||
+++ b/sound/soc/aml/m8/aml_spdif_codec.c
|
||||
@@ -26,9 +26,8 @@
|
||||
|
||||
#define DRV_NAME "spdif-dit"
|
||||
|
||||
-#define STUB_RATES SNDRV_PCM_RATE_8000_192000
|
||||
-#define STUB_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
|
||||
- SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
|
||||
+#define STUB_RATES SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000
|
||||
+#define STUB_FORMATS SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE
|
||||
|
||||
static struct snd_soc_codec_driver soc_codec_spdif_dit;
|
||||
|
||||
--
|
||||
1.9.1
|
||||
|
Loading…
x
Reference in New Issue
Block a user