C# Problemas con filtros de archivos de musica, solo permite .wav

Iniciado por SeniorX, 2 Junio 2006, 03:39 AM

0 Miembros y 2 Visitantes están viendo este tema.

SeniorX

Hola a todos... espero que me puedan ayudar, si no saben, pero por lo menos saben donde me podrian ayudar, les agradeceria que postearan un link a otro foro o algo por el estilo.
Les expongo mi problema:
Estoy haciendo un despertador en c#, lo unico que me falta es hacer que el programa reproduzca un archivo de audio especificado por el usuario.
(Voy a mostrar las partes de codigo en especifico, pero si necesitan mas codigo para lograr una solucion, no tengo problemas en postearlo)
Invoco a un reproductor:
private System.Media.SoundPlayer musica = new System.Media.SoundPlayer();
Le agrego un openFileDialog y lo llamo archivo y agrego el filtro (empiezan los problemas):
private void button1_Click(object sender, EventArgs e)
        {

            archivo.Filter = "Solo archivos .wav |*.wav";
            if (archivo.ShowDialog() == DialogResult.OK)
            {
                archivoDeAlarma = archivo.FileName;
                txtArchivoAlarma.Text = archivoDeAlarma;
            }
        }

Donde el button1 es el que dice Examinar.
El problema de raiz está acá ya que me veo obligado a usar archivos .wav ya que al invocar musica.PlayLoops() me dice que es para archivos .wav y nada más, al igual que musica.Play().



Entonces acá va mi pregunta:¿¿ Como hago para que pueda reproducir un archivo mp3?? o midi?
try {
     live();
}
catch (ShitHappensException ex) {
MessageBox.Show(ex.Solution)
}

Precaución: La programacion puede producir adiccion

BADBYTE-K

#1
Hola

Tu problema empieza debido a la limitacion que te provee el mismo .net framework con la clase SoundPlayer que estas usando , ya que esta especificada solo para la reproduccion de archivos .wav

Entonces lo que debes hacer es cambiar todo el modelo de la reproduccion del audio de tu despertador si es que deseas lograr reproducir mp3's

Puedes hacerlo de varias formas, la mas facil es haciendo uso de interoperabilidad COM haciendo referencia al componente "ActiveMovie COM" (C:\WINDOWS\system32\quartz.dll)


Aqui te pego el codigo para que veas como es el funcionamiento basico de dicho componente:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using QuartzTypeLib;


namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter =
            "Media Files|*.wav;*.mp3;*.mp2;*.wma|All Files|*.*";
            if (DialogResult.OK == openFileDialog.ShowDialog())
            {
               
                QuartzTypeLib.FilgraphManager graphManager =
                new QuartzTypeLib.FilgraphManager();
                QuartzTypeLib.IMediaControl mediacontrol =
                (QuartzTypeLib.IMediaControl)graphManager;

                mediacontrol.RenderFile(openFileDialog.FileName);
               
                mediacontrol.Run();
            }
        }
    }
}


Ese codigo es el standar para el uso del componente lo encuentras en libros, webs, etc. pruebalo y veras como funciona la reproduccion.

sigue estos detalles por si tienes problemas al compilar:

Crea un nuevo proyecto windows C#
Agrega una referencia al componente
Agrega un boton al formulario
agrega un OpenFileDialog

para los detalles de la programacion del componente, lo encuentras en cualquier sitio de la red, avisa en caso de dudas.

Y con respecto a otras formas, pues podrias hacerlo jugando con api's pero es mas trabajoso.

saludos!

SeniorX

Hey men, muchas gracias por la respuesta, pero mira lo que pasó:
public partial class Form1 : Form
    {
        string archivoDeAlarma;
        private DateTime alarmaHora;
        bool alarmaHabilitada;
        public QuartzTypeLib.FilgraphManager graphManager = new QuartzTypeLib.FilgraphManager();
        public QuartzTypeLib.IMediaControl mediacontrol = (QuartzTypeLib.IMediaControl)graphManager;
       

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            archivo.Filter = "Media Files|*.wav;*.mp3;*.mp2;*.wma|All Files|*.*";
            if (archivo.ShowDialog() == DialogResult.OK)
            {
               
                 mediacontrol.RenderFile(archivo.FileName);
                mediacontrol.Run();
                archivoDeAlarma = archivo.FileName;
                txtArchivoAlarma.Text = archivoDeAlarma;
            }
        }

