Changeset 556 for cmedia/trunk/Cmpci/cmpci.c
- Timestamp:
- Jul 27, 2011, 8:07:38 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cmedia/trunk/Cmpci/cmpci.c
r354 r556 148 148 /* --------------------------------------------------------------------- */ 149 149 150 // Rudi: We do not read back mixer values from hardware... 150 151 #undef OSS_DOCUMENTED_MIXER_SEMANTICS 151 152 … … 453 454 int prog_dmabuf(struct cm_state *s, unsigned rec); 454 455 void update_mixer(struct cm_state *s); 456 void set_device_state(struct cm_state *s); 455 457 456 458 … … 1638 1640 1639 1641 #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)) 1641 1643 1642 1644 #endif /* OSS_DOCUMENTED_MIXER_SEMANTICS */ … … 1649 1651 unsigned char l, r, rl, rr, mix, enable; 1650 1652 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 1653 1691 if( l > 100 ) l = 100; 1654 1692 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; 1666 1697 1667 1698 … … 1757 1788 1758 1789 1790 // Rudi: support multi-channel mode 1759 1791 __static__ void update_mixer(struct cm_state *s) 1760 1792 { 1761 1762 1763 if(s->curr_channels > 2 ) {1764 1765 set_mixval(s, SOUND_MIXER_VOLUME, 0x6464); 1766 1767 1768 1769 1770 1771 1772 1773 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]); 1774 1806 } 1775 1807 … … 1945 1977 #endif 1946 1978 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 ) { 1947 1987 // Rudi: 4 channels (seems to work only on Rev39+) 1948 1988 // In this mode, master volume is always set to max. 1949 1989 // Wave volume is controlled via SOUND_MIXER_PCM. 1950 1990 // 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);1954 1991 1955 1992 if( i == SOUND_MIXER_VOLUME ) { 1956 s->mix.vol[SOUND_MIXER_VOLUME] = val;1957 1993 update_mixer(s); 1958 return put_user(val, (int *)arg);1994 return return_mixval(s, i, (int *)arg); 1959 1995 } 1996 1997 if( i == SOUND_MIXER_PCM ) { 1998 return return_mixval(s, i, (int *)arg); 1999 } 1960 2000 } 1961 2001 1962 2002 set_mixval(s, i, val); 1963 1964 #ifndef OSS_DOCUMENTED_MIXER_SEMANTICS1965 s->mix.vol[i] = val;1966 return put_user(val, (int *)arg);1967 #else1968 2003 return return_mixval(s, i, (int *)arg); 1969 #endif1970 2004 } 1971 2005 } … … 3907 3941 ChipVersion = 39; // 4 or 6 channels 3908 3942 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 3911 3948 s->max_channels = 6; 3912 3949 } 3950 3913 3951 3914 3952 s->capability |= CAN_DUAL_DAC |
Note:
See TracChangeset
for help on using the changeset viewer.