#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <esd.h>
#include <time.h>
#include <signal.h>
#include <sys/wait.h>

#define ON 1
#define OFF 0
#define PENDING 2
#define NUM_STREAMS 4
#define LIMIT 700
#define DELAY 12

time_t otime=-1;

int count=0;
char* names[ ] = { "fallback", "playback", "line-in", "jingle"};

int state[NUM_STREAMS]={ON,ON,ON,ON};

get_stream_info(int esd,int id[],int vol[])
{
  int i;
  esd_info_t *all_info = NULL;
  esd_player_info_t *playerlist;


  all_info = esd_get_all_info( esd );
  playerlist = all_info->player_list;
  if(playerlist) {
   for(i=0;i<NUM_STREAMS;i++) {
    if(!strcmp(playerlist->name,names[i])) {
      id[i]=playerlist->source_id;
      vol[i] = playerlist->left_vol_scale;
     }
    
   }

   while(playerlist->next) {
    playerlist=playerlist->next;
    for(i=0;i<NUM_STREAMS;i++) {
      if(!strcmp(playerlist->name,names[i])) {
	id[i]=playerlist->source_id;
	vol[i] = playerlist->left_vol_scale;
      }
    } 
   }
  }
  esd_free_all_info( all_info );  
  return(1);
}

ramp_handler(samples,esd)
{
  time_t now=time(NULL);
  int npid, s;
  int i,j,k;
  int id[NUM_STREAMS];
  int vol[NUM_STREAMS];
  int line_in;
  int active;
  
  if(otime==-1) {
    otime=now;
  }

  for(i=0;i<NUM_STREAMS;i++) {
    vol[i] = 0;
    id[i]=0;
  }

  get_stream_info(esd,id,vol);

  for(j=0;j<NUM_STREAMS;j++) {
    if(!strcmp(names[j],"line-in")) {
      line_in=j;

    }
  }

  for(i=NUM_STREAMS-1;i>=0;i--) {
    if(id[i] && i!=line_in) {
      active=i;
      i=-1;
    }
  }

  if(samples > LIMIT)
    otime=time(NULL);
    
  if((now-otime)<DELAY && active<line_in)
    active=line_in;
  

  for(j=0;j<NUM_STREAMS;j++) {
    if(state[j]==OFF && vol[j] && j!=active) {
      esd_set_stream_pan( esd, id[j], 0, 0 );
    }
    else if(j!=active) {
      if(state[j]!=OFF) {
	k=vol[active];
	for(i=vol[j];i>=0;i-=10) {
	  k+=10; if(k>255) k=255;	  
	  esd_set_stream_pan( esd, id[j], i, i );
	  esd_set_stream_pan( esd, id[active], k, k );
	}
	state[active]=ON;
      }
      state[j]=OFF;
      if(vol[j]>0)
	esd_set_stream_pan( esd, id[j], 0, 0 );
      if(vol[active]<250)
	esd_set_stream_pan( esd, id[active], 255, 255 );
    }
  }
  return(0);
}
