aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2008-03-14 12:17:09 -0400
committerTakashi Iwai <tiwai@suse.de>2008-04-24 06:00:25 -0400
commitc93f5a1eca1f6d662d791c14c469b6962e05a08f (patch)
treec330e76a591158161a5d9b6acba8288de83b88f5
parent5d9fab2d84963ec598810c54a67332decdd922a8 (diff)
[ALSA] ice1724 - Fix the SPDIF input sample-rate on Juli@
AK4114 on Juli@ has the SPDIF input sample rate detection and causes errors when an incompatible sample rate is chosen. The patch adds the open hook to check the current rate and limit the hw constraints. Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/pci/ice1712/ice1724.c8
-rw-r--r--sound/pci/ice1712/juli.c17
2 files changed, 25 insertions, 0 deletions
diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c
index f533850ec6e7..3bfd70577d7a 100644
--- a/sound/pci/ice1712/ice1724.c
+++ b/sound/pci/ice1712/ice1724.c
@@ -970,6 +970,8 @@ static int snd_vt1724_playback_spdif_open(struct snd_pcm_substream *substream)
970 VT1724_BUFFER_ALIGN); 970 VT1724_BUFFER_ALIGN);
971 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 971 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
972 VT1724_BUFFER_ALIGN); 972 VT1724_BUFFER_ALIGN);
973 if (ice->spdif.ops.open)
974 ice->spdif.ops.open(ice, substream);
973 return 0; 975 return 0;
974} 976}
975 977
@@ -980,6 +982,8 @@ static int snd_vt1724_playback_spdif_close(struct snd_pcm_substream *substream)
980 if (PRO_RATE_RESET) 982 if (PRO_RATE_RESET)
981 snd_vt1724_set_pro_rate(ice, PRO_RATE_DEFAULT, 0); 983 snd_vt1724_set_pro_rate(ice, PRO_RATE_DEFAULT, 0);
982 ice->playback_con_substream = NULL; 984 ice->playback_con_substream = NULL;
985 if (ice->spdif.ops.close)
986 ice->spdif.ops.close(ice, substream);
983 987
984 return 0; 988 return 0;
985} 989}
@@ -1002,6 +1006,8 @@ static int snd_vt1724_capture_spdif_open(struct snd_pcm_substream *substream)
1002 VT1724_BUFFER_ALIGN); 1006 VT1724_BUFFER_ALIGN);
1003 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 1007 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
1004 VT1724_BUFFER_ALIGN); 1008 VT1724_BUFFER_ALIGN);
1009 if (ice->spdif.ops.open)
1010 ice->spdif.ops.open(ice, substream);
1005 return 0; 1011 return 0;
1006} 1012}
1007 1013
@@ -1012,6 +1018,8 @@ static int snd_vt1724_capture_spdif_close(struct snd_pcm_substream *substream)
1012 if (PRO_RATE_RESET) 1018 if (PRO_RATE_RESET)
1013 snd_vt1724_set_pro_rate(ice, PRO_RATE_DEFAULT, 0); 1019 snd_vt1724_set_pro_rate(ice, PRO_RATE_DEFAULT, 0);
1014 ice->capture_con_substream = NULL; 1020 ice->capture_con_substream = NULL;
1021 if (ice->spdif.ops.close)
1022 ice->spdif.ops.close(ice, substream);
1015 1023
1016 return 0; 1024 return 0;
1017} 1025}
diff --git a/sound/pci/ice1712/juli.c b/sound/pci/ice1712/juli.c
index e8038c0ceb72..4550609b4d47 100644
--- a/sound/pci/ice1712/juli.c
+++ b/sound/pci/ice1712/juli.c
@@ -77,6 +77,22 @@ static unsigned char juli_ak4114_read(void *private_data, unsigned char reg)
77 return snd_vt1724_read_i2c((struct snd_ice1712 *)private_data, AK4114_ADDR, reg); 77 return snd_vt1724_read_i2c((struct snd_ice1712 *)private_data, AK4114_ADDR, reg);
78} 78}
79 79
80static void juli_spdif_in_open(struct snd_ice1712 *ice,
81 struct snd_pcm_substream *substream)
82{
83 struct juli_spec *spec = ice->spec;
84 struct snd_pcm_runtime *runtime = substream->runtime;
85 int rate;
86
87 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
88 return;
89 rate = snd_ak4114_external_rate(spec->ak4114);
90 if (rate >= runtime->hw.rate_min && rate <= runtime->hw.rate_max) {
91 runtime->hw.rate_min = rate;
92 runtime->hw.rate_max = rate;
93 }
94}
95
80/* 96/*
81 * AK4358 section 97 * AK4358 section
82 */ 98 */
@@ -210,6 +226,7 @@ static int __devinit juli_init(struct snd_ice1712 *ice)
210 return err; 226 return err;
211 } 227 }
212 228
229 ice->spdif.ops.open = juli_spdif_in_open;
213 return 0; 230 return 0;
214} 231}
215 232