Ignore:
Timestamp:
Jul 27, 2011, 8:07:38 PM (14 years ago)
Author:
rudi
Message:

Update to version 0.2.3, part 2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cmedia/trunk/Cmpci/cmpci.c

    r354 r556  
    148148/* --------------------------------------------------------------------- */
    149149
     150// Rudi: We do not read back mixer values from hardware...
    150151#undef OSS_DOCUMENTED_MIXER_SEMANTICS
    151152
     
    453454int     prog_dmabuf(struct cm_state *s, unsigned rec);
    454455void    update_mixer(struct cm_state *s);
     456void    set_device_state(struct cm_state *s);
    455457
    456458
     
    16381640
    16391641#else
    1640   #define return_mixval(s, v, a)        put_user((v), (a))
     1642  #define return_mixval(s, i, a)        put_user(s->mix.vol[i], (a))
    16411643
    16421644#endif /* OSS_DOCUMENTED_MIXER_SEMANTICS */
     
    16491651        unsigned char l, r, rl, rr, mix, enable;
    16501652
    1651         l = (unsigned char)val;
    1652         r = (unsigned char)(val >> 8);
     1653        l  = (unsigned char)val;
     1654        r  = (unsigned char)(val >> 8);
     1655        rl = 100;
     1656        rr = 100;
     1657
     1658        if( s->chip_version < 68 )
     1659        {
     1660          // Rudi: emulate master volume which is always set to max
     1661          // in multi-channel mode for chip revs < 68
     1662          if( s->curr_channels > 2 &&
     1663              i != SOUND_MIXER_VOLUME && i != SOUND_MIXER_PCM )
     1664          {
     1665            rl = (unsigned char)s->mix.vol[SOUND_MIXER_VOLUME];
     1666            rr = (unsigned char)(s->mix.vol[SOUND_MIXER_VOLUME] >> 8);
     1667          }
     1668        }
     1669        else
     1670        {
     1671          //Rudi: emulate PCM volume which doesn't work for chip rev 68
     1672          if( i == SOUND_MIXER_PCM )
     1673          {
     1674            // force PCM to max.
     1675            spin_lock_irqsave(&s->lock, flags);
     1676            wrmixer(s, mixtable[SOUND_MIXER_PCM].left, 31 << 3);
     1677            wrmixer(s, mixtable[SOUND_MIXER_PCM].right, 31 << 3);
     1678            spin_unlock_irqrestore(&s->lock, flags);
     1679
     1680            rl = (unsigned char)s->mix.vol[SOUND_MIXER_VOLUME];
     1681            rr = (unsigned char)(s->mix.vol[SOUND_MIXER_VOLUME] >> 8);
     1682            i = SOUND_MIXER_VOLUME;
     1683          }
     1684          else if( i == SOUND_MIXER_VOLUME )
     1685          {
     1686            rl = (unsigned char)s->mix.vol[SOUND_MIXER_PCM];
     1687            rr = (unsigned char)(s->mix.vol[SOUND_MIXER_PCM] >> 8);
     1688          }
     1689        }
     1690
    16531691        if( l > 100 )   l = 100;
    16541692        if( r > 100 )   r = 100;
    1655 
    1656 // Rudi: master volume always set to max, when running in 4 channel mode
    1657         if( s->curr_channels > 2 &&
    1658             i != SOUND_MIXER_VOLUME && i != SOUND_MIXER_PCM ) {
    1659           rl = (unsigned char)s->mix.vol[SOUND_MIXER_VOLUME];
    1660           rr = (unsigned char)(s->mix.vol[SOUND_MIXER_VOLUME] >> 8);
    1661           if( rl > 100 )        rl = 100;
    1662           if( rr > 100 )        rr = 100;
    1663           l = (l * rl) / 100;
    1664           r = (r * rr) / 100;
    1665         }
     1693        if( rl > 100 )  rl = 100;
     1694        if( rr > 100 )  rr = 100;
     1695        l = ((l * rl) + 50) / 100;
     1696        r = ((r * rr) + 50) / 100;
    16661697
    16671698
     
    17571788
    17581789
     1790// Rudi: support  multi-channel mode
    17591791__static__ void update_mixer(struct cm_state *s)
    17601792{
    1761   int   i;
    1762 
    1763   if( s->curr_channels > 2 ) {
    1764     set_mixval(s, SOUND_MIXER_PCM, s->mix.vol[SOUND_MIXER_VOLUME]);
    1765     set_mixval(s, SOUND_MIXER_VOLUME, 0x6464);
    1766   } else {
    1767     set_mixval(s, SOUND_MIXER_PCM, s->mix.vol[SOUND_MIXER_PCM]);
    1768     set_mixval(s, SOUND_MIXER_VOLUME, s->mix.vol[SOUND_MIXER_VOLUME]);
    1769   }
    1770 
    1771   // emulate master volume control: CD, Line, Aux, Mic, Rear
    1772   for( i = 0; i < SOUND_MIXER_NRDEVICES; i++ )
    1773     if( mixtable[i].play )      set_mixval(s, i, s->mix.vol[i]);
     1793        int     i;
     1794
     1795        if( s->chip_version < 68 && s->curr_channels > 2 ) {
     1796                set_mixval(s, SOUND_MIXER_PCM, s->mix.vol[SOUND_MIXER_VOLUME]);
     1797                set_mixval(s, SOUND_MIXER_VOLUME, 0x6464);      // maximum = 100%
     1798        } else {
     1799                set_mixval(s, SOUND_MIXER_PCM, s->mix.vol[SOUND_MIXER_PCM]);
     1800                set_mixval(s, SOUND_MIXER_VOLUME, s->mix.vol[SOUND_MIXER_VOLUME]);
     1801        }
     1802
     1803        // emulate master volume control: CD, Line, Aux, Mic, Rear
     1804        for( i = 0; i < SOUND_MIXER_NRDEVICES; i++ )
     1805                if( mixtable[i].play )  set_mixval(s, i, s->mix.vol[i]);
    17741806}
    17751807
     
    19451977#endif
    19461978
     1979
     1980#ifndef OSS_DOCUMENTED_MIXER_SEMANTICS
     1981                // store internally
     1982                s->mix.vol[i] = val;
     1983#endif
     1984
     1985                // Rudi: support for 8768
     1986                if( s->chip_version < 68 && s->curr_channels > 2 ) {
    19471987// Rudi: 4 channels (seems to work only on Rev39+)
    19481988//       In this mode, master volume is always set to max.
    19491989//       Wave volume is controlled via SOUND_MIXER_PCM.
    19501990//       For all other sources, master volume is emulated
    1951                 if( /*s->chip_version >= 39 &&*/ s->curr_channels > 2 ) {
    1952                   if( i == SOUND_MIXER_PCM )
    1953                     return put_user(val, (int *)arg);
    19541991
    19551992                  if( i == SOUND_MIXER_VOLUME ) {
    1956                     s->mix.vol[SOUND_MIXER_VOLUME] = val;
    19571993                    update_mixer(s);
    1958                     return put_user(val, (int *)arg);
     1994                    return return_mixval(s, i, (int *)arg);
    19591995                  }
     1996
     1997                  if( i == SOUND_MIXER_PCM ) {
     1998                    return return_mixval(s, i, (int *)arg);
     1999                  }
    19602000                }
    19612001
    19622002                set_mixval(s, i, val);
    1963 
    1964 #ifndef OSS_DOCUMENTED_MIXER_SEMANTICS
    1965                 s->mix.vol[i] = val;
    1966                 return put_user(val, (int *)arg);
    1967 #else
    19682003                return return_mixval(s, i, (int *)arg);
    1969 #endif
    19702004        }
    19712005}
     
    39073941                ChipVersion = 39;       // 4 or 6 channels
    39083942                s->max_channels = ( RegValue & (1 << (24-24)) ) ?  6 : 4;
    3909             } else {
    3910                 ChipVersion = 55;       // 5 channels
     3943            } else if (RegValue & (1 << (29-29))) {
     3944                ChipVersion = 68;       // 8 channels
     3945                s->max_channels = 8;
     3946            } else /*if (RegValue & (1 << (27-27)))*/ {
     3947                ChipVersion = 55;       // 6 channels
    39113948                s->max_channels = 6;
    39123949            }
     3950
    39133951
    39143952            s->capability |= CAN_DUAL_DAC |
Note: See TracChangeset for help on using the changeset viewer.