Saltar al Contenido | Saltar al Menú de Navegación

Reproductor en C# con BASS.NET

Publicado por Abraham Chacón el 21 de septiembre de 2009
Ver Respuestas

13

Existen muchas plataformas de desarrollo que incluyen clases y métodos capaces de manejar audio. Aún cuando todo lo anterior suene lindo, desgraciadamente no implementan todas las clases o métodos que el programador quisiera tener a su disposición.

Por ejemplo, la reproducción de audio en C#.NET no es de lo más simple o práctico debido a que se deben importar DLL’s externas y manipularlas como si de Uranio se tratara.

Afortunadamente, existen herramientas que nos facilitan la vida como programadores. En esta entrada explicaré el funcionamiento de la API BASS.NET y cómo usarla para manejar audio, ej. hacer un reproductor sencillo ;-D .

Requisitos previos

Oh Desilución ¿Creías que iba a dártelo todo en bandeja de plata?.

Manos a la obra – Programando en C#

.NET Framework tiene la limitación de sólo poder reproducir archivos WAV, cosa completamente lógica debido a cuestiones de licencia. Otra opción sería usar el control de Windows Media Player pero sería hacer trampa, y como en Exolimpo.com no nos gusta ser tramposos, vamos a implementar algo nosotros con la ayuda de la API BASS.NET para poder reproducir archivos de cualquier formato.

Aquí asumo que ya tienes conocimientos básicos de programación en C#, que hayas descargado BASS.NET (API y la DLL) y que ya tengas instalado Visual C# Express (o al menos saberlo instalar).

Primero creamos un nuevo proyecto para programar una aplicación de Windows Forms. Puedes ponerle cualquier nombre, en mi caso lo he llamado “MyPlayer”. Una vez hecho esto, hay que dar click derecho en el proyecto y añadir la siguiente referencia (para esto ya debemos tener instalada la API).

api Después de esto, hay que añadir al proyecto la DLL que descargamos también y cambiar el valor de la propiedad de “Copia en el directorio de resultados” por "Copiar siempre”. En seguida, añadimos cualquier archivo de audio (MP3 por ejemplo).

Ahora que todo está en orden, podemos empezar a freír las tortas de las hamburguesas en el azador :-D .

Hay varias cosas que se pueden hacer con la API BASS, como trabajar con sonido surround, la velocidad, la posición, la distancia, algunos efectos “doppler” y muchas cosas más. Recomiendo que se echen un clavado en la documentación porque realmente es muy buena y descriptiva.

Primero que nada, incluiremos el espacio de nombres Un4seen.Bass . Después inicializaremos el dispositivo (de audio) con los siguientes parámetros en un constructor.

Using Un4seen.Bass;
public Player()
        {
            Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero, null);
        }

El primer parámetro inicia el dispositivo de audio predeterminado, el segundo especifica la frecuencia de muestreo que en este caso serían 44.1 KHz que es la que comúnmente tiene la mayoría; los demás parámetros son muy bien explicados en la descripción de los mismos.

Ahora, para poder cargar el archivo mp3 es necesario crear un stream primero y hacerlo es sencillo.

public void LoadAudioFile(string location)
{
	int stream = Bass.BASS_StreamCreateFile(location, 0 , 0
		BASSFlag.BASS_SAMPLE_FLOAT);
}

Todos los parámetros son muy bien explicados en la documentación además de definirse por sí mismos. El primero es el lugar donde se encuentra el archivo mp3, el segundo es el punto donde empezará el stream, el tercero es la longitud del mismo (0 por default es todo) y el último son las “banderas” (flags, en este caso, enumeraciones) de la clase BASSFlag.

CUIDADO: Como aquí se trabaja con código no administrado, debes estar seguro de proteger las referencias, de lo contrario, el Garbage Collector de .NET las borrará. ¿Cómo prevenir esto?, simplemente con mover la variable entera stream fuera del método LoadAudioFile es suficiente. -

Después proseguimos a escribir los métodos que reproducirá, pausará y detendrá el stream

public class Player
{
	int stream //Acá se movió la variable para evitar al GB
	public Player()
	{
		Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, 			IntPtr.Zero, null);
	}
	
	public void LoadAudioFile(string location)
	{
		int stream = Bass.BASS_StreamCreateFile(location, 0 , 0
		BASSFlag.BASS_SAMPLE_FLOAT);
	}

	//Nuevo método.
	public void PlayAudioFile(bool loop)//
	{
		Bass.BASS_ChannelPlay(stream, false);
	}

	public void StopAudioFile()
	{
		Bass.BASS_ChannelPlay(stream, false);
	}

Podemos escribir un destructor ya que parte de los recursos que manejamos son externos a .NET y no los borraría el Garbage Collector. Hacer esto es una buena costumbre sea cual sea el lenguaje o plataforma en que se programe.

~Player()
{
	Bass.BASS_Free();
}

Ahora pasemos al diseño.

gui

openFile

Hacer la interfaz de usuario en Visual Studio (Visual C# Express, lo mismo) es un juego de niños. Arrastra los controles de la barra lateral –Cuadro de herramientas- al Form y ponle nombre a cada uno.

Ahora a crear algunos event-handlers a cada botón, instanciar un objeto de la clase que creamos dentro del constructor y llamar cada una de las funciones que especificamos anteriormente.

public partial class Form1: Form
{
	Player player;
	public Form1()
	{
		InitializeComponent();
		player = new Player();
	}
	
	void LoadButton_Click(object sender, EventArgs e)
	{
		if (openFileDialog.ShowDialog() == DialogResult.Ok)
		{
			player.LoadAudioFile(openFileDialog.FileName);
		}
	}

	void PlayButton_Click(object sender, EventArgs e)
	{
		player.PlayAudioFile(false); //No repetimos la canción
	}

	void StopButton_Click(object sender, EventArgs e)
	{
		player.StopAudioFile();
	}

Y listo. Compila, ejecuta, abre tu rola favorita y reprodúcela. Ya estás listo para realizar tu propio reproductor y reemplazar el que tengas actualmente ;-D .

Music_Girl Cualquier duda con cualquier parte del código, no titubees en preguntar; ahora, si encuentras algún bug, evítanos la pena de borrar tu comentario :-P .

Respuestas a "Reproductor en C# con BASS.NET"