From mboxrd@z Thu Jan 1 00:00:00 1970 From: Benny Sjostrand Subject: Re: Re: Phase Reversal on Santa Cruz (cs46xx) Date: Sat, 23 Nov 2002 01:00:18 +0100 Sender: alsa-devel-admin@lists.sourceforge.net Message-ID: <3DDEC512.7030108@cucumelo.org> References: <200211170056.11190.puetzk@iastate.edu> <200211172241.14373.puetzk@iastate.edu> <3DDD75AC.9030408@cucumelo.org> <200211220935.55174.puetzk@iastate.edu> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090001050800010605010004" Return-path: Errors-To: alsa-devel-admin@lists.sourceforge.net List-Help: List-Post: List-Subscribe: , List-Unsubscribe: , List-Archive: To: Kevin Puetz Cc: alsa-devel@lists.sourceforge.net List-Id: alsa-devel@alsa-project.org This is a multi-part message in MIME format. --------------090001050800010605010004 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit > > >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 --------------090001050800010605010004 Content-Type: text/plain; name="cs46xx.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="cs46xx.patch" 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 #include #include +#include #include #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); --------------090001050800010605010004-- ------------------------------------------------------- This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf