diff -r -u uade-1.03/src/sd-sound-ahi.h uade-1.03-new/src/sd-sound-ahi.h --- uade-1.03/src/sd-sound-ahi.h Sat Jul 23 10:43:25 2005 +++ uade-1.03-new/src/sd-sound-ahi.h Wed Jul 27 03:06:30 2005 @@ -38,15 +38,16 @@ } if (uade_check_sound_buffers(sndbuffer, sndbufsize, sound_bytes_per_sample)) { - ahireq[activereq]->ahir_Std.io_Data = sndbuffer; - ahireq[activereq]->ahir_Std.io_Length = sndbufsize; - ahireq[activereq]->ahir_Std.io_Offset = 0; - ahireq[activereq]->ahir_Type = sampletype; - ahireq[activereq]->ahir_Frequency = samplerate; - ahireq[activereq]->ahir_Volume = 0x10000; /* full volume */ - ahireq[activereq]->ahir_Position = 0x8000; /* centered */ - ahireq[activereq]->ahir_Link = prevahireq; - SendIO((struct IORequest *) ahireq[activereq]); + struct AHIRequest *req = ahireq[activereq]; + req->ahir_Std.io_Data = sndbuffer; + req->ahir_Std.io_Length = sndbufsize; + req->ahir_Std.io_Offset = 0; + req->ahir_Type = sampletype; + req->ahir_Frequency = samplerate; + req->ahir_Volume = 0x10000; /* full volume */ + req->ahir_Position = 0x8000; /* centered */ + req->ahir_Link = prevahireq; + SendIO((struct IORequest *) req); /* wait completion of the previous req */ if (prevahireq) { @@ -60,8 +61,15 @@ sig2handler(0); } } + if (CheckIO((struct IORequest *) req)) { + /* both iorequests finished, force buffering restart */ + WaitIO((struct IORequest *) req); + prevahireq = NULL; + sndbufpt = sndbuffer; + return; + } } - prevahireq = ahireq[activereq]; + prevahireq = req; activereq ^= 1; sndbuffer = activereq ? sndbuffer1 : sndbuffer0; }