PDA

Ver la Versión Completa : Reproducir sonido sincronizado con un timer


alquimista
02-07-2008, 01:08:03
Tengo que emitir un sonido corto en determinados periodos de tiempo que son variables
Como sincronizarlos lo mas exacto posible sin que se produzcan retrasos.

Por ejemplo
5 segundos 32 centésimas-->Sonido
10 segundos 25 centésimas--->Sonido
..
..
20 minutos 20 segundos 34 centesimas->Sonido

El problema radica en que al usar PlaySound de un wav (grabado como un recurso *.res) hay un pequeño desfase con respecto al temporizador que cada vez se va haciendo mas grande. con lo que al final en vez de sonar a 20 minutos 20 sg 34 centésimas lo hace a 20 minutos 22 segundos.

Se emplea un timer para llevar el crono y otro para los tiempos variables y reproducción de sonido.

Alguna sugerencia?
¿Una tarea separada del 2º timer solo para reproducir el sonido ayudaría?
Gracias...

Neftali [Germán.Estévez]
02-07-2008, 08:48:24
Hay algunos componentes de Timer (http://www.torry.net/pages.php?id=294) que dicen ser "más exactos" que el original de Windows. No he probado ninguno, pero tal vez alguno de estos solvente tu problema.
Otra opción sería que revisaras GetTickCount, a ver si consigues más exactitud.

alquimista
02-07-2008, 09:58:37
Uso un timer de las JEDI jvThreadTimer1 que dicen que es un poco mas preciso que el ttimer para el crono y jv..2 para los tiempos. Arranco los 2 a la vez y en el 2º cambio el interval en el evento Ontimer. Antes de reproducir el sonido existia un desfase que era despreciable y al cabo de un rato se compensaba un poco.
Es al utilizar playsound cuando desfasa

{$R sonidos.res} // recurso: es un solo wav de apenas 100k
procedure TForm1.JvThreadTimer2Timer(Sender: TObject)
begin
PlaySound('sonido', hInstance, SND_RESOURCE or SND_ASYNC);
//cambiar interval del timer
end;

he leido que si se carga en memoria (¿como se haria?) es más rápido ¿un recurso no se carga en memoria o lo carga del exe perdiendo mas tiempo?

Gracias por la respuesta

alquimista
02-07-2008, 16:49:55
voy a cambiar a un solo timer ya que en unos 20 minutos se desfasa mas de 2 segundos el sonido del tiempo en que debiera contar.

¿Alguien sabe como puedo comparar el TDateTime con una stringlist con formato "mm:ss:zz", siendo mm=minutos con 2 caracteres, ss=segundos, zz=centesimas, que contiene todos los tiempos a los que tiene que tocar el sonido.