C sharp - Programación de aplicación multicanal de audio

 
Vista:

Programación de aplicación multicanal de audio

Publicado por Emilio (13 intervenciones) el 02/05/2007 02:10:36
... Para poder exponer mi problema tengo que describir mi programa a grandes rasgos, así que tengo que extenderme un poco, lo siento... Por favor, no pareis de leer, intentad ayudarme... gracias.

Soy estudiante de telecomunicaciones por imagen y sonido, haciendo un proyecto más bien de informática... Una aplicación multicanal de audio capaz de reproducir y registrar audio simultáneamente en C#.

He avanzado mucho ya en el código y en la estructura del programa, pero creo que debería abstraer un poco más mis clases y objetos, ya que empiezo a tener una dependencia entre todos ellos que tiene mi codigo muy "enmarañado".

Os explico brevemente:

- El form principal MDIPrincipal es el que contiene todas las barras de herramientas, los botones de PLAY, STOP... etc, los botones de carga de sesión, gestión de pistas, etc... Una simple interfaz gráfica, no implemento demasiado código en ella.

-En este form existe un objeto de tipo PanelDePistas (control de usuario) , que es el que va a contener un número indefinido de pistas de audio, y además llevará implementadas las funcionalidades de reproducción simultánea de todas las pistas, y grabación de todas las pistas (mediante otras clases internas).

-Luego tenemos una unidad fundamental: El control de usuario UnaPista. A esta pista le podremos asociar un archivo WAV, podremos establecer su Volumen, su Balance, si está en modo MUTE o en modo SOLO...

-Esta pista además contiene un objeto de tipo: GraficaOnda, que como su propio nombre indica es el encargado de leer del archivo WAV y representar gráficamente. Además se encargará de hacer zoom y todo eso. La idea es que sea independiente (dentro de lo posible) del objeto UnaPista.

-Por otro lado tenemos un objeto llamado BaseDeTiempos que simplemente se encarga de representar una base de tiempos, y de establecerle funcionalidades para desplazar la gráfica o posicionar el cursor.

-Y además hay otro objeto llamado Vumetro, que es un control grafico capaz de representar con lucecitas un determinado valor.

.... Habiendo explicado brevemente los objetos principales de mi programa: PanelDePista, UnaPista, GraficaOnda, BaseDeTiempos... Os cuento qué hace que mi código esté tan enmarañado:

El problema principal está en que los objetos deben tener una relación entre sí. Así, por ejemplo, necesitamos acceder desde el objeto GraficaOnda al objeto padre UnaPista para cambiar sus propiedades (por ejemplo, un indicador de nivel de Zoom). Además, por ejemplo, necesitamos acceder desde el objeto UnaPista al objeto padre PanelDePistas, por ejemplo para que éste sepa que se han producido cambios en las propiedades de la pista... etc.

Hasta ahora estaba haciendo todo esto pasando por parámetro el objeto padre en el contructor del objeto. Por ejemplo:

public UnaPista(UserControl PanelPadre)
{
InitializeComponents( );
this.PanelPadre = PanelPadre as PanelDePistas; //Aquí definimos el objeto padre.
}

De esta forma, si desde el objeto GraficaOnda, quería cambiar un dato de PanelDePistas, simplemente llamaba de esta forma:

this.PistaPadre.PanelPadre.PropiedadTal = Cual;

... ¿Problema? Ha llegado un momento en que todos los objetos dependen de todos. Si hago un cambio en PanelDePista necesito cambiar todos los demás, ya que estos acceden a él.
----------------------------------------------
He estado pensando hoy y creo que debería empezar a crear eventos a mis objetos... De esta forma, si cambiamos una propiedad de GraficaOnda, salta un evento y en el objeto padre definimos una rutina para esto. Sin embargo me surgen dudas...

Además, me gustaría que los objetos fueran independientes: es decir, si modifico PanelDePista, que UnaPista no se entere, y viceversa. Y además me gustaría "ensamblar" todas las clases y subcontroles que forman un control en un único Control de Usuario para poder usarlo de forma independiente incluso en otro proyecto. ¿Cómo se hace esto?.

------- Resumen de preguntas:
1- ¿Cómo se gestionan los componentes en programas complejos cuando estos deben tener relación entre sí?
¿Es correcto pasar el objeto padre por parámetro, o esto a la larga es una chapuza?

2.- ¿Cómo puedo asociar distintas clases a un mismo Control De Usuario, para compilarlo de forma independiente y usarlo en distintos proyectos?
¿Deben las clases internas aparecer como "internal" siempre?
¿Qué sucede si hay clases que quiero usar en varios controles a la vez, las defino como "internal" varias veces en los distintos controles?
¿No rompe esto la norma de reutilización de código?

------
Muchísimas gracias de antemano, y lo siento por haberme extendido tanto pero no he sabido resumir más.
Un saludo
Emilio.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Programación de aplicación multicanal de audio

Publicado por Emilio (13 intervenciones) el 02/05/2007 02:14:25
Por cierto, por si no imaginais muy bien el programa, es como Adobe Audition, o como Audacity (software libre), pero algo más simplificado.

Por cierto, el código de Audacity lo he mirado, pero es un C++ bastante cerrado y complejo, y he podido sacar de ahí cosas muy generales...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Programación de aplicación multicanal de audio

Publicado por juank (1 intervención) el 07/09/2007 15:15:35
emilio las clases y los objetos donde defines el objeto lo podrias hacer creando una macro, si gustas podiras ensayar lo siguiente.
public UnaPista(UserControl PanelPadre)
{
InitializeComponents( );
this.PanelPadre = PanelPadre as PanelDePistas; }

De esta forma, si desde el objeto GraficaOnda, quería cambiar un dato de PanelDePistas, simplemente llamaba de esta forma:

this.PistaPadre.PanelPadre.PropiedadTal = Cual;

panelpadre.new= this.indepent.load.audio;

si gustas podrias enviarme el fragmento de codigo en el cual tienes el inconveniente y lo vamos ensayando para darle solucion has de entender que con un fragmento de codigo es dificil darle solucion pero si gustas podrias hacer que ensayaramos tu archivo completo para la realizacion de pruebas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar