/*
 * This is an alternate backend for the music system.
 * It uses SDL_mixer to provide a more reliable playback,
 * and allow processing of multiple audio formats.
 *
 *  -- MD2211 (2006-04-24)
 */

#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>
#include <string.h>
#include "args.h"


Mix_Music *current_music = NULL;
char current_music_name[32];

void music_done() {
  Mix_HaltMusic();
  Mix_FreeMusic(current_music);
  current_music = NULL;
}

void get_actual_music_filename(char *filename) {
  int i, t;
  int got_end = 0;
  char music_ext[4*sizeof(char)]; // Only 3-letter extension is supported

  // Drop the .hmp extension
  for (i=0; !got_end; i++) {
    switch (filename[i]) {
    case '\0':
    case '.':
	got_end = 1;
    default:
      current_music_name[i] = filename[i];
      break;
    }
  }
  current_music_name[i] = '\0'; //this is safer

  // Assume MIDI as default extension
  strcpy(music_ext, "mid");

  // Extension is given by argument, if present
  if ((t = FindArg("-sdl_music"))) {
    sprintf(music_ext, "%.3s", Args[t+1]);
  } else {
    perror("sdl_music option: syntax error");
  }

  strcpy(current_music_name+((i)*sizeof(char)), music_ext);
}

void play_music(char *filename, int loop) {

  int fade_msec = 500;
  loop *= -1;

  get_actual_music_filename(filename);
  current_music = Mix_LoadMUS(current_music_name);         

  if (current_music) {
    if (Mix_PlayingMusic()) {
      // Fade-in effect sounds cleaner if we're already playing something
      Mix_FadeInMusic(current_music, loop, fade_msec);
    }
    else {
      Mix_PlayMusic(current_music, loop);
    }

    Mix_HookMusicFinished(music_done);
    printf("Now playing: %s\n", current_music_name);
  }
  else {
    printf("Music %s could not be loaded\n", current_music_name);
    Mix_HaltMusic();
  }
}

void set_music_volume(int vol) {
  Mix_VolumeMusic(vol);
}

