Reproductor de mp3
Creaci�n de una clase para la reproducci�n de archivos mp3.

29 de Junio de 2003 (08/Jul/2003)
Autor: Gonzalo Antonio sosa M. y [email protected]


Uso de Nuestra Clase.

Sin m�s pre�mbulo, nos ponemos a programar nuestra aplicaci�n.

Importamos el espacios de nombres necesarios:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;

Agregamos algunas declaraciones de variables.

// Creamos el objeto dela clase reproductor.
private Reproductor Sonido = new Reproductor();
// Una colecci�n para agrupar los elementos listados.
private Hashtable hashMusica = new Hashtable();
// Bandera para informar sobre el arrastre del indicador de progreso.
private bool trackBarClick = false;

La codificaci�n del cuerpo de la clase se ha definido como sigue:

private void Form1_Load(object sender, System.EventArgs e)
{
    // Inicializamos el panel de mensajes.
    stMensajes.Panels[0].Text = "Listo";
    // Asiganamos un manejador para el evento Mensajes del Reproductor.
    Sonido.ReproductorEstado += new Reproductor.ReproductorMessage(
    this.MensajesDelReproductor);
    // Establecemos la propiedad que permite seleccionar varios elementos
    // en el cuadro de dialogo abrir.
    Of.Multiselect = true;
    //Verificamos el n�mero de dispositivos de salida existentes
    int numDevs = Sonido.DispositivosDeSonido();
    if (numDevs == 0)
        MessageBox.Show("No se han encontrado dispositivos de salida de audio \n
        presentes en el sistema", "Dispositivos no encontrados",
        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
/// <summary>
/// M�todo que gestiona los mensajes emitidos por la clase Reproductor.
/// </summary>
/// <param name="Msg">Cadena de mensajes.</param>
private void MensajesDelReproductor(string Msg)
{
    // S� el mensaje es diferente de Ok, 
    if (Msg != "Ok")
    {
        // se muestra en el panel de mensajes.
        stMensajes.Panels[0].Text = Msg;
        // y detenemos el reloj.
        timer1.Stop();
        timer1.Enabled = false;
    }
}

private void button1_Click(object sender, System.EventArgs e)
{
    // Iniciamos la Reproducci�n
    IniciarReproduccion();
}

private void Form1_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
{
// Nos aseguramos que estamos arrastrando archivos, no texto u otra cosa
    if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
    // permitimos la operaci�n.
    e.Effect = DragDropEffects.Copy;
}

private void Form1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
    // obtenemos la lista de los archivos arrastrados.
    string[] archivos = (string[])(e.Data.GetData(DataFormats.FileDrop));
    // por cada archivo en la lista,
    for (int i = 0; i < archivos.Length; i++)
    {
        // si la extensi�n del archivo es la correcta
        if (Path.GetExtension(archivos[i]) == ".mp3")
            // agrega a la lista de reproducci�n.
            AgregarArchivos(Sonido.NombreLargo(archivos[i]));
    }
}

private void linkLabel2_LinkClicked(object sender,
System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
{
    // Si hay elementos en la lista de reproducci�n
    if (listBox1.Items.Count > 0)
    {
        // se eliminan de la lista, y de la colecci�n.
        listBox1.Items.Clear(); 
        hashMusica.Clear();
    }
}

private void button4_Click(object sender, System.EventArgs e)
{
    // Cerramos la aplicaci�n.
    Close();
}

private void button2_Click(object sender, System.EventArgs e)
{
    if (button2.Text == "&Pausar")
    {
        // se env�a la operaci�n de pausar,
        Sonido.Pausar();
        // cambiamos el texto del bot�n
        button2.Text = "&Continuar";
        // detenemos el reloj.
        timer1.Stop();
    }
    else // s� el archivo se encontraba pausado,
    {
        // continuamos con la reproducci�n
        Sonido.Continuar();
        // cambiamos el texto del bot�n.
        button2.Text = "&Pausar";
        // iniciamos el reloj.
        timer1.Start();
    }
}

private void button3_Click(object sender, System.EventArgs e)
{
    // Detenemos la reproducci�n.
    DetenerReproduccion();
}

private void timer1_Tick(object sender, System.EventArgs e)
{
    // Cada tick de nuestro reloj de control, nos permitir�
    // actualizar el panel de tiempos, con el total de tiempo y
    // tiempo transcurrido y el progreso
    stTiempos.Panels[0].Text = "Tiempo Total: " + Sonido.Tama�o();
    stTiempos.Panels[1].Text = "Tiempo Tracurrido: " + Sonido.Posicion();
    stMensajes.Panels[0].Text ="Estado del Reproductor:"+ Sonido.Estado();

    if (!trackBarClick)
    trackBar1.Value = (int) Sonido.CalcularPosicion();

    // s� la reproducci�n se ha detenido,
    if (Sonido.EstadoDetenido())
    {
        // Cerramos el archivo y los recursos utilizados
        DetenerReproduccion();
        // Si a�n hay elementos que recorrer en la lista
        // y la opci�n de avance autom�tica este habilitada
        if((listBox1.SelectedIndex < listBox1.Items.Count-1)&& checkBox1.Checked)
        {
        // avanzamos en una posici�n el elemento actualmente seleccionado
            listBox1.SelectedIndex = listBox1.SelectedIndex + 1;
            // e iniciamos nuevamente la reproducci�n.
            IniciarReproduccion();
        }
    }
}

private void linkLabel1_LinkClicked(object sender,
System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
{
    // Establecemos el filtro para el tipo de archivos que deseamos
    Of.Filter = "Archivos de mp3 (*.mp3) | *.mp3";
    if (Of.ShowDialog() == DialogResult.OK)
    {
        // agregamos los elementos a la lista de reproducci�n.
        string[] archivos = Of.FileNames;
        for (int i = 0; i < archivos.Length; i++)
        AgregarArchivos(archivos[i]);
    }
}

private void Form1_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{
    // Verificamos que el reproductor no se encuetre activo,
    // pausado o el archivo abierto.
    if (Sonido.EstadoReproduciendo() || Sonido.EstadoPausado() ||
    Sonido.EstadoAbierto())
    // de ser as�, detenemos la reproducci�n y cerramos el archivo.
    	Sonido.Cerrar();
}

/// <summary>
/// Agrega nombre de archivos sin extensi�n a la lista de reproducci�n y
/// nombres de archivos largos a la colecci�n de m�sica.
/// </summary>
/// <param name="NombreArchivoLargo">Nombre de archivo completo.</param>
private void AgregarArchivos(string NombreArchivoLargo)
{
    // Obtenemos el nombre de archivo, eliminando la ruta y la extensi�n.
    string nombreArchivo = Path.GetFileNameWithoutExtension(NombreArchivoLargo);
    // agregamos la ruta completa a la lista de reproducci�n,
    if (!hashMusica.ContainsKey(nombreArchivo))
    {
        hashMusica.Add(nombreArchivo, NombreArchivoLargo);
        // agregamos solo el nombre del archivo a la lista.
        listBox1.Items.Add(nombreArchivo);
    }
}

/// <summary>
/// Devuelve la ruta completa a partir del nombre de archivo obtenido 
/// de la lista de reproducci�n.
/// </summary>
/// <param name="ArchivoBuscado">Nombre de archivo seleccionado.</param>
/// <returns>Cadena con la informaci�n completa del archivo.</returns>
private string ObtenerNombreLargo(string ArchivoBuscado)
{
    // Recorremos cada elemento de la colecci�n de m�sica,
    foreach (DictionaryEntry entry in hashMusica)
    {
        // Si encontramos el elemento deseado,
        if (entry.Key.ToString() == ArchivoBuscado)
            // devolvemos la informaci�n sobre �l.
            return entry.Value.ToString();
    } // de no ser as�, devolvemos una cadena vac�a.
    return "";
}

private void listBox1_DoubleClick(object sender, System.EventArgs e)
{
    // Iniciamos la reproducci�n
    IniciarReproduccion();
}

private void IniciarReproduccion()
{
    // S� hay un elemento seleccionado en la lista
    if (listBox1.SelectedIndex > -1)
    {
        // Si hay alg�n otro archivo escuch�ndose, se detiene.
        if (Sonido.EstadoReproduciendo()) DetenerReproduccion();
            // Asignamos el nombre del archivo a la propiedad correspondiente,
            Sonido.NombreDeArchivo = ObtenerNombreLargo(
            listBox1.SelectedItem.ToString());
            // Iniciamos la reproducci�n,
            Sonido.Reproducir();
            // establecemos los valores para la barra de progreso.
            trackBar1.Minimum = 0;
            trackBar1.Maximum = (int) Sonido.CalcularTama�o();
            // Iniciamos el reloj de control.
            timer1.Enabled = true;
            timer1.Start();
    }
}

private void trackBar1_MouseDown(object sender, 
System.Windows.Forms.MouseEventArgs e)
{
    // si se ha hecho click en la barra de progreso, 
    // habilitamos el avance manual.
    trackBarClick = true;
}

private void trackBar1_MouseUp(object sender,
System.Windows.Forms.MouseEventArgs e)
{
    // Deshabilitamos el avance manual
    trackBarClick = false;
    // detenemos la reproducci�n actual
    Sonido.Detener();
    // Avanzamos el apuntador de archivo a la posici�n deseada,
    Sonido.Reposicionar(trackBar1.Value);
    // reinciamos la reproducci�n desde ese punto
    Sonido.ReproducirDesde(trackBar1.Value);
    // iniciamos el reloj nuevamente.
    timer1.Start();
}

/// <summary>
/// Detiene la reproducci�n actual y libera los recursos utilizados.
/// </summary>
private void DetenerReproduccion()
{
    // Cerramos el archivo actual en reproducci�n,detenemos el reloj de control
    // e reiniciamos los recursos utilizados.
    Sonido.Cerrar();
    timer1.Enabled = false;
    timer1.Stop();
    trackBar1.Value = 0;
    stTiempos.Panels[0].Text = "Tiempo Total:";
    stTiempos.Panels[1].Text = "Tiempo Transcurrido:";
    stMensajes.Panels[0].Text = "Listo";
}

private void linkLabel3_LinkClicked(object sender,
System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
{
    // Si hay alg�n elemento seleccionado
    if (listBox1.SelectedIndex > -1)
        // lo eliminamos.
        listBox1.Items.RemoveAt(listBox1.SelectedIndex);
}
Anterior Men� Siguiente

ir al ndice