On Tue, Jun 13, 2017 at 04:35:52PM -0500, Zebediah Figura wrote:
+#define PCM_CVT_CHANGE_FUNC(name) static void name(DWORD srcRate, const unsigned char *src, DWORD *nsrc, \ + DWORD dstRate, unsigned char *dst, DWORD *ndst) \ + { \ + DWORD error = srcRate / 2; \ + DWORD srcUsed = 0, dstUsed = 0; \ + for (srcUsed = 0; srcUsed < *nsrc; srcUsed++) { \ + error += dstRate; \ + while (error > srcRate) { \ + if (dstUsed == *ndst) { \ + *nsrc = srcUsed; \ + *ndst = dstUsed; \ + return; \ + } + + /* conversion is done here */ + +#define PCM_CVT_CHANGE_FUNC_END(offset) \ + dstUsed++; \ + error -= srcRate; \ + } \ + src += offset; \ + } \ + *nsrc = srcUsed; \ + *ndst = dstUsed; \ +} + +PCM_CVT_CHANGE_FUNC(cvtSS88C) + *dst++ = src[0]; + *dst++ = src[1]; +PCM_CVT_CHANGE_FUNC_END(2) +
I really dislike complicated preprocessor tricks. Can't this be done in a similar way with real functions? If not, I'd rather have the copy-pasted code than these difficult macros. Andrew