Foros - Stratos

Programadores => Programación de audio => Mensaje iniciado por: MA]Mestre en 28 de Mayo de 2007, 03:57:53 PM

Título: Delay / Buffering
Publicado por: MA]Mestre en 28 de Mayo de 2007, 03:57:53 PM
Hola,

Desearia realizar un delay del wave de la tarjeta de sonido.

Para ello, me da igual que:

-La tarjeta de sonido traiga un soft que permita realizarlo. ( cual ? )
-Tener que implementarlo ( como ? es posible ? )

Gracias.
Título: Delay / Buffering
Publicado por: Pogacha en 28 de Mayo de 2007, 05:39:36 PM
No entiendo, que es un "delay del wave de la tarjeta de sonido"?
Título: Delay / Buffering
Publicado por: TrOnTxU en 28 de Mayo de 2007, 06:03:37 PM
Solo para windows:
El directShow y/o directInput soportan efectos como Reverb, delay, distorsión, etc.
Bajaté el SDK y echale un vistazo a los ejemplos.

Si lo que necesitas es algo multiplataforma, supongo que tendrás que mirar OpenAl y averiguar como aplicar efectos, se que tiene alguna historia de extensiones, etc, algo similar a las extensiones de OpenGl (por ejemplo).

Un saludo, espero servirte de ayuda.
Título: Delay / Buffering
Publicado por: MA]Mestre en 28 de Mayo de 2007, 06:15:39 PM
Pogacha
No entiendo, que es un "delay del wave de la tarjeta de sonido"?

De los canales que puede controlar una tarjeta de sonido ( Line IN, Microfono, Onda ( Wave ) ), me interesa interactuar con uno de ellos. Concretamente el de Onda ( Wave )

Que me interesa hacer con el ? Pues un retraso. Por ejemplo:
Abro una carpeta i esto genera un pequeño sonido. Si tengo un retraso de 2000ms este se escuhca con ese retardo.

TrOnTxU
Como desde direct directShow puedo acceder al Wave para tratarlo ? Puedo capturar el Wave ? o tengo q sacarlo a otra tarjeta de sonido i capturarlo por el Line IN ?

Trabajo con WinX.

Saludos.
Título: Delay / Buffering
Publicado por: ethernet en 28 de Mayo de 2007, 06:16:00 PM
Te creas un buffer, almacenas el valor del sample que te viene y lo sueltas cuando pase un tiempo. Cuanto más grande el buffer, más tiempo. Código de ejemplo:

http://www.musicdsp.org/archive.php?classid=4#153

Me aspotaría algo a que direct sound (o como pijos se llame ahora) lo lleva implementado.
Título: Delay / Buffering
Publicado por: MA]Mestre en 28 de Mayo de 2007, 10:37:12 PM
Cita de: "ethernet"Te creas un buffer, almacenas el valor del sample que te viene y lo sueltas cuando pase un tiempo. Cuanto más grande el buffer, más tiempo. Código de ejemplo:

http://www.musicdsp.org/archive.php?classid=4#153

Me aspotaría algo a que direct sound (o como pijos se llame ahora) lo lleva implementado.


ethernet, el problema no es "cual es la logica de un delay" sino como capturar la senyal Wave que he de retrasar.

he usado la opcion de delay del AC3 Filter pero me da derivas/oscilaciones el delay.
Título: Delay / Buffering
Publicado por: Pogacha en 29 de Mayo de 2007, 01:28:43 AM
O sea que quieres crear un layer de tratado del sonido a todo lo que salga del audio de windows.

No tengo idea ... pero lo que se me ocurre es que te crees un driver de un dispositivo virtual de sonido (que te lo programes) y lo seetes como sonido primario, luego lo que entre por este lo proceses( le hagas el delay o lo que quieras ) y luego lo redirecciones al otro dispositivo de audio.
No creo que sea para nada facil de todos modos, tal vez halla algo hecho por ahí o algo mas sensillo.

Saludos.
Título: Delay / Buffering
Publicado por: marcode en 29 de Mayo de 2007, 11:48:25 AM
Supongo que esto será lo mejor.

DirectSoundFullDuplexCreate8 (http://msdn2.microsoft.com/en-us/library/bb219695.aspx)

Si te rula pon el código o di como lo has hecho, creo que a mí me puede ser útil para una cosa.
Título: Delay / Buffering
Publicado por: MA]Mestre en 20 de Junio de 2007, 11:53:40 AM
Hola,

Al final hice un filtro retardador en DShow.
Basado en el ejemplo del SampleGrabber q trae DShow.

Dejo el codigo más relevante que he agergado, es bastante simple:

HRESULT CSampleGrabber::Receive( IMediaSample * pms )
{
   CheckPointer(pms,E_POINTER);

   HRESULT hr;
   AM_SAMPLE2_PROPERTIES * const pProps = m_pInput->SampleProps();

//BufferTime
long ldatasize=pms->GetActualDataLength();
long ldatasize100=ldatasize * m_iDelay;
long ldatasize99=ldatasize * (m_iDelay-1);

REFERENCE_TIME ini,fin;

pms->GetTime (&ini,&fin);
if (!ini)
{
if (m_Buff)
ZeroMemory (m_Buff,ldatasize100);
}

if (!m_Buff)
{
m_Buff=(BYTE *)VirtualAlloc(NULL,ldatasize100,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
m_Buff2=(BYTE *)VirtualAlloc(NULL,ldatasize100,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
ZeroMemory (m_Buff,ldatasize100);
}

BYTE *pmsBuff;
pms->GetPointer(&pmsBuff);

CopyMemory (m_Buff2, m_Buff, ldatasize99 );
CopyMemory (m_Buff + ldatasize, m_Buff2, ldatasize99 );

CopyMemory (m_Buff, pmsBuff, ldatasize );

CopyMemory (pmsBuff ,m_Buff + ldatasize99, ldatasize);
       ...
       <codigo por defecto del SampleGrabber>