diff options
Diffstat (limited to 'libao2/pl_volume.c')
-rw-r--r-- | libao2/pl_volume.c | 166 |
1 files changed, 0 insertions, 166 deletions
diff --git a/libao2/pl_volume.c b/libao2/pl_volume.c deleted file mode 100644 index 2b673d3e1e..0000000000 --- a/libao2/pl_volume.c +++ /dev/null @@ -1,166 +0,0 @@ -/* This audio output plugin changes the volume of the sound, and can - be used when the mixer doesn't support the PCM channel. The volume - is set in fixed steps between 0 - 2^8. */ - -#define PLUGIN - -// Some limits -#define MIN_S16 -32650 -#define MAX_S16 32650 -#define MIN_U8 0 -#define MAX_U8 255 -#define MIN_S8 -128 -#define MAX_S8 127 - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <inttypes.h> - -#include "audio_out.h" -#include "audio_plugin.h" -#include "audio_plugin_internal.h" -#include "libaf/af_format.h" - -static ao_info_t info = -{ - "Volume control audio plugin", - "volume", - "Anders", - "" -}; - -LIBAO_PLUGIN_EXTERN(volume) - -// local data -typedef struct pl_volume_s -{ - uint16_t volume; // output volume level - int inuse; // This plugin is in use TRUE, FALSE - int format; // sample fomat -} pl_volume_t; - -static pl_volume_t pl_volume={0,0,0}; - -// to set/get/query special features/parameters -static int control(int cmd,void *arg){ - switch(cmd){ - case AOCONTROL_PLUGIN_SET_LEN: - return CONTROL_OK; - case AOCONTROL_GET_VOLUME:{ - if(pl_volume.inuse){ - ((ao_control_vol_t *)arg)->right=((float)pl_volume.volume)/2.55; - ((ao_control_vol_t *)arg)->left=((float)pl_volume.volume)/2.55; - return CONTROL_OK; - } - else - return CONTROL_ERROR; - } - case AOCONTROL_SET_VOLUME:{ - if(pl_volume.inuse){ - // Calculate avarage between left and right - float vol =2.55*((((ao_control_vol_t *)arg)->right)+(((ao_control_vol_t *)arg)->left))/2; - pl_volume.volume=(uint16_t)vol; - // Volume must be between 0 and 255 - if(vol > 255) - pl_volume.volume = 0xFF; - if(vol < 0) - pl_volume.volume = 0; - return CONTROL_OK; - } - else - return CONTROL_ERROR; - } - } - return CONTROL_UNKNOWN; -} - -// open & setup audio device -// return: 1=success 0=fail -static int init(){ - // Sanity sheck this plugin supports AFMT_U8 and AFMT_S16_LE - switch(ao_plugin_data.format){ - case(AF_FORMAT_U8): - case(AF_FORMAT_S16_NE): - break; - default: - fprintf(stderr,"[pl_volume] Audio format not yet suported \n"); - return 0; - } - // Initialize volume to this value - pl_volume.volume=ao_plugin_cfg.pl_volume_volume; - pl_volume.format=ao_plugin_data.format; - /* The inuse flag is used in control to detremine if the return - value since that function always is called from ao_plugin regardless - of wether this plugin is in use or not. */ - pl_volume.inuse=1; - // Tell the world what we are up to - printf("[pl_volume] Software volume control in use%s.\n",ao_plugin_cfg.pl_volume_softclip?", soft clipping enabled":""); - return 1; -} - -// close plugin -static void uninit(){ - pl_volume.inuse=0; -} - -// empty buffers -static void reset(){ -} - -#define SIGN(x) (x>0?1:-1) -// processes 'ao_plugin_data.len' bytes of 'data' -// called for every block of data -static int play(){ - register int i=0; - register int vol=pl_volume.volume; // Logarithmic control sounds more natural - vol=(vol*vol*vol)>>12; - // Change the volume. - switch(pl_volume.format){ - case(AF_FORMAT_U8):{ - register uint8_t* data=(uint8_t*)ao_plugin_data.data; - register int x; - for(i=0;i<ao_plugin_data.len;i++){ - x=((data[i]-128) * vol) >> 8; - if(x>MAX_S8) - data[i]=MAX_U8; - else if(x<MIN_S8) - data[i]=MIN_U8; - else{ - if(ao_plugin_cfg.pl_volume_softclip) - data[i] = ((3*x - ((x*x*x) >> 14)) >> 1) + 128; - else - data[i] = x + 128; - } - } - break; - } - case(AF_FORMAT_S16_NE):{ - register int len=ao_plugin_data.len>>1; - register int16_t* data=(int16_t*)ao_plugin_data.data; - register int x; - for(i=0;i<len;i++){ - x=(data[i] * vol) >> 8; - if(x>MAX_S16) - data[i]=MAX_S16; - else if(x<MIN_S16) - data[i]=MIN_S16; - else{ - if(ao_plugin_cfg.pl_volume_softclip){ - int64_t t=x*x; - t=(t*x) >> 30; - data[i] = (3*x - (int)t) >> 1; - //data[i] = 2*x - SIGN(x)*((x*x)>>15); - } - else - data[i] = x; - } - } - break; - } - default: - return 0; - } - return 1; - -} |