Maybe this is the problem. I started tracing through the pinmame audio, and I noticed this:
=========
int updatescreen(void)
{
/* update sound */
sound_update();
/* if we're not skipping this frame, draw the screen */
if (osd_skip_this_frame() == 0)
{
profiler_mark(PROFILER_VIDEO);
draw_screen();
profiler_mark(PROFILER_END);
}
/* the user interface must be called between vh_update() and osd_update_video_and_audio(), */
/* to allow it to overlay things on the game display. We must call it even */
/* if the frame is skipped, to keep a consistent timing. */
if (handle_user_interface(artwork_get_ui_bitmap()))
/* quit if the user asked to */
return 1;
/* blit to the screen */
update_video_and_audio();
/* call the end-of-frame callback */
if (Machine->drv->video_eof)
{
profiler_mark(PROFILER_VIDEO);
(*Machine->drv->video_eof)();
profiler_mark(PROFILER_END);
}
return 0;
}
=========
I'm guessing that we could skip 100% of the overlay and UI code and speed this up quite a bit.