openvortex-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Openvortex-dev] Re: au88x0 - Replace spdif frequency control by IEC958


From: Raymond
Subject: [Openvortex-dev] Re: au88x0 - Replace spdif frequency control by IEC958 control
Date: Tue, 01 Mar 2005 21:27:18 +0800
User-agent: Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.4.3) Gecko/20041005

>> The parameter 'spdif_mode' in the routine
>> vortex_spdif_init(vortex,spdif_sr,spdif_mode) in au88x0_core.c seems
>> to control AC3 passthrough.
>>
>> However the two memory mapped I/O VORTEX_SPDIF_CFG0 and
>> VORTEX_SPDIF_CFG1 seem to be write-only, return zero when read.

>Then we need to cache the values.

Define snd_aes_iec958_t spdif_out in struct snd_vortex in au88x0.h

1) Which bit in the IEC958 control is related to AC3 passthrough ?

Every bits hardware can provide :)

The most important one for AC3 is the non-audio bit.

1) Is is possible to find out more information from the specification of the spdif chips used ?

cs8412 and cs8402a
http://www.dearhoney.idv.tw/SoundCard/Vortex2/montegoiiplus.htm

Diamond MX300 and MX25
http://www.dearhoney.idv.tw/MUSEUM/soundcard-12.php

Aureal sound cards - SQ2500 (Coaxial) and SuperQuad PCI (optical)
http://www.dearhoney.idv.tw/MUSEUM/soundcard-07.php


static int snd_vortex_spdif_default_put(snd_kcontrol_t * kcontrol,
snd_ctl_elem_value_t * ucontrol)
 {
        vortex_t *vortex = snd_kcontrol_chip(kcontrol);
        vortex->spdif_out.status[0]=ucontrol->value.iec958.status[0];
        vortex->spdif_out.status[1]=ucontrol->value.iec958.status[1];
        vortex->spdif_out.status[2]=ucontrol->value.iec958.status[2];
        vortex->spdif_out.status[3]=ucontrol->value.iec958.status[3];
        switch(vortex->spdif_out.status[3] & IEC958_AES3_CON_FS){
        case IEC958_AES3_CON_FS_32000: vortex->spdif_sr = 32000; break;
        case IEC958_AES3_CON_FS_44100: vortex->spdif_sr = 44100; break;
        case IEC958_AES3_CON_FS_48000: vortex->spdif_sr = 48000; break;
        };
        vortex_program_spdif(vortex);
        return 0;
}


> As vortex_spdif_init() only handle changing SPDIF sample rate.
>
> 2) Do the driver need to initialise vortex->spdif_sr to 48000 or just
> let alsactl restore the value from /etc/asound.state ?

The driver must initialize the value by itself at first.

-       vortex_spdif_init(vortex, 48000, 1);
+       vortex->spdif_out.status[0]=0;
+       vortex->spdif_out.status[1]=0;
+       vortex->spdif_out.status[2]=0;
+       vortex->spdif_out.status[3]=IEC958_AES3_CON_FS_48000;
+       vortex->spdif_sr=48000;
+       vortex_setup_spdif_out(vortex);



> 3) Is it correct to return the following value in
> snd_vortex_spdif_mask_get() ?
> ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS;

Yes.

static int snd_vortex_spdif_mask_get(snd_kcontrol_t * kcontrol,
snd_ctl_elem_value_t * ucontrol)
{
        ucontrol->value.iec958.status[0] = 0xfd;
        ucontrol->value.iec958.status[1] = 0xff;
        ucontrol->value.iec958.status[2] = 0xff;
        ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS;
        return 0;
}


2) Do the code "ucontrol->value.iec958.status[0] = 0xfd;" in
snd_vortex_spdif_mask_get() indicate that it support consumer mode only ?
or the driver need to return error when (ucontrol->value.iec958.status[0] & IEC958_AES0_PROFESSIONAL ) is true in snd_vortex_spdif_default_put() ?


> 4) Is it correct to return the following value in
> snd_vortex_spdif_default_get() ?
> ucontrol->value.iec958.status[1] =IEC958_AES1_CON_ORIGINAL |
> IEC958_AES1_CON_DIGDIGCONV_ID;

