no, I haven't, since the patch is quite mangled in the www archive and I
wasn't subscribed then, I didn't go through th trouble of fixing it up. Is it
merged into cvs now, and if not, could you send it my way? I'd be happy to
give it a shot.
Here is the patch again, it's not in current CVS.
/Benny
diff --exclude=CVS -Naur alsa-kernel/include/cs46xx_dsp_spos.h
../cvs/alsa-kernel/include/cs46xx_dsp_spos.h
--- alsa-kernel/include/cs46xx_dsp_spos.h Sun Nov 10 19:47:01 2002
+++ ../cvs/alsa-kernel/include/cs46xx_dsp_spos.h Thu Nov 14 00:39:06 2002
@@ -63,7 +63,6 @@
#define DSP_SPDIF_STATUS_OUTPUT_ENABLED 1
#define DSP_SPDIF_STATUS_PLAYBACK_OPEN 2
#define DSP_SPDIF_STATUS_HW_ENABLED 4
-#define DSP_SPDIF_STATUS_AC3_MODE 8
struct _dsp_module_desc_t;
@@ -196,6 +195,10 @@
int spdif_status_in;
u16 spdif_input_volume_right;
u16 spdif_input_volume_left;
+ /* spdif channel status,
+ left right and user validity bits */
+ int spdif_csuv_default;
+ int spdif_csuv_stream;
/* SPDIF input sample rate converter */
dsp_scb_descriptor_t * spdif_in_src;
diff --exclude=CVS -Naur alsa-kernel/pci/cs46xx/cs46xx_lib.c
../cvs/alsa-kernel/pci/cs46xx/cs46xx_lib.c
--- alsa-kernel/pci/cs46xx/cs46xx_lib.c Mon Nov 11 23:04:50 2002
+++ ../cvs/alsa-kernel/pci/cs46xx/cs46xx_lib.c Sun Nov 17 16:26:53 2002
@@ -946,15 +946,15 @@
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
#ifdef CONFIG_SND_CS46XX_NEW_DSP
+ /* magic value to unmute PCM stream playback volume */
+ snd_cs46xx_poke(chip, (cpcm->pcm_channel->pcm_reader_scb->address +
+ SCBVolumeCtrl) << 2, 0x80007fff);
+
if (cpcm->pcm_channel->unlinked)
cs46xx_dsp_pcm_link(chip,cpcm->pcm_channel);
+
if (substream->runtime->periods != CS46XX_FRAGS)
snd_cs46xx_playback_transfer(substream, 0);
-
- /* raise playback volume */
- cs46xx_dsp_scb_set_volume (chip,cpcm->pcm_channel->pcm_reader_scb,
- chip->dsp_spos_instance->dac_volume_right,
- chip->dsp_spos_instance->dac_volume_left);
#else
if (substream->runtime->periods != CS46XX_FRAGS)
snd_cs46xx_playback_transfer(substream, 0);
@@ -968,8 +968,9 @@
case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND:
#ifdef CONFIG_SND_CS46XX_NEW_DSP
- /* mute channel */
- cs46xx_dsp_scb_set_volume (chip,cpcm->pcm_channel->pcm_reader_scb,0,0);
+ /* magic mute channel */
+ snd_cs46xx_poke(chip, (cpcm->pcm_channel->pcm_reader_scb->address +
+ SCBVolumeCtrl) << 2, 0xffffffff);
if (!cpcm->pcm_channel->unlinked)
cs46xx_dsp_pcm_unlink(chip,cpcm->pcm_channel);
@@ -1063,6 +1064,7 @@
}
#endif
+
static int snd_cs46xx_playback_hw_params(snd_pcm_substream_t * substream,
snd_pcm_hw_params_t * hw_params)
{
@@ -1079,15 +1081,10 @@
down (&chip->spos_mutex);
snd_assert (cpcm->pcm_channel != NULL);
-
- /* if IEC958 is opened in AC3 mode dont adjust SRCTask is not
- used so dont adjust sample rate */
- if (cpcm->pcm_channel->pcm_channel_id != DSP_IEC958_CHANNEL ||
- !(chip->dsp_spos_instance->spdif_status_out & DSP_SPDIF_STATUS_AC3_MODE)) {
- if (_cs46xx_adjust_sample_rate (chip,cpcm,sample_rate)) {
- up (&chip->spos_mutex);
- return -ENXIO;
- }
+
+ if (_cs46xx_adjust_sample_rate (chip,cpcm,sample_rate)) {
+ up (&chip->spos_mutex);
+ return -ENXIO;
}
if (cs46xx_dsp_pcm_channel_set_period (chip,cpcm->pcm_channel,period_size *
4)) {
@@ -1886,8 +1883,8 @@
{
cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
- ucontrol->value.integer.value[0] = chip->dsp_spos_instance->dac_volume_right;
- ucontrol->value.integer.value[1] = chip->dsp_spos_instance->dac_volume_left;
+ ucontrol->value.integer.value[0] = chip->dsp_spos_instance->dac_volume_left;
+ ucontrol->value.integer.value[1] = chip->dsp_spos_instance->dac_volume_right;
return 0;
}
@@ -2038,34 +2035,6 @@
return 0;
}
-static int snd_cs46xx_iec958_ac3_mode_get(snd_kcontrol_t *kcontrol,
- snd_ctl_elem_value_t *ucontrol)
-{
- cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
- dsp_spos_instance_t * ins = chip->dsp_spos_instance;
-
- if (!ins->spdif_status_out & DSP_SPDIF_STATUS_AC3_MODE)
- ucontrol->value.integer.value[0] = 1;
- else
- ucontrol->value.integer.value[0] = 0;
-
- return 0;
-}
-
-static int snd_cs46xx_iec958_ac3_mode_put(snd_kcontrol_t *kcontrol,
- snd_ctl_elem_value_t *ucontrol)
-{
- cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
- dsp_spos_instance_t * ins = chip->dsp_spos_instance;
- int old = ins->spdif_status_out;
-
- if (ucontrol->value.integer.value[0])
- ins->spdif_status_out |= DSP_SPDIF_STATUS_AC3_MODE;
- else
- ins->spdif_status_out &= ~DSP_SPDIF_STATUS_AC3_MODE;
-
- return (old != ins->spdif_status_out);
-}
static int snd_cs46xx_pcm_capture_put(snd_kcontrol_t *kcontrol,
snd_ctl_elem_value_t *ucontrol)
@@ -2127,6 +2096,110 @@
return (val1 != snd_cs46xx_peekBA0(chip, BA0_EGPIODR));
}
+
+static int snd_cs46xx_spdif_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *
+uinfo)
+{
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
+ uinfo->count = 1;
+ return 0;
+}
+
+static int snd_cs46xx_spdif_default_get(snd_kcontrol_t * kcontrol,
+ snd_ctl_elem_value_t * ucontrol)
+{
+ cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+ dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+
+ down (&chip->spos_mutex);
+ ucontrol->value.iec958.status[0] = _wrap_all_bits((ins->spdif_csuv_default >>
+24) & 0xff);
+ ucontrol->value.iec958.status[1] = _wrap_all_bits((ins->spdif_csuv_default >>
+16) & 0xff);
+ ucontrol->value.iec958.status[2] = 0;
+ ucontrol->value.iec958.status[3] = _wrap_all_bits((ins->spdif_csuv_default) &
+0xff);
+ up (&chip->spos_mutex);
+
+ return 0;
+}
+
+static int snd_cs46xx_spdif_default_put(snd_kcontrol_t * kcontrol,
+ snd_ctl_elem_value_t * ucontrol)
+{
+ cs46xx_t * chip = snd_kcontrol_chip(kcontrol);
+ dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+ unsigned int val;
+ int change;
+
+ down (&chip->spos_mutex);
+ val = _wrap_all_bits(((u32)ucontrol->value.iec958.status[0] << 24)) |
+ _wrap_all_bits(((u32)ucontrol->value.iec958.status[2] << 16)) |
+ _wrap_all_bits( (u32)ucontrol->value.iec958.status[3]) |
+ /* left and right validity bit */
+ (1 << 13) | (1 << 12);
+
+
+ change = ins->spdif_csuv_default != val;
+ ins->spdif_csuv_default = val;
+
+ if ( !(ins->spdif_status_out & DSP_SPDIF_STATUS_PLAYBACK_OPEN) )
+ cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV,val);
+
+ up (&chip->spos_mutex);
+
+ return change;
+}
+
+static int snd_cs46xx_spdif_mask_get(snd_kcontrol_t * kcontrol,
+ snd_ctl_elem_value_t * ucontrol)
+{
+ ucontrol->value.iec958.status[0] = 0xff;
+ ucontrol->value.iec958.status[1] = 0xff;
+ ucontrol->value.iec958.status[2] = 0x00;
+ ucontrol->value.iec958.status[3] = 0xff;
+ return 0;
+}
+
+static int snd_cs46xx_spdif_stream_get(snd_kcontrol_t * kcontrol,
+ snd_ctl_elem_value_t * ucontrol)
+{
+ cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+ dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+
+ down (&chip->spos_mutex);
+ ucontrol->value.iec958.status[0] = _wrap_all_bits((ins->spdif_csuv_stream >>
+24) & 0xff);
+ ucontrol->value.iec958.status[1] = _wrap_all_bits((ins->spdif_csuv_stream >>
+16) & 0xff);
+ ucontrol->value.iec958.status[2] = 0;
+ ucontrol->value.iec958.status[3] = _wrap_all_bits((ins->spdif_csuv_stream) &
+0xff);
+ up (&chip->spos_mutex);
+
+ return 0;
+}
+
+static int snd_cs46xx_spdif_stream_put(snd_kcontrol_t * kcontrol,
+ snd_ctl_elem_value_t * ucontrol)
+{
+ cs46xx_t * chip = snd_kcontrol_chip(kcontrol);
+ dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+ unsigned int val;
+ int change;
+
+ down (&chip->spos_mutex);
+ val = _wrap_all_bits(((u32)ucontrol->value.iec958.status[0] << 24)) |
+ _wrap_all_bits(((u32)ucontrol->value.iec958.status[1] << 16)) |
+ _wrap_all_bits( (u32)ucontrol->value.iec958.status[3]) |
+ /* left and right validity bit */
+ (1 << 13) | (1 << 12);
+
+
+ change = ins->spdif_csuv_stream != val;
+ ins->spdif_csuv_stream = val;
+
+ if ( ins->spdif_status_out & DSP_SPDIF_STATUS_PLAYBACK_OPEN )
+ cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV,val);
+
+ up (&chip->spos_mutex);
+
+ return change;
+}
+
#endif /* CONFIG_SND_CS46XX_NEW_DSP */
#ifdef CONFIG_SND_CS46XX_DEBUG_GPIO
@@ -2238,7 +2311,7 @@
},
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
- .name = "IEC 958 Output Switch",
+ .name = "IEC958 Output Switch",
.info = snd_mixer_boolean_info,
.get = snd_cs46xx_iec958_get,
.put = snd_cs46xx_iec958_put,
@@ -2246,14 +2319,7 @@
},
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
- .name = "IEC 958 AC3 Mode Switch",
- .info = snd_mixer_boolean_info,
- .get = snd_cs46xx_iec958_ac3_mode_get,
- .put = snd_cs46xx_iec958_ac3_mode_put,
-},
-{
- .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
- .name = "IEC 958 Input Switch",
+ .name = "IEC958 Input Switch",
.info = snd_mixer_boolean_info,
.get = snd_cs46xx_iec958_get,
.put = snd_cs46xx_iec958_put,
@@ -2261,12 +2327,34 @@
},
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
- .name = "IEC 958 Input Volume",
+ .name = "IEC958 Input Volume",
.info = snd_cs46xx_vol_info,
.get = snd_cs46xx_vol_iec958_get,
.put = snd_cs46xx_vol_iec958_put,
.private_value = (ASYNCRX_SCB_ADDR + 0xE) << 2,
},
+{
+ .iface = SNDRV_CTL_ELEM_IFACE_PCM,
+ .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
+ .info = snd_cs46xx_spdif_info,
+ .get = snd_cs46xx_spdif_default_get,
+ .put = snd_cs46xx_spdif_default_put,
+},
+{
+ .iface = SNDRV_CTL_ELEM_IFACE_PCM,
+ .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
+ .info = snd_cs46xx_spdif_info,
+ .get = snd_cs46xx_spdif_mask_get,
+ .access = SNDRV_CTL_ELEM_ACCESS_READ
+},
+{
+ .iface = SNDRV_CTL_ELEM_IFACE_PCM,
+ .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PCM_STREAM),
+ .info = snd_cs46xx_spdif_info,
+ .get = snd_cs46xx_spdif_stream_get,
+ .put = snd_cs46xx_spdif_stream_put
+},
+
#endif
#ifdef CONFIG_SND_CS46XX_DEBUG_GPIO
{
diff --exclude=CVS -Naur alsa-kernel/pci/cs46xx/cs46xx_lib.h
../cvs/alsa-kernel/pci/cs46xx/cs46xx_lib.h
--- alsa-kernel/pci/cs46xx/cs46xx_lib.h Sun Nov 10 19:47:01 2002
+++ ../cvs/alsa-kernel/pci/cs46xx/cs46xx_lib.h Wed Nov 13 22:51:21 2002
@@ -217,6 +217,6 @@
int period_size);
int cs46xx_dsp_pcm_ostream_set_period (cs46xx_t * chip,
int period_size);
-int cs46xx_dsp_set_dac_volume (cs46xx_t * chip,u16 right,u16
left);
-int cs46xx_dsp_set_iec958_volume (cs46xx_t * chip,u16
right,u16 left);
+int cs46xx_dsp_set_dac_volume (cs46xx_t * chip,u16 left,u16
+right);
+int cs46xx_dsp_set_iec958_volume (cs46xx_t * chip,u16 left,u16
+right);
#endif /* __CS46XX_LIB_H__ */
diff --exclude=CVS -Naur alsa-kernel/pci/cs46xx/dsp_spos.c
../cvs/alsa-kernel/pci/cs46xx/dsp_spos.c
--- alsa-kernel/pci/cs46xx/dsp_spos.c Sun Nov 10 19:47:01 2002
+++ ../cvs/alsa-kernel/pci/cs46xx/dsp_spos.c Thu Nov 14 19:59:59 2002
@@ -31,6 +31,7 @@
#include <sound/core.h>
#include <sound/control.h>
#include <sound/info.h>
+#include <sound/asoundef.h>
#include <sound/cs46xx.h>
#include "cs46xx_lib.h"
@@ -262,6 +263,15 @@
ins->spdif_input_volume_right = 0x8000;
ins->spdif_input_volume_left = 0x8000;
+ /* set left and right validity bits and
+ default channel status */
+ ins->spdif_csuv_default =
+ ins->spdif_csuv_stream =
+ /* byte 0 */ (_wrap_all_bits( (SNDRV_PCM_DEFAULT_CON_SPDIF & 0xff))
+<< 24) |
+ /* byte 1 */ (_wrap_all_bits( ((SNDRV_PCM_DEFAULT_CON_SPDIF >> 16) & 0xff))
+<< 16) |
+ /* byte 3 */ _wrap_all_bits( (SNDRV_PCM_DEFAULT_CON_SPDIF >> 24) & 0xff) |
+ /* left and right validity bits */ (1 << 13) | (1 << 12);
+
return ins;
}
@@ -1549,7 +1559,7 @@
cs46xx_poke_via_dsp (chip,SP_SPDOUT_CONTROL, 0x80000000);
/* right and left validate bit */
- cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV, 0x00000000 | (1 << 13) | (1 << 12));
+ cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV, ins->spdif_csuv_default);
/* monitor state */
ins->spdif_status_out |= DSP_SPDIF_STATUS_HW_ENABLED;
@@ -1587,11 +1597,6 @@
cs46xx_poke_via_dsp (chip,SP_SPDIN_FIFOPTR, 0x0);
cs46xx_src_link(chip,ins->spdif_in_src);
- /* restore SPDIF input volume */
- cs46xx_dsp_scb_set_volume (chip,ins->spdif_in_src,
- ins->spdif_input_volume_right,
- ins->spdif_input_volume_left);
-
spin_unlock_irq(&chip->reg_lock);
/* set SPDIF input sample rate and unmute
@@ -1725,39 +1730,47 @@
return 0;
}
-int cs46xx_dsp_set_dac_volume (cs46xx_t * chip,u16 right,u16 left)
+int cs46xx_dsp_set_dac_volume (cs46xx_t * chip,u16 left,u16 right)
{
- int i;
dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+ dsp_scb_descriptor_t * scb;
down(&chip->spos_mutex);
+
+ /* main output */
+ scb = ins->master_mix_scb->sub_list_ptr;
+ while (scb != ins->the_null_scb) {
+ cs46xx_dsp_scb_set_volume (chip,scb,left,right);
+ scb = scb->next_scb_ptr;
+ }
- ins->dac_volume_right = right;
- ins->dac_volume_left = left;
-
- for (i = 0; i < DSP_MAX_PCM_CHANNELS; ++i) {
- if (ins->pcm_channels[i].active &&
- !ins->pcm_channels[i].unlinked) {
- cs46xx_dsp_scb_set_volume
(chip,ins->pcm_channels[i].pcm_reader_scb,
- right,left);
-
- }
+ /* rear output */
+ scb = ins->rear_mix_scb->sub_list_ptr;
+ while (scb != ins->the_null_scb) {
+ cs46xx_dsp_scb_set_volume (chip,scb,left,right);
+ scb = scb->next_scb_ptr;
}
+ ins->dac_volume_left = left;
+ ins->dac_volume_right = right;
+
up(&chip->spos_mutex);
return 0;
}
-int cs46xx_dsp_set_iec958_volume (cs46xx_t * chip,u16 right,u16 left) {
+int cs46xx_dsp_set_iec958_volume (cs46xx_t * chip,u16 left,u16 right) {
dsp_spos_instance_t * ins = chip->dsp_spos_instance;
down(&chip->spos_mutex);
- cs46xx_dsp_scb_set_volume (chip,ins->spdif_in_src,
- right,left);
- ins->spdif_input_volume_right = right;
+ if (ins->asynch_rx_scb != NULL)
+ cs46xx_dsp_scb_set_volume (chip,ins->asynch_rx_scb,
+ left,right);
+
ins->spdif_input_volume_left = left;
+ ins->spdif_input_volume_right = right;
+
up(&chip->spos_mutex);
return 0;
diff --exclude=CVS -Naur alsa-kernel/pci/cs46xx/dsp_spos.h
../cvs/alsa-kernel/pci/cs46xx/dsp_spos.h
--- alsa-kernel/pci/cs46xx/dsp_spos.h Sun Nov 10 19:47:01 2002
+++ ../cvs/alsa-kernel/pci/cs46xx/dsp_spos.h Thu Nov 14 09:36:26 2002
@@ -185,6 +185,25 @@
#define SP_SPDOUT_CONTROL 0x804D
#define SP_SPDOUT_CSUV 0x808E
+static inline u8 _wrap_all_bits (u8 val) {
+ u8 wrapped;
+
+ /* wrap all 8 bits */
+ wrapped =
+ ((val & 0x1 ) << 7) |
+ ((val & 0x2 ) << 5) |
+ ((val & 0x4 ) << 3) |
+ ((val & 0x8 ) << 1) |
+ ((val & 0x10) >> 1) |
+ ((val & 0x20) >> 3) |
+ ((val & 0x40) >> 5) |
+ ((val & 0x80) >> 6);
+
+ return wrapped;
+
+}
+
+
static inline void cs46xx_dsp_spos_update_scb (cs46xx_t * chip,dsp_scb_descriptor_t *
scb)
{
/* update nextSCB and subListPtr in SCB */
@@ -195,12 +214,11 @@
}
static inline void cs46xx_dsp_scb_set_volume (cs46xx_t * chip,dsp_scb_descriptor_t *
scb,
- u16 right,u16 left) {
- unsigned int val = ((0xffff - right) << 16 | (0xffff - left));
+ u16 left,u16 right) {
+ unsigned int val = ((0xffff - left) << 16 | (0xffff - right));
snd_cs46xx_poke(chip, (scb->address + SCBVolumeCtrl) << 2, val);
snd_cs46xx_poke(chip, (scb->address + SCBVolumeCtrl + 1) << 2, val);
}
-
#endif /* __DSP_SPOS_H__ */
#endif /* CONFIG_SND_CS46XX_NEW_DSP */
diff --exclude=CVS -Naur alsa-kernel/pci/cs46xx/dsp_spos_scb_lib.c
../cvs/alsa-kernel/pci/cs46xx/dsp_spos_scb_lib.c
--- alsa-kernel/pci/cs46xx/dsp_spos_scb_lib.c Sun Nov 10 19:47:01 2002
+++ ../cvs/alsa-kernel/pci/cs46xx/dsp_spos_scb_lib.c Thu Nov 14 09:08:14 2002
@@ -603,8 +603,8 @@
src_buffer_addr << 0x10,
0x04000000,
{
- 0x8000,0x8000,
- 0xffff,0xffff
+ 0xffff - ins->dac_volume_right,0xffff - ins->dac_volume_left,
+ 0xffff - ins->dac_volume_right,0xffff - ins->dac_volume_left
}
};
@@ -658,7 +658,7 @@
/* D */ 0,
{
/* E */ 0x8000,0x8000,
- /* F */ 0xffff,0xffff
+ /* F */ 0x8000,0x8000
}
};
@@ -830,7 +830,7 @@
0,0x2aab, /* Const 1/3 */
{
- 0, /* Define the unused elements */
+ 0, /* Define the unused elements */
0,
0
},
@@ -846,7 +846,7 @@
rate etc */
0x18000000, /* Phi increment for approx 32k
operation */
0x8000,0x8000, /* Volume controls are unused at this
time */
- 0xffff,0xffff
+ 0x8000,0x8000
};
scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&asynch_fg_tx_scb,
@@ -864,7 +864,7 @@
dsp_scb_descriptor_t * parent_scb,
int scb_child_type)
{
-
+ dsp_spos_instance_t * ins = chip->dsp_spos_instance;
dsp_scb_descriptor_t * scb;
asynch_fg_rx_scb_t asynch_fg_rx_scb = {
@@ -893,9 +893,9 @@
rate etc */
0x18000000,
- /* Mute stream */
- 0x8000,0x8000,
- 0xffff,0xffff
+ /* Set IEC958 input volume */
+ 0xffff - ins->spdif_input_volume_right,0xffff -
+ins->spdif_input_volume_left,
+ 0xffff - ins->spdif_input_volume_right,0xffff -
+ins->spdif_input_volume_left,
};
scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&asynch_fg_rx_scb,
@@ -1116,11 +1116,13 @@
case DSP_IEC958_CHANNEL:
snd_assert (ins->asynch_tx_scb != NULL, return NULL);
mixer_scb = ins->asynch_tx_scb;
+#if 0
if (ins->spdif_status_out & DSP_SPDIF_STATUS_AC3_MODE) {
snd_printdd ("IEC958 opened in AC3 mode\n");
/*src_scb = ins->asynch_tx_scb;
ins->asynch_tx_scb->ref_count ++;*/
}
+#endif
break;
default:
snd_assert (0);
@@ -1198,9 +1200,7 @@
return NULL;
}
- if (pcm_channel_id != DSP_IEC958_CHANNEL ||
- !(ins->spdif_status_out & DSP_SPDIF_STATUS_AC3_MODE))
- cs46xx_dsp_set_src_sample_rate(chip,src_scb,sample_rate);
+ cs46xx_dsp_set_src_sample_rate(chip,src_scb,sample_rate);
ins->nsrc_scb ++;
}
@@ -1461,17 +1461,11 @@
*/
spin_lock_irqsave(&chip->reg_lock, flags);
- /* mute SCB */
- /* cs46xx_dsp_scb_set_volume (chip,src,0,0); */
-
snd_cs46xx_poke(chip, (src->address + SRCCorPerGof) << 2,
((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
snd_cs46xx_poke(chip, (src->address + SRCPhiIncr6Int26Frac) << 2, phiIncr);
- /* raise volume */
- /* cs46xx_dsp_scb_set_volume (chip,src,0x7fff,0x7fff); */
-
spin_unlock_irqrestore(&chip->reg_lock, flags);
}
@@ -1641,9 +1635,8 @@
SCB_ON_PARENT_NEXT_SCB);
- if (ins->spdif_status_out & DSP_SPDIF_STATUS_AC3_MODE)
- /* set left (13), right validity bit (12) , and non-audio(1) and
profsional bit (0) */
- cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV, 0x00000000 | (1 << 13) | (1
<< 12) | (1 << 1) | 1);
+ /* set spdif channel status value for streaming */
+ cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV, ins->spdif_csuv_stream);
ins->spdif_status_out |= DSP_SPDIF_STATUS_PLAYBACK_OPEN;
@@ -1659,7 +1652,7 @@
ins->spdif_status_out &= ~DSP_SPDIF_STATUS_PLAYBACK_OPEN;
/* restore settings */
- cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV, 0x00000000 | (1 << 13) | (1 << 12));
+ cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV, ins->spdif_csuv_default);
/* deallocate stuff */
cs46xx_dsp_remove_scb (chip,ins->asynch_tx_scb);