📄 effect_position.c
字号:
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 + -