If the values are not variable, you don't need to return them.


static int snd_vortex_spdif_default_get(snd_kcontrol_t * kcontrol,
snd_ctl_elem_value_t * ucontrol)
 {
        vortex_t *vortex = snd_kcontrol_chip(kcontrol);
        ucontrol->value.iec958.status[0] = vortex->spdif_out.status[0];
        ucontrol->value.iec958.status[1] = vortex->spdif_out.status[1];
        ucontrol->value.iec958.status[2] = vortex->spdif_out.status[2];
        ucontrol->value.iec958.status[3] = vortex->spdif_out.status[3];
}

static void vortex_setup_spdif_out(vortex_t * vortex)
{
        int i;
        u32 spdif_sr;

        /* CAsp4Spdif::InitializeSpdifHardware(void) */
        hwwrite(vortex->mmio, VORTEX_SPDIF_FLAGS,
                hwread(vortex->mmio, VORTEX_SPDIF_FLAGS) & 0xfff3fffd);
        //for (i=0x291D4; i<0x29200; i+=4)
        for (i = 0; i < 11; i++)
                hwwrite(vortex->mmio, VORTEX_SPDIF_CFG1 + (i << 2), 0);
        //hwwrite(vortex->mmio, 0x29190, hwread(vortex->mmio, 0x29190) | 
0xc0000);
        hwwrite(vortex->mmio, VORTEX_CODEC_EN,
                hwread(vortex->mmio, VORTEX_CODEC_EN) | EN_SPDIF);

        vortex->spdif_out.status[0] &= (~IEC958_AES0_PRO_FS);
        vortex->spdif_out.status[0] &= (~IEC958_AES0_PROFESSIONAL);
        vortex->spdif_out.status[3] &= (~IEC958_AES3_CON_FS);

/*      FIXME - AC3 passthrough */
        if ( vortex->spdif_out.status[0] & IEC958_AES0_NONAUDIO ) {
                vortex->spdif_sr=48000;
                vortex->spdif_out.status[3] |= IEC958_AES3_CON_FS_48000;
        };
        
        switch (vortex->spdif_sr) {
        case 32000:
                vortex->spdif_out.status[0] &= (~IEC958_AES0_NONAUDIO);
                vortex->spdif_out.status[3] |= IEC958_AES3_CON_FS_32000;
                spdif_sr=0x7D8D;
                break;
        case 44100:
                vortex->spdif_out.status[0] &= (~IEC958_AES0_NONAUDIO);
                vortex->spdif_out.status[3] |= IEC958_AES3_CON_FS_44100;
                spdif_sr=0xACCC;
                break;
        case 48000:
                vortex->spdif_out.status[3] |= IEC958_AES3_CON_FS_48000;
                spdif_sr=0xBB8E;
                break;

        }
        hwwrite(vortex->mmio, VORTEX_SPDIF_CFG0, vortex->spdif_out.status[1]
*256 +vortex->spdif_out.status[0]);
        hwwrite(vortex->mmio, VORTEX_SPDIF_CFG1, vortex->spdif_out.status[3]
*256 +vortex->spdif_out.status[2]);
        hwwrite(vortex->mmio, VORTEX_SPDIF_SMPRATE, spdif_sr);
}


http://lists.gnu.org/archive/html/openvortex-dev/2003-11/msg00008.html

3) Do we need to change the ADB routing when using AC3 passthrough ?


> 5) What additional kcontrol and routine are needed for SPDIF IN ?

For the SPDIF input status bits, no "standard" control is defined
yet.  You can create a control like "IEC958 Capture Status" returning
the current IEC958 status bits of the capture stream.
Also, "IEC958 Capture Switch" can be implemented (if possible).  This
switch is turned on automatically in iec958 PCM definition in the
alsa-lib config file.

http://www.turtlebeach.com/site/kb_ftp/5764040.asp

External Sync
Enable Quad Audio

4) Is "External Sync" related to clock in IEC958 control ?

5) How can STAC9721 stereo codec provide quad audio ? ( Is it through
SPDIF-I2S link ? )








reply via email to

[Prev in Thread] Current Thread [Next in Thread]