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:
Jamie Coldhill 2016-09-16 19:35:46 +08:00
parent ea3920fcf4
commit 9920d90f5f
7 changed files with 1492 additions and 15 deletions

View File

@ -1,12 +0,0 @@
pcm.!default {
type plug
slave {
pcm "hw:0,0"
format S16_LE
}
}
ctl.!default {
type hw
card 0
}

View File

@ -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
}
}
}

View File

@ -2648,13 +2648,10 @@ CONFIG_SND_SOC=y
# CONFIG_SND_DESIGNWARE_I2S is not set # CONFIG_SND_DESIGNWARE_I2S is not set
CONFIG_SND_AML_M8_SOC=y CONFIG_SND_AML_M8_SOC=y
CONFIG_SND_AML_M8=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_AML_G9TV is not set
CONFIG_SND_SOC_I2C_AND_SPI=y CONFIG_SND_SOC_I2C_AND_SPI=y
CONFIG_SND_SOC_DUMMY_CODEC=y CONFIG_SND_SOC_DUMMY_CODEC=y
CONFIG_SND_SOC_PCM2BT=y CONFIG_SND_SOC_PCM2BT=y
CONFIG_SND_SOC_PCM5102=y
# CONFIG_SND_SIMPLE_CARD is not set # CONFIG_SND_SIMPLE_CARD is not set
# CONFIG_SOUND_PRIME is not set # CONFIG_SOUND_PRIME is not set

View File

@ -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

View File

@ -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);

View File

@ -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