⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 effect_position.c

📁 SDL_mixer 是一个基于 SDL 的混音器
💻 C
📖 第 1 页 / 共 4 页
字号:
    Sint8 *ptr = (Sint8 *) stream;    int i;        /*         * if there's only a mono channnel (the only way we wouldn't have         *  a len divisible by 2 here), then left_f and right_f are always         *  1.0, and are therefore throwaways.         */    if (len % sizeof (Sint16) != 0) {        *ptr = (Sint8) (((float) *ptr) * args->distance_f);        ptr++;        len--;    }    if (args->room_angle == 180)    for (i = 0; i < len; i += sizeof (Sint8) * 2) {        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f);        ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f);        ptr++;    }    else    for (i = 0; i < len; i += sizeof (Sint8) * 2) {        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f);        ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f);        ptr++;    }}static void _Eff_position_s8_c4(int chan, void *stream, int len, void *udata){    volatile position_args *args = (volatile position_args *) udata;    Sint8 *ptr = (Sint8 *) stream;    int i;        /*         * if there's only a mono channnel (the only way we wouldn't have         *  a len divisible by 2 here), then left_f and right_f are always         *  1.0, and are therefore throwaways.         */    if (len % sizeof (Sint16) != 0) {        *ptr = (Sint8) (((float) *ptr) * args->distance_f);        ptr++;        len--;    }    for (i = 0; i < len; i += sizeof (Sint8) * 4) {      switch (args->room_angle) {       case 0:        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;	break;       case 90:        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;	break;       case 180:        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;	break;       case 270:        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;	break;      }    }}static void _Eff_position_s8_c6(int chan, void *stream, int len, void *udata){    volatile position_args *args = (volatile position_args *) udata;    Sint8 *ptr = (Sint8 *) stream;    int i;        /*         * if there's only a mono channnel (the only way we wouldn't have         *  a len divisible by 2 here), then left_f and right_f are always         *  1.0, and are therefore throwaways.         */    if (len % sizeof (Sint16) != 0) {        *ptr = (Sint8) (((float) *ptr) * args->distance_f);        ptr++;        len--;    }    for (i = 0; i < len; i += sizeof (Sint8) * 6) {      switch (args->room_angle) {       case 0:        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->center_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;	break;       case 90:        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f / 2)           + (Sint8)((((float) *ptr) * args->right_f) * args->distance_f / 2); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;	break;       case 180:        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f / 2)           + (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f / 2); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;	break;       case 270:        *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f / 2)           + (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f / 2); ptr++;        *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;	break;      }    }}/* * This one runs about 10.1 times faster than the non-table version, with *  no loss in quality. It does, however, require 64k of memory for the *  lookup table. Also, this will only update position information once per *  call; the non-table version always checks the arguments for each sample, *  in case the user has called Mix_SetPanning() or whatnot again while this *  callback is running. */static void _Eff_position_table_s8(int chan, void *stream, int len, void *udata){    volatile position_args *args = (volatile position_args *) udata;    Sint8 *ptr = (Sint8 *) stream;    Uint32 *p;    int i;    Sint8 *l = ((Sint8 *) _Eff_volume_table) + (256 * args->left_u8);    Sint8 *r = ((Sint8 *) _Eff_volume_table) + (256 * args->right_u8);    Sint8 *d = ((Sint8 *) _Eff_volume_table) + (256 * args->distance_u8);    if (args->room_angle == 180) {	    Sint8 *temp = l;	    l = r;	    r = temp;    }    while (len % sizeof (Uint32) != 0) {        *ptr = d[l[*ptr]];        ptr++;        if (args->channels > 1) {            *ptr = d[r[*ptr]];            ptr++;        }        len -= args->channels;    }    p = (Uint32 *) ptr;    for (i = 0; i < len; i += sizeof (Uint32)) {#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)        *(p++) = (d[l[((Sint16)(Sint8)((*p & 0xFF000000) >> 24))+128]] << 24) |                 (d[r[((Sint16)(Sint8)((*p & 0x00FF0000) >> 16))+128]] << 16) |                 (d[l[((Sint16)(Sint8)((*p & 0x0000FF00) >>  8))+128]] <<  8) |                 (d[r[((Sint16)(Sint8)((*p & 0x000000FF)      ))+128]]      ) ;#else        *(p++) = (d[r[((Sint16)(Sint8)((*p & 0xFF000000) >> 24))+128]] << 24) |                 (d[l[((Sint16)(Sint8)((*p & 0x00FF0000) >> 16))+128]] << 16) |                 (d[r[((Sint16)(Sint8)((*p & 0x0000FF00) >>  8))+128]] <<  8) |                 (d[l[((Sint16)(Sint8)((*p & 0x000000FF)      ))+128]]      ) ;#endif    }}/* !!! FIXME : Optimize the code for 16-bit samples? */static void _Eff_position_u16lsb(int chan, void *stream, int len, void *udata){    volatile position_args *args = (volatile position_args *) udata;    Uint16 *ptr = (Uint16 *) stream;    int i;    for (i = 0; i < len; i += sizeof (Uint16) * 2) {        Sint16 sampl = (Sint16) (SDL_SwapLE16(*(ptr+0)) - 32768);        Sint16 sampr = (Sint16) (SDL_SwapLE16(*(ptr+1)) - 32768);                Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)                                    * args->distance_f) + 32768);        Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)                                    * args->distance_f) + 32768);	if (args->room_angle == 180) {        	*(ptr++) = (Uint16) SDL_SwapLE16(swapr);        	*(ptr++) = (Uint16) SDL_SwapLE16(swapl);	}	else {        	*(ptr++) = (Uint16) SDL_SwapLE16(swapl);        	*(ptr++) = (Uint16) SDL_SwapLE16(swapr);	}    }}static void _Eff_position_u16lsb_c4(int chan, void *stream, int len, void *udata){    volatile position_args *args = (volatile position_args *) udata;    Uint16 *ptr = (Uint16 *) stream;    int i;    for (i = 0; i < len; i += sizeof (Uint16) * 4) {        Sint16 sampl = (Sint16) (SDL_SwapLE16(*(ptr+0)) - 32768);        Sint16 sampr = (Sint16) (SDL_SwapLE16(*(ptr+1)) - 32768);        Sint16 samplr = (Sint16) (SDL_SwapLE16(*(ptr+2)) - 32768);        Sint16 samprr = (Sint16) (SDL_SwapLE16(*(ptr+3)) - 32768);                Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)                                    * args->distance_f) + 32768);        Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)                                    * args->distance_f) + 32768);        Uint16 swaplr = (Uint16) ((Sint16) (((float) samplr * args->left_f)                                    * args->distance_f) + 32768);        Uint16 swaprr = (Uint16) ((Sint16) (((float) samprr * args->right_f)                                    * args->distance_f) + 32768);	switch (args->room_angle) {		case 0:        		*(ptr++) = (Uint16) SDL_SwapLE16(swapl);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaplr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaprr);			break;		case 90:        		*(ptr++) = (Uint16) SDL_SwapLE16(swapr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaprr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapl);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaplr);			break;		case 180:        		*(ptr++) = (Uint16) SDL_SwapLE16(swaprr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaplr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapl);			break;		case 270:        		*(ptr++) = (Uint16) SDL_SwapLE16(swaplr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapl);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaprr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapr);			break;	}    }}static void _Eff_position_u16lsb_c6(int chan, void *stream, int len, void *udata){    volatile position_args *args = (volatile position_args *) udata;    Uint16 *ptr = (Uint16 *) stream;    int i;    for (i = 0; i < len; i += sizeof (Uint16) * 6) {        Sint16 sampl = (Sint16) (SDL_SwapLE16(*(ptr+0)) - 32768);        Sint16 sampr = (Sint16) (SDL_SwapLE16(*(ptr+1)) - 32768);        Sint16 samplr = (Sint16) (SDL_SwapLE16(*(ptr+2)) - 32768);        Sint16 samprr = (Sint16) (SDL_SwapLE16(*(ptr+3)) - 32768);        Sint16 sampce = (Sint16) (SDL_SwapLE16(*(ptr+4)) - 32768);        Sint16 sampwf = (Sint16) (SDL_SwapLE16(*(ptr+5)) - 32768);                Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)                                    * args->distance_f) + 32768);        Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)                                    * args->distance_f) + 32768);        Uint16 swaplr = (Uint16) ((Sint16) (((float) samplr * args->left_f)                                    * args->distance_f) + 32768);        Uint16 swaprr = (Uint16) ((Sint16) (((float) samprr * args->right_f)                                    * args->distance_f) + 32768);        Uint16 swapce = (Uint16) ((Sint16) (((float) sampce * args->left_f)                                    * args->distance_f) + 32768);        Uint16 swapwf = (Uint16) ((Sint16) (((float) sampwf * args->right_f)                                    * args->distance_f) + 32768);	switch (args->room_angle) {		case 0:        		*(ptr++) = (Uint16) SDL_SwapLE16(swapl);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaplr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaprr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapce);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapwf);			break;		case 90:        		*(ptr++) = (Uint16) SDL_SwapLE16(swapr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaprr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapl);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaplr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapr)/2 + (Uint16) SDL_SwapLE16(swaprr)/2;        		*(ptr++) = (Uint16) SDL_SwapLE16(swapwf);			break;		case 180:        		*(ptr++) = (Uint16) SDL_SwapLE16(swaprr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaplr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapl);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaprr)/2 + (Uint16) SDL_SwapLE16(swaplr)/2;        		*(ptr++) = (Uint16) SDL_SwapLE16(swapwf);			break;		case 270:        		*(ptr++) = (Uint16) SDL_SwapLE16(swaplr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapl);        		*(ptr++) = (Uint16) SDL_SwapLE16(swaprr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapr);        		*(ptr++) = (Uint16) SDL_SwapLE16(swapl)/2 + (Uint16) SDL_SwapLE16(swaplr)/2;        		*(ptr++) = (Uint16) SDL_SwapLE16(swapwf);			break;	}    }}static void _Eff_position_s16lsb(int chan, void *stream, int len, void *udata){    /* 16 signed bits (lsb) * 2 channels. */    volatile position_args *args = (volatile position_args *) udata;    Sint16 *ptr = (Sint16 *) stream;    int i;#if 0    if (len % (sizeof(Sint16) * 2)) {	    fprintf(stderr,"Not an even number of frames! len=%d\n", len);	    return;    }#endif    for (i = 0; i < len; i += sizeof (Sint16) * 2) {        Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+0))) *                                    args->left_f) * args->distance_f);        Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+1))) *                                    args->right_f) * args->distance_f);	if (args->room_angle == 180) {        	*(ptr++) = (Sint16) SDL_SwapLE16(swapr);        	*(ptr++) = (Sint16) SDL_SwapLE16(swapl);	}	else {        	*(ptr++) = (Sint16) SDL_SwapLE16(swapl);        	*(ptr++) = (Sint16) SDL_SwapLE16(swapr);	}    }}static void _Eff_position_s16lsb_c4(int chan, void *stream, int len, void *udata){    /* 16 signed bits (lsb) * 4 channels. */    volatile position_args *args = (volatile position_args *) udata;    Sint16 *ptr = (Sint16 *) stream;    int i;    for (i = 0; i < len; i += sizeof (Sint16) * 4) {        Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+0))) *                                    args->left_f) * args->distance_f);        Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+1))) *                                    args->right_f) * args->distance_f);        Sint16 swaplr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+1))) *                                    args->left_rear_f) * args->distance_f);        Sint16 swaprr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+2))) *                                    args->right_rear_f) * args->distance_f);	switch (args->room_angle) {		case 0:        		*(ptr++) = (Sint16) SDL_SwapLE16(swapl);        		*(ptr++) = (Sint16) SDL_SwapLE16(swapr);        		*(ptr++) = (Sint16) SDL_SwapLE16(swaplr);        		*(ptr++) = (Sint16) SDL_SwapLE16(swaprr);			break;		case 90:        		*(ptr++) = (Sint16) SDL_SwapLE16(swapr);        		*(ptr++) = (Sint16) SDL_SwapLE16(swaprr);        		*(ptr++) = (Sint16) SDL_SwapLE16(swapl);        		*(ptr++) = (Sint16) SDL_SwapLE16(swaplr);			break;		case 180:        		*(ptr++) = (Sint16) SDL_SwapLE16(swaprr);        		*(ptr++) = (Sint16) SDL_SwapLE16(swaplr);        		*(ptr++) = (Sint16) SDL_SwapLE16(swapr);        		*(ptr++) = (Sint16) SDL_SwapLE16(swapl);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -