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 gonzaloantonio@iespana.es


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