![]() |
#1 |
Usuario registrado
|
¿Mame con reajuste de audio?
Hola, he estado haciendo algunos experimentos con Winmodelines, Mame y una TV por RGB, y aparte de la imposibilidad de crear todos los modos exactos para todos los juegos (snif...como echo de menos mi añorado AdvanceMame para MSDOS) me encuentro con otro problema:
Digamos que el juego X, es emulado por mame a 59.63333333. Con Winmodelines solo puedo poner 59.63 de refresco lo que hace que con el tiempo se vaya acumulando un error que produce un salto en el audio para adaptarse a la imagen. Por otro lado hay resoluciones que tienen montones de refrescos distintos, así que la pregunta es. ¿Hay alguna manera de forzar que Mame ajuste el audio (al igual que puede ajustar el framerate) al refresco que se esté utilizando en ese momento? Si no recuerdo mal Advance Mame tenía una opción así (lástima que haya dejado de actualizarse y que la versión de Windows tampoco es que funcione mucho) ¿Alguna idea? ¿Algún proyecto similar a AdvanceMame? Gracias por adelantado. |
![]() |
#2 |
Marciano
![]() |
Hola Vood,bienvenido
El problema que experimentas le ha ocurrido a mucha gente yo entre ellos,el marciano Master Higgins se las ingenio para evitar en gran medida este inconveniente,me tomo libertad de copiar aqui su post con el método que el ha seguido: Originalmente escrito por Master Higgins Para el siguiente modo: Code:
Modeline "256x256@54,9Hz 15,7KHz (60Hz)" 5.280 256 285 310 336 256 266 269 286 -hsync -vsync ![]() con las opciones -waitvsync y -syncrefresh activadas El resultado es un juego perfectamente sincronizado con el sonido, sin efecto tearing ni nada molestoso. Pero como nada es gratis en este mundo, el precio es que el juego no correrá a la velocidad original. En este caso, el vulgus corre a 60Hz y lo estamos haciendo correr a 55Hz, lo cual es un 90% de la velocidad original, pero el beneficio de correrlo fluido, sin tearing y con sonido perfectamente sincronizado es impagable ![]() ![]() ![]() Esta técnica es casi exclusiva para juegos verticales de 256 líneas de alto, es decir, resoluciones de <ancho>x256. He visto muchísimos de 224x256 que caen en esta categoría. Lamentablemente para juegos verticales de un alto mayor (como el exerion a 224x320@61,42Hz) habrá que jugarlos o entrelazados o girando la pantalla. Los juegos verticales con 240 pixeles de alto como el ladybug, mrdo, etc no habría que hacer muchas modificaciones, ya que con este modo: Code:
Modeline "240x240@60,0Hz 15,7KHz (60Hz)" 5.030 240 268 291 320 240 243 246 262 -hsync -vsync Ahp, y se me olvidaba que estos tios del mame no implementaron guardar la configuracion del "screen refresh", es decir, si cambias el refresco digamos de 60Hz a 55Hz y te sales del juego, al iniciarlo nuevamente parte con los 60>Hz en vez de los 55Hz guardados. Para esto agregue las siguientes líneas en "video.c" en la carpeta src\emu del mame: En la línea 25 o cercana a los "includes" Code:
#include "config.h" Code:
config_register("video", video_load, video_save); /********************************************************************** ***** SOFTWARE RENDERING ********************************************************************** *****/ Code:
/*------------------------------------------------- video_save - save data to the configuration file -------------------------------------------------*/ static void video_save(int config_type, xml_data_node *parentnode) { video_private *viddata = Machine->video_data; internal_screen_info *info = &viddata->scrinfo[0]; float refresh = ATTOSECONDS_TO_HZ(info->state->refresh); /* we only care about game files */ if (config_type != CONFIG_TYPE_GAME) return; /* iterate over mixer channels */ if (parentnode != NULL) { xml_data_node *refreshnode = xml_add_child(parentnode, "refresh", NULL); if (refreshnode != NULL) { xml_set_attribute_float(refreshnode, "value", refresh); } } } /*------------------------------------------------- sound_load - read and apply data from the configuration file -------------------------------------------------*/ static void video_load(int config_type, xml_data_node *parentnode) { xml_data_node *refreshnode; float refresh; video_private *viddata = Machine->video_data; internal_screen_info *info = &viddata->scrinfo[0]; /* we only care about game files */ if (config_type != CONFIG_TYPE_GAME) return; /* might not have any data */ if (parentnode == NULL) return; refreshnode = xml_get_sibling(parentnode->child, "refresh"); refresh = xml_get_attribute_float(refreshnode, "value", 60.0); info->state->refresh = HZ_TO_ATTOSECONDS((double)refresh); } ![]() ****************** Vood y Jeroni,quiero seguir remarcando que todo este trabajo pertenece a Master Higgins,yo no tengo ni idea de estas cosas,por lo visto no existe un metodo que no sea manual para lograr estos ajustes,supongo y quiero creer que alguna vez los habrá ![]() Un Saludo Editado por Radaxian en 15-ago-2008 a las 13:22. |
![]() |
#3 |
Usuario registrado
|
Wow, te lo has currado
![]() Ya no me acordaba de que existía esa opción, es más o menos lo que andaba buscando, pero me sigue sorprendiendo que no hayan creado todavía una función para hacerlo automáticamente (y más aún que no grabe el ajuste por defecto). Con la de gente que hay con este y otros problemas comunes al usar 15khz es raro que todavía no se hayan puesto de acuerdo para crear una versión específica para monitores arcade de mame. Bueno, mil gracias!!!, mañana lo probaré p.d.¿es posible conocer mediante código el refresco el modo elegido en mame, o el programa solo puede "ver" los 60hz falsos que el driver reporta a Windows? Si lo fuera no sería complicado implementar que hiciera el ajuste automáticamente. |
![]() |
#4 |
Marciano
|
No entiendo mucho el planteamiento. Si el juego era a 60Hz, ¿no va el audio más lento a 55Hz?
VooD: No se puede saber el refresco real de los modos. Sí habría una forma para un modo, que sería activarlo y medir el tiempo entre dos refrescos verticales, pero eso requiere que el programa pruebe todos los modos de esa resolución para encontrar el que tiene el refresco más próximo. Cambiando el modo de forma tan seguida se podría dañar un monitor de PC. |
![]() |
#5 |
Usuario registrado
|
Precisamente eso es lo que estaba buscando, hacer que el audio fuera más lento/rápido para que así se adaptase a un refresco que no es el original de la rom.
Respecto a lo de medir la frecuencia vertical para hacerlo automáticamente...tampoco sería necesario hacerlo constantemente, y ni si quiera con el monitor conectado. Imagina, te creas tus modos con el winmodeline (que por supuesto no serán suficiente para la enorme variedad de frecuencias y refrescos de Mame), y ahora al cargar "nuestra modificación" de Mame (ojalá supiera hacerlo yo :P) activas una opción que va probando modo por modo para hacer una tabla de cual es el refresco real de cada uno. Una vez con esa tabla hecha, Mame ajusta automáticamente el audio y el juego en si en función del refresco real de la resolución elegida en el momento. No sé, pero yo sigo prefiriendo scrolles suaves y sonido perfecto aunque el juego vaya ligeramente más rápido o ligeramente más lento. |
![]() |
#6 |
Marciano
|
Pero entonces ¿qué problema tiene para adaptar el audio? Un juego de 59,6Hz cuyo audio supuestamente está diseñado para que sincronice con la imagen a 59,6Hz, si lo pones a 55Hz será mucho peor que a 59,6Hz ¿no?
Yo en los emuladores de consola nunca he tenido problemas con el audio, si el juego va un poco más lento o rápido el audio también se adapta automáticamente, supongo que es porque es sonido tipo Midi y el juego va mandando los efectos sonoros a medida que transcurre. |
![]() |
#7 |
Usuario registrado
|
En Mame por defecto no pasa eso, el juego se adapta al refresco que le digas, pero el audio sigue a su ritmo, lo que provoca que periodicamente ocurra un salto en el sonido para reajustarse al juego.
En los emuladores de consolas no pasa, porque simplemente lo han tenido en cuenta desde el principio, y además no hay más opción que 50 o 60 hz, en Mame hay mil resoluciones y refrescos diferentes. |