Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-10-2005
OscarG OscarG is offline
Miembro
 
Registrado: sep 2005
Posts: 35
Poder: 0
OscarG Va por buen camino
Liberar Objetos II

Estoy con un componente de música q me he bajado, el ACS
Audio Components Suite
para ulilizar oggs, la cosa es q quiero cerrar el sonido y liberarlo y me da un error...

esto lo hago con 2 botones, uno para crear el objeto y otro para liberarlo.
En la ayuda encontré q antes de liberar el objeto había q parar la música si estaba sonando, cosa q hice y sigue fallando.

Supongo q no conoceis el componente, pero igual teneis esperiencia con música, yo por lo q veo, no le doy tiempo a q se cierre y por eso falla, ya q si pongo en un botón, parar la música y en otro liberarlo y no los pulso muy rápido, pos no salen problemas...

He pensado en poner un sleep, pero no me gusta, aunq igual es la única solución q me queda...aunq igual hay algún método q te diga si el objeto está lista para ser liberado...


Un dia después, y más inspirado, he utilizado un evento del componente, OnDone, el cual salta cuando se ha completado una canción y he comprobado q tambien vale si la paras...

Entonces he generado este código

Código Delphi [-]
  if ( TAudio.Status in [ tosPlaying ] ) then
    TAudio.Stop;
  if ( TAudio2.Status in [ tosPlaying ] ) then
    TAudio2.Stop;
  if ( TAudio3.Status in [ tosPlaying ] ) then
    TAudio3.Stop;

  while ( contador > 0  ) do
  begin

  end;

  FreeAndNil( TVorbisEntrar );
  FreeAndNil( TAudio );
  FreeAndNil( TVorbisEntrar2 );
  FreeAndNil( TAudio2 );
  FreeAndNil( TVorbisEntrar3 );
  FreeAndNil( TAudio3 );

Bueno, contador es una variable q se incrementa cada vez q se crea un audio, osea en este caso habría 3, y en el método que os he comentado, se iría decrementando a medida q el método Stop hace efecto....

Lo q no me gusta es el while ese, me parece poco seguro, igual hasta una chapuza. Si hay algún error se me puede quedar bloqueado el programa...

Pos eso, algún consejo?

Pos eso, gracias por las molestias!!!
Responder Con Cita
  #2  
Antiguo 07-10-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Hola Oscar!

No tengo experiencia con el componente que mencionas, pero tal vez puedas utilizar Application.ProcessMessages justo antes de liberar el objeto.

Con esto detienes la ejecución de la siguiente línea hasta que se libere por completo la cola de mensajes pendientes.

No estoy seguro de que vaya a funcionar pero nada se pierde con intentarlo.

Un saludo.
Responder Con Cita
  #3  
Antiguo 07-10-2005
OscarG OscarG is offline
Miembro
 
Registrado: sep 2005
Posts: 35
Poder: 0
OscarG Va por buen camino
Lo acabo de probar y no funciona


Si sirve de pista, el componente de audio usa hilos internamente...supongo q ese será el motivo, yo creo q van por ahí los tiros, qdcir, q no le da tiempo a parar la canción antes de liberarlo y por eso casca...
Responder Con Cita
  #4  
Antiguo 07-10-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,


Cita:
Empezado por OscarG
Bueno, contador es una variable q se incrementa cada vez q se crea un audio, osea en este caso habría 3, y en el método que os he comentado, se iría decrementando a medida q el método Stop hace efecto....
¿No podrías comprobar, por ejemplo, mediante "if Assigned" si el objeto que vas a liberar se creó previamente? En otro orden de cosas, aquello de que la variable "contador" aumente cuando se crea un objeto "TAudio"... no sé porqué me parece mejorable, por ejemplo, ¿qué tal añadiendo los objetos "TAudio" a una lista de tipo "TList" o similar, de forma que luego puedas recorrer esta para liberar los objetos que contenga? Colaborando.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 07-10-2005
OscarG OscarG is offline
Miembro
 
Registrado: sep 2005
Posts: 35
Poder: 0
OscarG Va por buen camino
Ummm, creo q me he equivocado al expresarme, el contador lo utilizo para contar las canciones q han empezado a sonar, el problema es q si pongo
Código Delphi [-]
 Cancion.Stop;
 FreeAndNil(Cancion);
