All of lore.kernel.org
 help / color / mirror / Atom feed
* au88x0 PCM Volume control
       [not found] <4315C4BC.7040206@netvigator.com>
@ 2005-09-06  8:00 ` Raymond
  0 siblings, 0 replies; only message in thread
From: Raymond @ 2005-09-06  8:00 UTC (permalink / raw)
  To: alsa-devel; +Cc: Manuel Jander, openvortex-dev

The proposed PCM Volume controls of the playback device 0 of au88x0 
driver allow any ALSA application using the PCM Volume control 
(.iface=SNDRV_CTL_ELEM_IFACE_PCM) associated to the sudevice to change 
the volume (-48dB to 6dB) when the audio passing through the hardware 
mixer of au88x0.


Mono
                             0dB
DMA -> FIFO -> SRC -> MIXIN ---> MIXOUT -> Equalizer -> Front Left
                         |   0dB
                         +------> MIXOUT -> Equalizer -> Front Right
                         |   6dB
                         +------> MIXOUT --------------> Rear Left
                         |   6dB
                         +------> MIXOUT --------------> Rear Right

Stereo

                             0dB
DMA -> FIFO -> SRC -> MIXIN ---> MIXOUT -> Equalizer -> Front Left
             |           |   6dB
             |           +------> MIXOUT --------------> Rear Left
             |               0dB
             +> SRC -> MIXIN ---> MIXOUT -> Equalizer -> Front Right
                         |   6dB
                         +------> MIXOUT --------------> Rear Right

Surround40

                             0dB
DMA -> FIFO -> SRC -> MIXIN ---> MIXOUT -> Equalizer -> Front Left
             |               0dB
             +> SRC -> MIXIN ---> MIXOUT -> Equalizer -> Front Right
             |               6dB
             +> SRC -> MIXIN ---> MIXOUT --------------> Rear Left
             |               6dB
             +> SRC -> MIXIN ---> MIXOUT --------------> Rear Right

> 
> Description of the patch (beta)
> - add PCM Volume control by using the hardware mixer of au88x0
> 
> 
> TEST AT YOUR OWN RISK !!!
> 
> The audio will be distorted when total gain exceed the limit of 18-bits
> DAC in AC97 codec.
> 
> 
> Any comment/suggestion or programs to test the feature are welcome.
> 
> 
>> Hi,
> 
> 
>> On Mon, 2005-08-29 at 10:28 +0800, Raymond wrote:

>> > Distortion occur when the combined gain of audio data, hardware
>> > mixer ,  equalizer and 3D effect > 6dB ( limit by the 18-bits DAC i
>> > n AC97 codec)
> 
> 
>> The maximum gain possible for a entire audio pipe should obvisouly not
>> exceeded.
> 

Why the hardware mixer in the current ALSA driver is set to zero gain in 
vortex_adb_allocroute() when capturing audio from 18-bits ADC to 16-bits 
audio ? ( In theory, it should be -6dB )


                                               AC97
16bits Audio                 0dB        18bits   Analog
DMA <- FIFO <- SRC <- MIXOUT <- MIXIN <- ADC  <- MIXER <---- MIC
                                        |           |
DMA <- FIFO <- SRC <- MIXOUT <- MIXIN <+           +---------LINE IN
                                                    |
                                                    +---------VIDEO
                                                    |
                                                    +---------CD
                                                    |
                                                    +---------AUX
                                                    |
                                                    +---------PHONE
                                                    |
                                                    +---------MIX


> 
>> > In the ALSA au88x0 driver, the hardware mixer provide default gain
>> > of  6dB ( 16-bits auido data to 18-bits DAC in AC97 codec ) for the
>> > left/right channels of au8820 and the rear channels of au8810/au8830
>> > (to  SDAC of quad codec),
>>  >
>> > For the front channels of au8810/au8830, zero gain in hardware mixer
>> > and  this 6dB gain is most likely controlled by the equalizer or 3D
>> > effect.
>> >
> 
>> I would suggest using the correct signed or unsigned type instead of
>> doing explicit type conversions.
> 


static void
vortex_mix_setinputvolumebyte(vortex_t * vortex, unsigned char mix,
			      int mixin, unsigned char vol)
{
	int temp;

	hwwrite(vortex->mmio,
		VORTEX_MIX_INVOL_A + (((mix << 5) + mixin) << 2), vol);
	if (1) {		/* this_10, initialized to 1. */
		temp =
		    hwread(vortex->mmio,
			   VORTEX_MIX_INVOL_B + (((mix << 5) + mixin) << 2));
		if ((temp != 0x80) || (vol == 0x80))
			return;
	}
	hwwrite(vortex->mmio,
		VORTEX_MIX_INVOL_B + (((mix << 5) + mixin) << 2), vol);
}


static int snd_vortex_adb_pcm_change_vol(vortex_t *vortex,int mixin,int
mix,int volume)
{
	if ( volume >= 128 )
		vortex_mix_setinputvolumebyte(vortex, mix, mixin, volume-128);
   // GAIN
	else
		if ( volume < 64 )
			vortex_mix_setinputvolumebyte(vortex, mix, mixin, 0x80);        // MUTE
		else
			vortex_mix_setinputvolumebyte(vortex, mix, mixin, volume+128);  // ATTEN
	return 0;
}










-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2005-09-06  8:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <4315C4BC.7040206@netvigator.com>
2005-09-06  8:00 ` au88x0 PCM Volume control Raymond

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.