--- lp-org/linphone-0.12.2/mediastreamer/alsacard.c 2003-12-03 15:10:51.000000000 +0100 +++ lp/linphone-0.12.2/mediastreamer/alsacard.c 2004-12-21 09:55:56.000000000 +0100 @@ -383,6 +383,9 @@ const char *elemname; snd_mixer_elem_t *elem; int err; + long sndMixerPMin; + long sndMixerPMax; + long newvol; elem=snd_mixer_first_elem(mixer); while (elem!=NULL){ elemname=snd_mixer_selem_get_name(elem); @@ -391,7 +394,10 @@ switch (action){ case CAPTURE: if (snd_mixer_selem_has_capture_volume(elem)){ - err=snd_mixer_selem_get_capture_volume(elem,SND_MIXER_SCHN_UNKNOWN,&value); + snd_mixer_selem_get_playback_volume_range(elem, &sndMixerPMin, &sndMixerPMax); + err=snd_mixer_selem_get_capture_volume(elem,SND_MIXER_SCHN_UNKNOWN,&newvol); + newvol-=sndMixerPMin; + value=(100*newvol)/(sndMixerPMax-sndMixerPMin); if (err<0) g_warning("Could not get capture volume for %s:%s",name,snd_strerror(err)); //else g_message("Succesfully get capture level for %s.",elemname); break; @@ -399,7 +405,10 @@ break; case PLAYBACK: if (snd_mixer_selem_has_playback_volume(elem)){ - err=snd_mixer_selem_get_playback_volume(elem,SND_MIXER_SCHN_FRONT_LEFT,&value); + snd_mixer_selem_get_playback_volume_range(elem, &sndMixerPMin, &sndMixerPMax); + err=snd_mixer_selem_get_playback_volume(elem,SND_MIXER_SCHN_FRONT_LEFT,&newvol); + newvol-=sndMixerPMin; + value=(100*newvol)/(sndMixerPMax-sndMixerPMin); if (err<0) g_warning("Could not get playback volume for %s:%s",name,snd_strerror(err)); //else g_message("Succesfully get playback level for %s.",elemname); break; @@ -413,7 +422,7 @@ elem=snd_mixer_elem_next(elem); } - return (value*100)/30; + return value; } @@ -421,6 +430,9 @@ const char *elemname; snd_mixer_elem_t *elem; int tmp; + long sndMixerPMin; + long sndMixerPMax; + long newvol; elem=snd_mixer_first_elem(mixer); @@ -431,14 +443,18 @@ switch(action){ case CAPTURE: if (snd_mixer_selem_has_capture_volume(elem)){ - snd_mixer_selem_set_capture_volume_all(elem,(level*30)/100); + snd_mixer_selem_get_playback_volume_range(elem, &sndMixerPMin, &sndMixerPMax); + newvol=(((sndMixerPMax-sndMixerPMin)*level)/100)+sndMixerPMin; + snd_mixer_selem_set_capture_volume_all(elem,newvol); //g_message("Succesfully set capture level for %s.",elemname); return; } break; case PLAYBACK: if (snd_mixer_selem_has_playback_volume(elem)){ - snd_mixer_selem_set_playback_volume_all(elem,(level*30)/100); + snd_mixer_selem_get_playback_volume_range(elem, &sndMixerPMin, &sndMixerPMax); + newvol=(((sndMixerPMax-sndMixerPMin)*level)/100)+sndMixerPMin; + snd_mixer_selem_set_playback_volume_all(elem,newvol); //g_message("Succesfully set playback level for %s.",elemname); return; }