Resulta q casca, entonces lo q he hecho es:
1º cuando doy a play, incremento el contador.

2º usando un evento q es OnDone, q salta cuando se ha completado una canción ya sea al pararlo o al finalizar, cuando dicho evento salta, decremento el contador.

De tal forma q cuando quiero liberar el objeto Cancion, antes de liberarlo miro si contador es igual a 0, y mientras no lo sea, lo he metido en un bucle q no hace nada.

Eso es lo q no me gusta, xq me podría pasar cualquier cosa q produzca un bucle infinito...

Quedandome algo asi...(siendo el Objeto Cancion = TAudio).

Código Delphi [-]
//Metodo q crea y ejecuta la música
procedure TForm1.Button1Click(Sender: TObject);
begin
TVorbisEntrar:= TVorbisIn.Create(Self);
TVorbisEntrar.FileName:= 'juego.ogg';
TVorbisEntrar.Loop:= false;
TAudio:= TAudioOut.Create(Self);
TAudio.Input:= TVorbisEntrar;
TAudio.OnDone:= AudioOut1Done; //(Self);
TAudio.Run;
Inc(contador);
TVorbisEntrar2:= TVorbisIn.Create(Self);
TVorbisEntrar2.FileName:= 'menu1.ogg';
TVorbisEntrar2.Loop:= false;
TAudio2:= TAudioOut.Create(Self);
TAudio2.Input:= TVorbisEntrar2;
TAudio2.OnDone:= AudioOut1Done;
TAudio2.Run;
Inc(contador);
TVorbisEntrar3:= TVorbisIn.Create(Self);
TVorbisEntrar3.FileName:= 'intro.ogg';
TVorbisEntrar3.Loop:= false;
TAudio3:= TAudioOut.Create(Self);
TAudio3.Input:= TVorbisEntrar3;
TAudio3.OnDone:= AudioOut1Done;
TAudio3.Run;
Inc(contador);
end;
 
//Cierra la aplicación..
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Sólo he puesto un asigned para todos pero tendría q ser para cada uno...
if ( Assigned( TAudio ) ) then 
begin
if ( TAudio.Status in [ tosPlaying ] ) then
TAudio.Stop;
if ( TAudio2.Status in [ tosPlaying ] ) then
TAudio2.Stop;
if ( TAudio3.Status in [ tosPlaying ] ) then
TAudio3.Stop;
 
//Esto no me gusta... me parece erroneo aunq funcione
while ( contador > 0 ) do
begin
end;
 
 
FreeAndNil( TVorbisEntrar );
FreeAndNil( TAudio );
FreeAndNil( TVorbisEntrar2 );
FreeAndNil( TAudio2 );
FreeAndNil( TVorbisEntrar3 );
FreeAndNil( TAudio3 );
end;
end;
 
//Salta cuando se ha parado una canción.
procedure TForm1.AudioOut1Done(Sender: TComponent);
begin
Dec(contador);
end;

Pos eso es todo, gracias por las molestias

Última edición por OscarG fecha: 07-10-2005 a las 11:40:56. Razón: he puesto mal la etiqueta delphi ¿?
Responder Con Cita
  #6  
Antiguo 07-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Si es un Tipo de datos, debe declararse con la "T" delante ej: TVorbisIn
Si es una variable, se declara sin "T" ej: VorbisEntrar.

El problema es que todo tiene delante la "T" y no se sabe si estas accediendo a un tipo de datos o bien a una variable. (más o menos se intuye, pero se pueden cometer errores muy graves al hacerlo de esta forma), te recomiendo, por tu bien , que modifiques el código.

Lo que no me queda claro es por qué usas varios VorbisEntrar, VorbisEntrar2, etc, ¿tienes varios ogg cantando al mismo tiempo?

Se supone que no, ya que es un reproductor de canciones, por tanto una va detrás de otra; entonces, el evento para decrementar el contador, se puede aprovechar para cambiarle el nombre de archivo al mismo VorbisEntrar, y ponerlo a cantar de nuevo. (sin necesidad de VorbisEntrar2).

Pensandolo mejor, quizás te convenga, al menos 2 vorbisEntrar, cuando uno ha finalizado, ya tienes preparado el otro para empezar a cantar la siguiente canción, y así disminuyes la pausa entre canciones,

Si estoy equivocado, ya me contarás.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 22:30:53.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi