Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Delay / Buffering

Iniciado por MA]Mestre, 28 de Mayo de 2007, 03:57:53 PM

« anterior - próximo »

MA]Mestre

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.

Pogacha

No entiendo, que es un "delay del wave de la tarjeta de sonido"?

TrOnTxU

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.
Vicent: Linked-In  ***  ¡¡Ya tengo blog!!

MA]Mestre

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.

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.

MA]Mestre

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.

Pogacha

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.

marcode

Supongo que esto será lo mejor.

DirectSoundFullDuplexCreate8

Si te rula pon el código o di como lo has hecho, creo que a mí me puede ser útil para una cosa.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

MA]Mestre

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>






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.