/[svn]/linuxsampler/trunk/src/drivers/audio/AudioChannel.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/drivers/audio/AudioChannel.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1913 by senoner, Sun Jun 7 16:24:55 2009 UTC revision 1930 by schoenebeck, Sat Jul 4 12:31:44 2009 UTC
# Line 3  Line 3 
3   *   LinuxSampler - modular, streaming capable sampler                     *   *   LinuxSampler - modular, streaming capable sampler                     *
4   *                                                                         *   *                                                                         *
5   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *
6   *   Copyright (C) 2005 - 2007 Christian Schoenebeck                       *   *   Copyright (C) 2005 - 2009 Christian Schoenebeck                       *
7   *                                                                         *   *                                                                         *
8   *   This program is free software; you can redistribute it and/or modify  *   *   This program is free software; you can redistribute it and/or modify  *
9   *   it under the terms of the GNU General Public License as published by  *   *   it under the terms of the GNU General Public License as published by  *
# Line 133  namespace LinuxSampler { Line 133  namespace LinuxSampler {
133      void AudioChannel::CopyTo(AudioChannel* pDst, const uint Samples, const float fLevel) {      void AudioChannel::CopyTo(AudioChannel* pDst, const uint Samples, const float fLevel) {
134          if (fLevel == 1.0f) CopyTo(pDst, Samples);          if (fLevel == 1.0f) CopyTo(pDst, Samples);
135          else {          else {
                 #ifndef HAVE_GCC_VECTOR_EXTENSIONS  
136              float* pSrcBuf = Buffer();              float* pSrcBuf = Buffer();
137              float* pDstBuf = pDst->Buffer();              float* pDstBuf = pDst->Buffer();
138              for (int i = 0; i < Samples; i++)              #if HAVE_GCC_VECTOR_EXTENSIONS
139                  pDstBuf[i] = pSrcBuf[i] * fLevel;              if ((size_t)pSrcBuf % 16 == 0 && (size_t)pDstBuf % 16 == 0) {
140                  #else                  const v4sf vcoeff = { fLevel, fLevel, fLevel, fLevel };
141                  const v4sf vcoeff = { fLevel, fLevel, fLevel, fLevel };                  const v4sf* src = static_cast<v4sf*>((void*)Buffer());
142          const v4sf* src = static_cast<v4sf*>((void*)Buffer());                  v4sf* dst       = static_cast<v4sf*>((void*)pDst->Buffer());
143          v4sf* dst       = static_cast<v4sf*>((void*)pDst->Buffer());                  const int cells = Samples / 4;
144          const int cells = Samples / 4;                  for (int i = 0; i < cells; ++i)
145          for (int i = 0; i < cells; ++i)                      dst[i] = src[i] * vcoeff;
146              dst[i] = src[i] * vcoeff;              } else {
147                  #endif              #endif
148                    for (int i = 0; i < Samples; i++)
149                        pDstBuf[i] = pSrcBuf[i] * fLevel;
150                #if HAVE_GCC_VECTOR_EXTENSIONS
151                }
152                #endif
153          }          }
154      }      }
155    
# Line 157  namespace LinuxSampler { Line 161  namespace LinuxSampler {
161       * @param Samples - amount of sample points to be mixed over       * @param Samples - amount of sample points to be mixed over
162       */       */
163      void AudioChannel::MixTo(AudioChannel* pDst, const uint Samples) {      void AudioChannel::MixTo(AudioChannel* pDst, const uint Samples) {
                 #ifndef HAVE_GCC_VECTOR_EXTENSIONS  
164          float* pSrcBuf = Buffer();          float* pSrcBuf = Buffer();
165          float* pDstBuf = pDst->Buffer();          float* pDstBuf = pDst->Buffer();
166          for (int i = 0; i < Samples; i++)          #if HAVE_GCC_VECTOR_EXTENSIONS
167              pDstBuf[i] += pSrcBuf[i];          if ((size_t)pSrcBuf % 16 == 0 && (size_t)pDstBuf % 16 == 0) {
168                  #else              const v4sf* src = static_cast<v4sf*>((void*)Buffer());
169                  const v4sf* src = static_cast<v4sf*>((void*)Buffer());              v4sf* dst       = static_cast<v4sf*>((void*)pDst->Buffer());
170          v4sf* dst       = static_cast<v4sf*>((void*)pDst->Buffer());              const int cells = Samples / 4;
171          const int cells = Samples / 4;              for (int i = 0; i < cells; ++i)
172          for (int i = 0; i < cells; ++i)                  dst[i] += src[i];
173              dst[i] += src[i];          } else {
174                  #endif          #endif
175                for (int i = 0; i < Samples; i++)
176                    pDstBuf[i] += pSrcBuf[i];
177            #if HAVE_GCC_VECTOR_EXTENSIONS
178            }
179            #endif
180      }      }
181    
182      /**      /**
# Line 183  namespace LinuxSampler { Line 191  namespace LinuxSampler {
191      void AudioChannel::MixTo(AudioChannel* pDst, const uint Samples, const float fLevel) {      void AudioChannel::MixTo(AudioChannel* pDst, const uint Samples, const float fLevel) {
192          if (fLevel == 1.0f) MixTo(pDst, Samples);          if (fLevel == 1.0f) MixTo(pDst, Samples);
193          else {          else {
                     #ifndef HAVE_GCC_VECTOR_EXTENSIONS  
194              float* pSrcBuf = Buffer();              float* pSrcBuf = Buffer();
195              float* pDstBuf = pDst->Buffer();              float* pDstBuf = pDst->Buffer();
196              for (int i = 0; i < Samples; i++)              #if HAVE_GCC_VECTOR_EXTENSIONS
197                  pDstBuf[i] += pSrcBuf[i] * fLevel;              if ((size_t)pSrcBuf % 16 == 0 && (size_t)pDstBuf % 16 == 0) {
198                      #else                  const v4sf vcoeff = { fLevel, fLevel, fLevel, fLevel };
199                          const v4sf vcoeff = { fLevel, fLevel, fLevel, fLevel };                  const v4sf* src = static_cast<v4sf*>((void*)Buffer());
200              const v4sf* src = static_cast<v4sf*>((void*)Buffer());                  v4sf* dst       = static_cast<v4sf*>((void*)pDst->Buffer());
201              v4sf* dst       = static_cast<v4sf*>((void*)pDst->Buffer());                  const int cells = Samples / 4;
202              const int cells = Samples / 4;                  for (int i = 0; i < cells; ++i)
203              for (int i = 0; i < cells; ++i)                      dst[i] += src[i] * vcoeff;
204                  dst[i] += src[i] * vcoeff;              } else {
205                          #endif              #endif
206                    for (int i = 0; i < Samples; i++)
207                        pDstBuf[i] += pSrcBuf[i] * fLevel;
208                #if HAVE_GCC_VECTOR_EXTENSIONS
209                }
210                #endif
211          }          }
212      }      }
213    

Legend:
Removed from v.1913  
changed lines
  Added in v.1930

  ViewVC Help
Powered by ViewVC