/*
  choices.c
  ---------
  7/2/24

  Anything to do with the choices file.
*/

#include <kernel.h>
#include <swis.h>
#include "modhdr.h"
#include "main.h"
#include "kbd.h"

#define LINE_LEN 64

const char choices_file[] = "<MIDISynthChoices$Dir>.Choices"; // default

/*
 * choices_read
 * ------------
 */
int choices_read(syn_t *s, const char *filename)
{
  FILE *f;
  int n;
  char line[LINE_LEN];

  if((f = fopen(filename, "r")) == NULL)
    return -PROBLEM_OPENING_FILE;

  while(fgets(line, LINE_LEN, f) != 0)
  {
    if(sscanf(line, "polyphony = %d", &n) == 1)
    {
      LIMIT(4, n, NUM_GENS);
      s->num_gens = n;
    }
    else if(sscanf(line, "sleep timeout = %d", &n) == 1)
    {
      LIMIT(0, n, 3600);
      mod.sleep_timeout = n * TICKER_RATE;
    }
    else if(sscanf(line, "glide scale factor = %d", &n) == 1)
    {
      LIMIT(0, n, 1000);
      s->scale_factor = n;
    }
    else if(sscanf(line, "bank override = %d", &n) == 1)
    {
      LIMIT(0, n, 127);
      s->bank_override = n;
    }
    else if(sscanf(line, "drum kit override = %d", &n) == 1)
    {
      LIMIT(0, n, 127);
      s->kit_override = n;
    }
    else if(sscanf(line, "default drum channel = %d", &n) == 1)
    {
      LIMIT(1, n, 16);
      s->def_perc_chan = n - 1;
    }
    else if(sscanf(line, "master volume = %d", &n) == 1)
    {
      LIMIT(0, n, 1023);
      s->master_volume = n;
    }
    else if(sscanf(line, "master balance = %d", &n) == 1)
    {
      LIMIT(0, n, 1023);
      s->master_balance = n;
    }
    else if(sscanf(line, "master coarse tuning = %d", &n) == 1)
    {
      LIMIT(-64, n, 63);
      s->master_coarse = n;
    }
    else if(sscanf(line, "master fine tuning = %d", &n) == 1)
    {
      LIMIT(-8192, n, 8191);
      s->master_fine = n;
    }
    else if(sscanf(line, "options = %d", &n) == 1)
      s->switches = (s->switches & ~(FLAG_MASK<<MONO_AUDIO)) | ((n & FLAG_MASK) << MONO_AUDIO);
  }

  fclose(f);

  return 0;
}

/*
 * choices_write
 * -------------
 */
int choices_write(syn_t *s, const char *filename)
{
  FILE *f;

  if((f = fopen(filename, "w")) == NULL)
    return -PROBLEM_OPENING_FILE;

  fprintf(f, "Midi Synth choices\n\n");
  fprintf(f, "polyphony = %d\n", s->num_gens);
  fprintf(f, "sleep timeout = %d\n", mod.sleep_timeout / TICKER_RATE);
  fprintf(f, "glide scale factor = %d\n", s->scale_factor);
  fprintf(f, "bank override = %d\n", s->bank_override);
  fprintf(f, "drum kit override = %d\n", s->kit_override);
  fprintf(f, "default drum channel = %d\n", s->def_perc_chan + 1);
  fprintf(f, "master volume = %d\n", s->master_volume);
  fprintf(f, "master balance = %d\n", s->master_balance);
  fprintf(f, "master coarse tuning = %d\n", s->master_coarse);
  fprintf(f, "master fine tuning = %d\n", s->master_fine);
  fprintf(f, "options = %d\n", (s->switches >> MONO_AUDIO) & FLAG_MASK);

  fclose(f);
  return 0;
}


