#include <stdio.h>
#include "wve.h"
#include "audio_filehdr.h"
#include <sys/types.h>
#include <sys/stat.h>

extern int needmotorolaorder;
void
main(ac, av)
  int ac;
  char *av[];
{
  char *ptr;
  unsigned char val;
  int c, a2u, len;
  struct wveheader wvehdr;
  Audio_filehdr auhdr;
  struct stat stbuf;

  if(ptr = (char *)rindex(av[0], '/'))
    ptr++;
  else
    ptr = av[0];
  a2u = !strcmp(ptr, "wve2au");

  if(ac != 1)
    {
      if(a2u)
	fprintf(stderr, "Usage: wve2au < psion.wve > sun.au\n");
      else
	fprintf(stderr, "Usage: au2wve < sun.au > psion.wve\n");
      exit(0);
    }

  needmotorolaorder = 0;
  if(a2u)
    {
      if(fread(&wvehdr, sizeof(wvehdr), 1, stdin) != 1 ||
         strcmp(wvehdr.magic, WVE_MAGIC))
	{
	  fprintf(stderr, "Input is not in S3 Wve format\n");
	  exit(0);
	}
      auhdr.magic = AUDIO_FILE_MAGIC;
      auhdr.hdr_size = sizeof(auhdr);
      len = ShortSwap(wvehdr.samples1) + (ShortSwap(wvehdr.samples2) << 16);
      auhdr.data_size = len;
      auhdr.encoding = AUDIO_FILE_ENCODING_MULAW_8;
      auhdr.sample_rate = 8000;
      auhdr.channels = 1;
      fwrite(&auhdr, sizeof(auhdr), 1, stdout);
    }
  else
    {
      if(fread(&auhdr, sizeof(auhdr), 1, stdin) != 1 ||
         auhdr.magic != AUDIO_FILE_MAGIC ||
	 auhdr.encoding != AUDIO_FILE_ENCODING_MULAW_8 ||
	 auhdr.channels != 1)
	{
	  fprintf(stderr, "Input is not in Sun MuLAW,8bit,1channel format\n");
	  exit(0);
	}
      strcpy(wvehdr.magic, WVE_MAGIC);
      wvehdr.version = ShortSwap(4111);
      if(auhdr.data_size == 0)
        {
	  if(fstat(0, &stbuf))
	    {
	      fprintf(stderr, "Sorry, can't determine audio header size.\n");
	      exit(1);
	    }
	  len = stbuf.st_size - sizeof(auhdr);
	}
      else
        len = auhdr.data_size;
      wvehdr.samples1 = ShortSwap(len&0xffff);
      wvehdr.samples2 = ShortSwap(len>>16);
      wvehdr.pause = ShortSwap(0);
      wvehdr.rept = ShortSwap(1);
      bzero(wvehdr.reserved, 6);
      fwrite(&wvehdr, sizeof(wvehdr), 1, stdout);
    }

  while(len--)
    {
      if((c = getchar()) == EOF)
        {
	  fprintf(stderr, "Premature EOF, exiting\n");
	  exit(1);
	}
      val = (unsigned char)c;
      val = a2u ? alaw2ulaw(val) : ulaw2alaw(val);
      putchar(val);
    }
  exit(0);
}
