[alsa-devel] [PATCH 2/3] ASoC: sti: use pcm iec958 channel status helper
Moise Gergaud
moise.gergaud at st.com
Wed Dec 2 15:22:05 CET 2015
Use pcm iec958 channel status helper to update sampling freq parameter.
Signed-off-by: Moise Gergaud <moise.gergaud at st.com>
Acked-by: Arnaud Pouliquen <arnaud.pouliquen at st.com>
---
sound/soc/sti/Kconfig | 1 +
sound/soc/sti/uniperif_player.c | 58 ++++++++---------------------------------
2 files changed, 12 insertions(+), 47 deletions(-)
diff --git a/sound/soc/sti/Kconfig b/sound/soc/sti/Kconfig
index 64a6900..8e616a4 100644
--- a/sound/soc/sti/Kconfig
+++ b/sound/soc/sti/Kconfig
@@ -6,6 +6,7 @@ menuconfig SND_SOC_STI
depends on SND_SOC
depends on ARCH_STI || COMPILE_TEST
select SND_SOC_GENERIC_DMAENGINE_PCM
+ select SND_PCM_IEC958
help
Say Y if you want to enable ASoC-support for
any of the STI platforms (e.g. STIH416).
diff --git a/sound/soc/sti/uniperif_player.c b/sound/soc/sti/uniperif_player.c
index 7aca6b9..b55e412 100644
--- a/sound/soc/sti/uniperif_player.c
+++ b/sound/soc/sti/uniperif_player.c
@@ -12,6 +12,7 @@
#include <sound/asoundef.h>
#include <sound/soc.h>
+#include <sound/pcm_iec958.h>
#include "uniperif.h"
@@ -244,6 +245,7 @@ static void uni_player_set_channel_status(struct uniperif *player,
{
int n;
unsigned int status;
+ unsigned char *aes = player->stream_settings.iec958.status;
/*
* Some AVRs and TVs require the channel status to contain a correct
@@ -251,51 +253,9 @@ static void uni_player_set_channel_status(struct uniperif *player,
* set one.
*/
mutex_lock(&player->ctrl_lock);
- if (runtime) {
- switch (runtime->rate) {
- case 22050:
- player->stream_settings.iec958.status[3] =
- IEC958_AES3_CON_FS_22050;
- break;
- case 44100:
- player->stream_settings.iec958.status[3] =
- IEC958_AES3_CON_FS_44100;
- break;
- case 88200:
- player->stream_settings.iec958.status[3] =
- IEC958_AES3_CON_FS_88200;
- break;
- case 176400:
- player->stream_settings.iec958.status[3] =
- IEC958_AES3_CON_FS_176400;
- break;
- case 24000:
- player->stream_settings.iec958.status[3] =
- IEC958_AES3_CON_FS_24000;
- break;
- case 48000:
- player->stream_settings.iec958.status[3] =
- IEC958_AES3_CON_FS_48000;
- break;
- case 96000:
- player->stream_settings.iec958.status[3] =
- IEC958_AES3_CON_FS_96000;
- break;
- case 192000:
- player->stream_settings.iec958.status[3] =
- IEC958_AES3_CON_FS_192000;
- break;
- case 32000:
- player->stream_settings.iec958.status[3] =
- IEC958_AES3_CON_FS_32000;
- break;
- default:
- /* Mark as sampling frequency not indicated */
- player->stream_settings.iec958.status[3] =
- IEC958_AES3_CON_FS_NOTID;
- break;
- }
- }
+
+ /* update channel status sampling freq */
+ snd_pcm_update_iec958_consumer(runtime, aes, 4);
/* Audio mode:
* Use audio mode status to select PCM or encoded mode
@@ -318,7 +278,7 @@ static void uni_player_set_channel_status(struct uniperif *player,
/* Program the new channel status */
for (n = 0; n < 6; ++n) {
status =
- player->stream_settings.iec958.status[0 + (n * 4)] & 0xf;
+ player->stream_settings.iec958.status[0 + (n * 4)] & 0xff;
status |=
player->stream_settings.iec958.status[1 + (n * 4)] << 8;
status |=
@@ -563,6 +523,7 @@ static int uni_player_ctl_iec958_get(struct snd_kcontrol *kcontrol,
ucontrol->value.iec958.status[1] = iec958->status[1];
ucontrol->value.iec958.status[2] = iec958->status[2];
ucontrol->value.iec958.status[3] = iec958->status[3];
+ ucontrol->value.iec958.status[4] = iec958->status[4];
mutex_unlock(&player->ctrl_lock);
return 0;
}
@@ -574,15 +535,18 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol,
struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai);
struct uniperif *player = priv->dai_data.uni;
struct snd_aes_iec958 *iec958 = &player->stream_settings.iec958;
+ struct snd_pcm_substream *substream = player->substream;
mutex_lock(&player->ctrl_lock);
iec958->status[0] = ucontrol->value.iec958.status[0];
iec958->status[1] = ucontrol->value.iec958.status[1];
iec958->status[2] = ucontrol->value.iec958.status[2];
iec958->status[3] = ucontrol->value.iec958.status[3];
+ iec958->status[4] = ucontrol->value.iec958.status[4];
mutex_unlock(&player->ctrl_lock);
- uni_player_set_channel_status(player, NULL);
+ if (substream && substream->runtime)
+ uni_player_set_channel_status(player, substream->runtime);
return 0;
}
--
1.9.1
More information about the Alsa-devel
mailing list