|
|
1.1 ! root 1: /* ! 2: * QEMU Mixing engine ! 3: * ! 4: * Copyright (c) 2004 Vassili Karpov (malc) ! 5: * ! 6: * Permission is hereby granted, free of charge, to any person obtaining a copy ! 7: * of this software and associated documentation files (the "Software"), to deal ! 8: * in the Software without restriction, including without limitation the rights ! 9: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ! 10: * copies of the Software, and to permit persons to whom the Software is ! 11: * furnished to do so, subject to the following conditions: ! 12: * ! 13: * The above copyright notice and this permission notice shall be included in ! 14: * all copies or substantial portions of the Software. ! 15: * ! 16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ! 17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ! 19: * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ! 20: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ! 21: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ! 22: * THE SOFTWARE. ! 23: */ ! 24: ! 25: /* ! 26: * Tusen tack till Mike Nordell ! 27: * dec++'ified by Dscho ! 28: */ ! 29: ! 30: #ifdef SIGNED ! 31: #define HALFT IN_MAX ! 32: #define HALF IN_MAX ! 33: #else ! 34: #define HALFT ((IN_MAX)>>1) ! 35: #define HALF HALFT ! 36: #endif ! 37: ! 38: static int64_t inline glue(conv_,IN_T) (IN_T v) ! 39: { ! 40: #ifdef SIGNED ! 41: return (INT_MAX*(int64_t)v)/HALF; ! 42: #else ! 43: return (INT_MAX*((int64_t)v-HALFT))/HALF; ! 44: #endif ! 45: } ! 46: ! 47: static IN_T inline glue(clip_,IN_T) (int64_t v) ! 48: { ! 49: if (v >= INT_MAX) ! 50: return IN_MAX; ! 51: else if (v < -INT_MAX) ! 52: return IN_MIN; ! 53: ! 54: #ifdef SIGNED ! 55: return (IN_T) (v*HALF/INT_MAX); ! 56: #else ! 57: return (IN_T) (v+INT_MAX/2)*HALF/INT_MAX; ! 58: #endif ! 59: } ! 60: ! 61: static void glue(glue(conv_,IN_T),_to_stereo) (void *dst, const void *src, ! 62: int samples) ! 63: { ! 64: st_sample_t *out = (st_sample_t *) dst; ! 65: IN_T *in = (IN_T *) src; ! 66: while (samples--) { ! 67: out->l = glue(conv_,IN_T) (*in++); ! 68: out->r = glue(conv_,IN_T) (*in++); ! 69: out += 1; ! 70: } ! 71: } ! 72: ! 73: static void glue(glue(conv_,IN_T),_to_mono) (void *dst, const void *src, ! 74: int samples) ! 75: { ! 76: st_sample_t *out = (st_sample_t *) dst; ! 77: IN_T *in = (IN_T *) src; ! 78: while (samples--) { ! 79: out->l = glue(conv_,IN_T) (in[0]); ! 80: out->r = out->l; ! 81: out += 1; ! 82: in += 1; ! 83: } ! 84: } ! 85: ! 86: static void glue(glue(clip_,IN_T),_from_stereo) (void *dst, const void *src, ! 87: int samples) ! 88: { ! 89: st_sample_t *in = (st_sample_t *) src; ! 90: IN_T *out = (IN_T *) dst; ! 91: while (samples--) { ! 92: *out++ = glue(clip_,IN_T) (in->l); ! 93: *out++ = glue(clip_,IN_T) (in->r); ! 94: in += 1; ! 95: } ! 96: } ! 97: ! 98: static void glue(glue(clip_,IN_T),_from_mono) (void *dst, const void *src, ! 99: int samples) ! 100: { ! 101: st_sample_t *in = (st_sample_t *) src; ! 102: IN_T *out = (IN_T *) dst; ! 103: while (samples--) { ! 104: *out++ = glue(clip_,IN_T) (in->l + in->r); ! 105: in += 1; ! 106: } ! 107: } ! 108: ! 109: #undef HALF ! 110: #undef HALFT ! 111:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.