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

  Anything to do with the choices file.
*/

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

#define LINE_LEN 64

/*
 * choices_read
 * ------------
 * Out of range options are ignored.
 */
int choices_read(syn_t *s, opt_t *o, const char *filename)
{
  FILE *f;
  int n;
  char line[LINE_LEN];

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

  if(fgets(line, LINE_LEN, f) != 0)
  {
    if((strncmp(line, "Midi Synth choices", 18) != 0) &&
       (strncmp(line, "Midi Converter choices", 22) != 0))
    {
      fclose(f);
      return -NOT_A_CHOICES_FILE;
    }

    while(fgets(line, LINE_LEN, f) != 0)
    {
      if((line[0] == '#') || (line[0] <= ' '))
        continue; // skip blank and comment lines

      // Midi Synth options that MidiCon can use

      if(sscanf(line, "polyphony = %d", &n) == 1)
      {
        if((n >= 4) && (n <= NUM_GENS))
          s->num_gens = n;
      }
      else if(sscanf(line, "glide scale factor = %d", &n) == 1)
      {
        if((n >= 0) && (n <= 1000))
          s->scale_factor = n;
      }
      else if(sscanf(line, "bank override = %d", &n) == 1)
      {
        if((n >= 0) && (n <= 127))
          s->bank_override = n;
      }
      else if(sscanf(line, "drum kit override = %d", &n) == 1)
      {
        if((n >= 0) && (n <= 127))
          s->kit_override = n;
      }
      else if(sscanf(line, "master volume = %d", &n) == 1)
      {
        if((n >= 0) && (n <= 1023))
          s->master_volume = n;
      }
      else if(sscanf(line, "master balance = %d", &n) == 1)
      {
        if((n >= 0) && (n <= 1023))
          s->master_balance = n;
      }
      else if(sscanf(line, "master coarse tuning = %d", &n) == 1)
      {
        if((n >= -64) && (n <= 63))
        s->master_coarse = n;
      }
      else if(sscanf(line, "master fine tuning = %d", &n) == 1)
      {
        if((n >= -8192) && (n <= 8191))
          s->master_fine = n;
      }
      else if(sscanf(line, "options = %d", &n) == 1)
        // only bits 1,2,3 are used by the converter
        s->switches = (s->switches & ~(FLAG_MASK<<L_R_SWAP)) | (((n>>1) & FLAG_MASK) << L_R_SWAP);

      // extra options for MidiCon

      else if(sscanf(line, "tempo = %d", &n) == 1)
      {
        if((n >= 10) && (n <= 1000))
          o->tempo = n;
      }
      else if(sscanf(line, "sample rate = %d", &n) == 1)
      {
        if((n == 32000) || (n == 44100) || (n == 48000))
          o->sample_rate = n;
      }
      else if(sscanf(line, "bitrate = %d", &n) == 1)
      {
        if((n==64)||(n==80)||(n==96)||(n==112)||(n==128)||
           (n==160)||(n==192)||(n==224)||(n==256)||(n==320))
          o->bitrate = n;
      }
      else if(sscanf(line, "mono = %d", &n) == 1)
      {
        if((n == 0) || (n == 1))
          o->mono = n;
      }
    }
  }
  fclose(f);
  return 0;
}


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

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

  fprintf(f, "Midi Converter choices\n\n# Midi Synth options:\n");
  fprintf(f, "polyphony = %d\n", s->num_gens);
  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, "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<<1));
  fprintf(f, "\n# MidiCon options:\n");
  fprintf(f, "tempo = %d\n", o->tempo);
  fprintf(f, "sample rate = %d\n", o->sample_rate);
  fprintf(f, "bitrate = %d\n", o->bitrate);
  fprintf(f, "mono = %d\n", o->mono);
  fclose(f);
  return 0;
}