Me destaca
Citarpublic QuartzTypeLib.FilgraphManager graphManager = new QuartzTypeLib.FilgraphManager();
        public QuartzTypeLib.IMediaControl mediacontrol = (QuartzTypeLib.IMediaControl)graphManager;
Dice:
CitarError   1   A field initializer cannot reference the nonstatic field, method, or property 'WindowsApplication1.Form1.graphManager'   C:\Documents and Settings\pietro\Mis documentos\Visual Studio 2005\Projects\Despertador\Despertador\Form1.cs   18   88   Despertador

A ver si me indican que hago mal...
try {
     live();
}
catch (ShitHappensException ex) {
MessageBox.Show(ex.Solution)
}

Precaución: La programacion puede producir adiccion

SeniorX

hey... estaba pensando en el programa y se me ocurrio:
¿Se puede hacer que cuando sea la hora de despertar el programa le suba el volumen al pc? como se hace desde la barra inicio o el panel de control.
Si es que se puede, ojalá me puedan orientar a algun lado para estudiar.
try {
     live();
}
catch (ShitHappensException ex) {
MessageBox.Show(ex.Solution)
}

Precaución: La programacion puede producir adiccion

BADBYTE-K

Aqui te adjunto todo el proyecto para que no tengas problemas


saludos

SeniorX

Men no sabes cuanto agradezco tu paciencia :). El programa anda perfecto  ::).
Solo me falta agregar que controlador en el cual el usuario indique el volumen del despertador. Entonces cuando sea la hora el volumen sube y se reproduce la cancion.
Realizado esto, posteo el codigo para que opinen, ayuden y aporten como optimizar código, segun yo... está bien.
try {
     live();
}
catch (ShitHappensException ex) {
MessageBox.Show(ex.Solution)
}

Precaución: La programacion puede producir adiccion

SeniorX

última pregunta... ya que nadie supo como subir el volumen de los parlantes  :-(.

El programa funciona de lujo... y ahora como hago para que el programa no dependa del framework?¿? Disculpen la ignorancia pero soy un aprendiz  :P
try {
     live();
}
catch (ShitHappensException ex) {
MessageBox.Show(ex.Solution)
}

Precaución: La programacion puede producir adiccion

BADBYTE-K

Hola.

Lo que tu quieres hacer no es posible, ya que el .net framework es como el corazon de la ejecucion de tu aplicacion, es como un gran repositorio del cual tu app se apoyara en todo sentido. como biblioteca, rutinas, seguridad, etc.

Solo cuentanos, porque deseas una independencia del .net framework? cuenta con confianza, que aqui todos estamos para aprender.


saludos


JuszR

Cita de: SeniorX en  7 Junio 2006, 01:07 AM
El programa funciona de lujo... y ahora como hago para que el programa no dependa del framework?¿? Disculpen la ignorancia pero soy un aprendiz  :P
Es imposible. Es como que las aplicaciones en Java se ejecuten sin el JVM o las de Vb6 sin el msvbvm60.dll.


Cita de: BADBYTE-K en  7 Junio 2006, 07:07 AM
Solo cuentanos, porque deseas una independencia del .net framework? cuenta con confianza, que aqui todos estamos para aprender.
Por lo de siempre. No todos tienen banda ancha y el .Net Framework ocupa como 30Mb. Difícilmente el usuario ya lo tendrá instalado, a menos que tenga GNU/Linux con una distro como Suse donde MONO se instala fácil desde los cd's.

Es la desventaja de programar en lenguajes fuera de C, C++ y Asm. :-\
- No programming language is perfect. There is not even a single best language; there are only languages well suited or perhaps poorly suited for particular purposes. [Herbert Mayer]

SeniorX

Cita de: BADBYTE-K en  7 Junio 2006, 07:07 AM
Solo cuentanos, porque deseas una independencia del .net framework? cuenta con confianza, que aqui todos estamos para aprender.
.Net Framework ocupa como 30Mb. Difícilmente el usuario ya lo tendrá instalado
Es la desventaja de programar en lenguajes fuera de C, C++ y Asm. :-\
Citar
Por eso mismo XD, casi nadie tiene el .netframework... a menos que programe en .NET :P
try {
     live();
}
catch (ShitHappensException ex) {
MessageBox.Show(ex.Solution)
}

Precaución: La programacion puede producir adiccion