+ xa_left = spu.XAFeed - spu.XAPlay;\r
+ if (xa_left < 0)\r
+ xa_left = spu.XAEnd - spu.XAPlay + spu.XAFeed - spu.XAStart;\r
+ pF->xaS = *spu.xapGlobal;\r
+ }\r
+ else if (spu.CDDAPlay != spu.CDDAFeed)\r
+ {\r
+ // abuse the xa struct to store leftover cdda samples\r
+ unsigned int *p = spu.CDDAPlay;\r
+ cdda_left = spu.CDDAFeed - spu.CDDAPlay;\r
+ if (cdda_left < 0)\r
+ cdda_left = spu.CDDAEnd - spu.CDDAPlay + spu.CDDAFeed - spu.CDDAStart;\r
+ if (cdda_left > sizeof(pF->xaS.pcm) / 4)\r
+ cdda_left = sizeof(pF->xaS.pcm) / 4;\r
+ if (p + cdda_left <= spu.CDDAEnd)\r
+ memcpy(pF->xaS.pcm, p, cdda_left * 4);\r
+ else {\r
+ memcpy(pF->xaS.pcm, p, (spu.CDDAEnd - p) * 4);\r
+ memcpy((char *)pF->xaS.pcm + (spu.CDDAEnd - p) * 4, spu.CDDAStart,\r
+ (cdda_left - (spu.CDDAEnd - p)) * 4);\r
+ }\r
+ pF->xaS.nsamples = 0;\r