// Programación en C++ para Ingenieros, Ed. Thomson Paraninfo, 2006
// Apéndice B: La Biblioteca CDAudioLib

// Fichero AplicacionCDAudio.h
// Especificación de la clase AplicacionCDAudio

#ifndef _APLICACIONCDAUDIO
#define _APLICACIONCDAUDIO

#include <windows.h>
#include "cdaudio.h"
#include <vector>
#include "resource.h"

class AplicacionCDAudio {

    // Ventana de diálogo de la aplicación.
    static HWND hDlg;
    // Lista de tracks a reproducir.
    static std::vector<int> vListaTracks;
    // Posición del track actual en la lista vListaTracks.
    static int iTrackActual;
    // Atributos que mantienen el estado del dispositivo.
    static bool bPausa;
    static bool bResume;
    static bool bPlaying;
    // Atributos que mantienen si las casillas de verificación
    // Orden Aleatorio y Repetir están activadas o no.,
    static bool bRandom;
    static bool bRepetir;
  public:
    // Constructor de la clase.
    AplicacionCDAudio(HINSTANCE hinstance);
    // Método que ejecuta la aplicación.
    int Ejecutar(void);
    // Función de atención a los mensajes de la ventana de diálogo hDlg.
    static BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam,
                                 LPARAM lParam);
    // Función de atención a las interrupciones del dispositivo.
    static void intProcedure(int wParam);

  private:

    // Método que se ejecuta cuando se pulsa el boton
    // Play/Pause. Cambia el estado de la aplicación
    // de play a pause y viceversa. Actualiza los
    // botones de la ventana de diálogo hDlg.
    static void botonPlayPausa(void);

    // Método que se ejecuta cuando se pulsa el botón Siguiente.
    // Actualiza el track actual al siguiente de la lista de
    // tracks vListaTracks y si está reproduciendo se incia la
    // reproducción del nuevo track.
    static void botonSiguiente(void);

    // Método que se ejecuta cuando se pulsa el botón Anterior.
    // Actualiza el track actual al anterior de la lista de
    // tracks vListaTracks y si está reproduciendo se incia la
    // reproducción del nuevo track.
    static void botonAnterior(void);

    // Método que se ejecuta cuando se pulsa el botón Expulsar.
    // Abre la puerta del dispositivo, expulsa el CD y actualiza
    // la lista de reproducción y la ventana de diálogo.
    static void botonExpulsar(void);

    // Método que se ejecuta cuando se pulsa el botón Stop.
    // Si está reproduciendo detiene la reproducción.
    static void botonStop(void);

    // Método que se ejecuta cuando se marca o desmarca la casilla
    // de verificación Orden aleatorio. Actualiza la lista de
    // reproducción vListaTracks según corresponda.
    static void controlCheckRandom(void);

    // Método que se ejecuta cuando se marca o desmarca la casilla
    // de verificación Repetir. Actualiza el atributo de estado bRepetir
    // que indica si la casilla está marcada o no.
    static void controlCheckRepetir(void);

    // Método que genera la lista de tracks a reproducir en un orden
    // aleatorio.
    static void generarListaTracks(void);

    // Método que genera la lista de tracks a reproducir en el mismo orden
    // que se encuentran en el CD.
    static void generarListaAleatoriaTracks(void);

    // Método que actualiza la lista de reproducción vListaTracks y la
    // ventana de diálogo hDlg según el contenido del CD y las casillas
    // de verificación.
    static void reset(void);
};

#endif