Hi Benny,

I noticed the phase reversal problem with my Terratec XFire, too: I played a mono wav. Then I combined the left and rigth output electrically and the sound was gone, i.e. one channel outputs the sound with a sign change, so that left+right=signal+(-signal)=0. The sound went back when unbalancing the output level. (This would also explain why my impulse response measuring program measures a negative response when connecting line out to line in ;-). I use the left channel of the soundcard for it.)
It applied your patch below, but it didn't solve the problem. Is it correct that the SDPIF AC3 mode switch is gone after applying the patch? I patched alsa version 0.9.0rc6.

fe

P.S. just tested my IR measuring program with right channel (and 0.9.0rc6) => positive response
P.S.S. now I really wanted to know which channel has wrong sign with rc6. With 0.9.0rc2 I get positive impulse responses for both left and right channel.

conclusion: the left pcm channel of the alsa 0.9.0rc6 driver for cs46xx has wrong sign. Perhaps this can help a bit location the error.



Benny Sjostrand schrieb:


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





-------------------------------------------------------
This SF.net email is sponsored by: Microsoft Visual Studio.NET comprehensive development tool, built to increase your productivity. Try a free online hosted session at:
http://ads.sourceforge.net/cgi-bin/redirect.pl?micr0003en
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to