Home | History | Annotate | Download | only in audioflinger
      1 /* //device/include/server/AudioFlinger/AudioMixer.cpp
      2 **
      3 ** Copyright 2007, The Android Open Source Project
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 #define LOG_TAG "AudioMixer"
     19 //#define LOG_NDEBUG 0
     20 
     21 #include <stdint.h>
     22 #include <string.h>
     23 #include <stdlib.h>
     24 #include <sys/types.h>
     25 
     26 #include <utils/Errors.h>
     27 #include <utils/Log.h>
     28 
     29 #include <cutils/bitops.h>
     30 
     31 #include <system/audio.h>
     32 
     33 #include "AudioMixer.h"
     34 
     35 namespace android {
     36 // ----------------------------------------------------------------------------
     37 
     38 static inline int16_t clamp16(int32_t sample)
     39 {
     40     if ((sample>>15) ^ (sample>>31))
     41         sample = 0x7FFF ^ (sample>>31);
     42     return sample;
     43 }
     44 
     45 // ----------------------------------------------------------------------------
     46 
     47 AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate)
     48     :   mActiveTrack(0), mTrackNames(0), mSampleRate(sampleRate)
     49 {
     50     mState.enabledTracks= 0;
     51     mState.needsChanged = 0;
     52     mState.frameCount   = frameCount;
     53     mState.outputTemp   = 0;
     54     mState.resampleTemp = 0;
     55     mState.hook         = process__nop;
     56     track_t* t = mState.tracks;
     57     for (int i=0 ; i<32 ; i++) {
     58         t->needs = 0;
     59         t->volume[0] = UNITY_GAIN;
     60         t->volume[1] = UNITY_GAIN;
     61         t->volumeInc[0] = 0;
     62         t->volumeInc[1] = 0;
     63         t->auxLevel = 0;
     64         t->auxInc = 0;
     65         t->channelCount = 2;
     66         t->enabled = 0;
     67         t->format = 16;
     68         t->channelMask = AUDIO_CHANNEL_OUT_STEREO;
     69         t->buffer.raw = 0;
     70         t->bufferProvider = 0;
     71         t->hook = 0;
     72         t->resampler = 0;
     73         t->sampleRate = mSampleRate;
     74         t->in = 0;
     75         t->mainBuffer = NULL;
     76         t->auxBuffer = NULL;
     77         t++;
     78     }
     79 }
     80 
     81  AudioMixer::~AudioMixer()
     82  {
     83      track_t* t = mState.tracks;
     84      for (int i=0 ; i<32 ; i++) {
     85          delete t->resampler;
     86          t++;
     87      }
     88      delete [] mState.outputTemp;
     89      delete [] mState.resampleTemp;
     90  }
     91 
     92  int AudioMixer::getTrackName()
     93  {
     94     uint32_t names = mTrackNames;
     95     uint32_t mask = 1;
     96     int n = 0;
     97     while (names & mask) {
     98         mask <<= 1;
     99         n++;
    100     }
    101     if (mask) {
    102         LOGV("add track (%d)", n);
    103         mTrackNames |= mask;
    104         return TRACK0 + n;
    105     }
    106     return -1;
    107  }
    108 
    109  void AudioMixer::invalidateState(uint32_t mask)
    110  {
    111     if (mask) {
    112         mState.needsChanged |= mask;
    113         mState.hook = process__validate;
    114     }
    115  }
    116 
    117  void AudioMixer::deleteTrackName(int name)
    118  {
    119     name -= TRACK0;
    120     if (uint32_t(name) < MAX_NUM_TRACKS) {
    121         LOGV("deleteTrackName(%d)", name);
    122         track_t& track(mState.tracks[ name ]);
    123         if (track.enabled != 0) {
    124             track.enabled = 0;
    125             invalidateState(1<<name);
    126         }
    127         if (track.resampler) {
    128             // delete  the resampler
    129             delete track.resampler;
    130             track.resampler = 0;
    131             track.sampleRate = mSampleRate;
    132             invalidateState(1<<name);
    133         }
    134         track.volumeInc[0] = 0;
    135         track.volumeInc[1] = 0;
    136         mTrackNames &= ~(1<<name);
    137     }
    138  }
    139 
    140 status_t AudioMixer::enable(int name)
    141 {
    142     switch (name) {
    143         case MIXING: {
    144             if (mState.tracks[ mActiveTrack ].enabled != 1) {
    145                 mState.tracks[ mActiveTrack ].enabled = 1;
    146                 LOGV("enable(%d)", mActiveTrack);
    147                 invalidateState(1<<mActiveTrack);
    148             }
    149         } break;
    150         default:
    151             return NAME_NOT_FOUND;
    152     }
    153     return NO_ERROR;
    154 }
    155 
    156 status_t AudioMixer::disable(int name)
    157 {
    158     switch (name) {
    159         case MIXING: {
    160             if (mState.tracks[ mActiveTrack ].enabled != 0) {
    161                 mState.tracks[ mActiveTrack ].enabled = 0;
    162                 LOGV("disable(%d)", mActiveTrack);
    163                 invalidateState(1<<mActiveTrack);
    164             }
    165         } break;
    166         default:
    167             return NAME_NOT_FOUND;
    168     }
    169     return NO_ERROR;
    170 }
    171 
    172 status_t AudioMixer::setActiveTrack(int track)
    173 {
    174     if (uint32_t(track-TRACK0) >= MAX_NUM_TRACKS) {
    175         return BAD_VALUE;
    176     }
    177     mActiveTrack = track - TRACK0;
    178     return NO_ERROR;
    179 }
    180 
    181 status_t AudioMixer::setParameter(int target, int name, void *value)
    182 {
    183     int valueInt = (int)value;
    184     int32_t *valueBuf = (int32_t *)value;
    185 
    186     switch (target) {
    187     case TRACK:
    188         if (name == CHANNEL_MASK) {
    189             uint32_t mask = (uint32_t)value;
    190             if (mState.tracks[ mActiveTrack ].channelMask != mask) {
    191                 uint8_t channelCount = popcount(mask);
    192                 if ((channelCount <= MAX_NUM_CHANNELS) && (channelCount)) {
    193                     mState.tracks[ mActiveTrack ].channelMask = mask;
    194                     mState.tracks[ mActiveTrack ].channelCount = channelCount;
    195                     LOGV("setParameter(TRACK, CHANNEL_MASK, %x)", mask);
    196                     invalidateState(1<<mActiveTrack);
    197                     return NO_ERROR;
    198                 }
    199             } else {
    200                 return NO_ERROR;
    201             }
    202         }
    203         if (name == MAIN_BUFFER) {
    204             if (mState.tracks[ mActiveTrack ].mainBuffer != valueBuf) {
    205                 mState.tracks[ mActiveTrack ].mainBuffer = valueBuf;
    206                 LOGV("setParameter(TRACK, MAIN_BUFFER, %p)", valueBuf);
    207                 invalidateState(1<<mActiveTrack);
    208             }
    209             return NO_ERROR;
    210         }
    211         if (name == AUX_BUFFER) {
    212             if (mState.tracks[ mActiveTrack ].auxBuffer != valueBuf) {
    213                 mState.tracks[ mActiveTrack ].auxBuffer = valueBuf;
    214                 LOGV("setParameter(TRACK, AUX_BUFFER, %p)", valueBuf);
    215                 invalidateState(1<<mActiveTrack);
    216             }
    217             return NO_ERROR;
    218         }
    219 
    220         break;
    221     case RESAMPLE:
    222         if (name == SAMPLE_RATE) {
    223             if (valueInt > 0) {
    224                 track_t& track = mState.tracks[ mActiveTrack ];
    225                 if (track.setResampler(uint32_t(valueInt), mSampleRate)) {
    226                     LOGV("setParameter(RESAMPLE, SAMPLE_RATE, %u)",
    227                             uint32_t(valueInt));
    228                     invalidateState(1<<mActiveTrack);
    229                 }
    230                 return NO_ERROR;
    231             }
    232         }
    233         if (name == RESET) {
    234             track_t& track = mState.tracks[ mActiveTrack ];
    235             track.resetResampler();
    236             invalidateState(1<<mActiveTrack);
    237             return NO_ERROR;
    238         }
    239         break;
    240     case RAMP_VOLUME:
    241     case VOLUME:
    242         if ((uint32_t(name-VOLUME0) < MAX_NUM_CHANNELS)) {
    243             track_t& track = mState.tracks[ mActiveTrack ];
    244             if (track.volume[name-VOLUME0] != valueInt) {
    245                 LOGV("setParameter(VOLUME, VOLUME0/1: %04x)", valueInt);
    246                 track.prevVolume[name-VOLUME0] = track.volume[name-VOLUME0] << 16;
    247                 track.volume[name-VOLUME0] = valueInt;
    248                 if (target == VOLUME) {
    249                     track.prevVolume[name-VOLUME0] = valueInt << 16;
    250                     track.volumeInc[name-VOLUME0] = 0;
    251                 } else {
    252                     int32_t d = (valueInt<<16) - track.prevVolume[name-VOLUME0];
    253                     int32_t volInc = d / int32_t(mState.frameCount);
    254                     track.volumeInc[name-VOLUME0] = volInc;
    255                     if (volInc == 0) {
    256                         track.prevVolume[name-VOLUME0] = valueInt << 16;
    257                     }
    258                 }
    259                 invalidateState(1<<mActiveTrack);
    260             }
    261             return NO_ERROR;
    262         } else if (name == AUXLEVEL) {
    263             track_t& track = mState.tracks[ mActiveTrack ];
    264             if (track.auxLevel != valueInt) {
    265                 LOGV("setParameter(VOLUME, AUXLEVEL: %04x)", valueInt);
    266                 track.prevAuxLevel = track.auxLevel << 16;
    267                 track.auxLevel = valueInt;
    268                 if (target == VOLUME) {
    269                     track.prevAuxLevel = valueInt << 16;
    270                     track.auxInc = 0;
    271                 } else {
    272                     int32_t d = (valueInt<<16) - track.prevAuxLevel;
    273                     int32_t volInc = d / int32_t(mState.frameCount);
    274                     track.auxInc = volInc;
    275                     if (volInc == 0) {
    276                         track.prevAuxLevel = valueInt << 16;
    277                     }
    278                 }
    279                 invalidateState(1<<mActiveTrack);
    280             }
    281             return NO_ERROR;
    282         }
    283         break;
    284     }
    285     return BAD_VALUE;
    286 }
    287 
    288 bool AudioMixer::track_t::setResampler(uint32_t value, uint32_t devSampleRate)
    289 {
    290     if (value!=devSampleRate || resampler) {
    291         if (sampleRate != value) {
    292             sampleRate = value;
    293             if (resampler == 0) {
    294                 resampler = AudioResampler::create(
    295                         format, channelCount, devSampleRate);
    296             }
    297             return true;
    298         }
    299     }
    300     return false;
    301 }
    302 
    303 bool AudioMixer::track_t::doesResample() const
    304 {
    305     return resampler != 0;
    306 }
    307 
    308 void AudioMixer::track_t::resetResampler()
    309 {
    310     if (resampler != 0) {
    311         resampler->reset();
    312     }
    313 }
    314 
    315 inline
    316 void AudioMixer::track_t::adjustVolumeRamp(bool aux)
    317 {
    318     for (int i=0 ; i<2 ; i++) {
    319         if (((volumeInc[i]>0) && (((prevVolume[i]+volumeInc[i])>>16) >= volume[i])) ||
    320             ((volumeInc[i]<0) && (((prevVolume[i]+volumeInc[i])>>16) <= volume[i]))) {
    321             volumeInc[i] = 0;
    322             prevVolume[i] = volume[i]<<16;
    323         }
    324     }
    325     if (aux) {
    326         if (((auxInc>0) && (((prevAuxLevel+auxInc)>>16) >= auxLevel)) ||
    327             ((auxInc<0) && (((prevAuxLevel+auxInc)>>16) <= auxLevel))) {
    328             auxInc = 0;
    329             prevAuxLevel = auxLevel<<16;
    330         }
    331     }
    332 }
    333 
    334 size_t AudioMixer::track_t::getUnreleasedFrames()
    335 {
    336     if (resampler != NULL) {
    337         return resampler->getUnreleasedFrames();
    338     }
    339     return 0;
    340 }
    341 
    342 size_t AudioMixer::getUnreleasedFrames(int name)
    343 {
    344     name -= TRACK0;
    345     if (uint32_t(name) < MAX_NUM_TRACKS) {
    346         track_t& track(mState.tracks[name]);
    347         return track.getUnreleasedFrames();
    348     }
    349     return 0;
    350 }
    351 
    352 status_t AudioMixer::setBufferProvider(AudioBufferProvider* buffer)
    353 {
    354     mState.tracks[ mActiveTrack ].bufferProvider = buffer;
    355     return NO_ERROR;
    356 }
    357 
    358 
    359 
    360 void AudioMixer::process()
    361 {
    362     mState.hook(&mState);
    363 }
    364 
    365 
    366 void AudioMixer::process__validate(state_t* state)
    367 {
    368     LOGW_IF(!state->needsChanged,
    369         "in process__validate() but nothing's invalid");
    370 
    371     uint32_t changed = state->needsChanged;
    372     state->needsChanged = 0; // clear the validation flag
    373 
    374     // recompute which tracks are enabled / disabled
    375     uint32_t enabled = 0;
    376     uint32_t disabled = 0;
    377     while (changed) {
    378         const int i = 31 - __builtin_clz(changed);
    379         const uint32_t mask = 1<<i;
    380         changed &= ~mask;
    381         track_t& t = state->tracks[i];
    382         (t.enabled ? enabled : disabled) |= mask;
    383     }
    384     state->enabledTracks &= ~disabled;
    385     state->enabledTracks |=  enabled;
    386 
    387     // compute everything we need...
    388     int countActiveTracks = 0;
    389     int all16BitsStereoNoResample = 1;
    390     int resampling = 0;
    391     int volumeRamp = 0;
    392     uint32_t en = state->enabledTracks;
    393     while (en) {
    394         const int i = 31 - __builtin_clz(en);
    395         en &= ~(1<<i);
    396 
    397         countActiveTracks++;
    398         track_t& t = state->tracks[i];
    399         uint32_t n = 0;
    400         n |= NEEDS_CHANNEL_1 + t.channelCount - 1;
    401         n |= NEEDS_FORMAT_16;
    402         n |= t.doesResample() ? NEEDS_RESAMPLE_ENABLED : NEEDS_RESAMPLE_DISABLED;
    403         if (t.auxLevel != 0 && t.auxBuffer != NULL) {
    404             n |= NEEDS_AUX_ENABLED;
    405         }
    406 
    407         if (t.volumeInc[0]|t.volumeInc[1]) {
    408             volumeRamp = 1;
    409         } else if (!t.doesResample() && t.volumeRL == 0) {
    410             n |= NEEDS_MUTE_ENABLED;
    411         }
    412         t.needs = n;
    413 
    414         if ((n & NEEDS_MUTE__MASK) == NEEDS_MUTE_ENABLED) {
    415             t.hook = track__nop;
    416         } else {
    417             if ((n & NEEDS_AUX__MASK) == NEEDS_AUX_ENABLED) {
    418                 all16BitsStereoNoResample = 0;
    419             }
    420             if ((n & NEEDS_RESAMPLE__MASK) == NEEDS_RESAMPLE_ENABLED) {
    421                 all16BitsStereoNoResample = 0;
    422                 resampling = 1;
    423                 t.hook = track__genericResample;
    424             } else {
    425                 if ((n & NEEDS_CHANNEL_COUNT__MASK) == NEEDS_CHANNEL_1){
    426                     t.hook = track__16BitsMono;
    427                     all16BitsStereoNoResample = 0;
    428                 }
    429                 if ((n & NEEDS_CHANNEL_COUNT__MASK) == NEEDS_CHANNEL_2){
    430                     t.hook = track__16BitsStereo;
    431                 }
    432             }
    433         }
    434     }
    435 
    436     // select the processing hooks
    437     state->hook = process__nop;
    438     if (countActiveTracks) {
    439         if (resampling) {
    440             if (!state->outputTemp) {
    441                 state->outputTemp = new int32_t[MAX_NUM_CHANNELS * state->frameCount];
    442             }
    443             if (!state->resampleTemp) {
    444                 state->resampleTemp = new int32_t[MAX_NUM_CHANNELS * state->frameCount];
    445             }
    446             state->hook = process__genericResampling;
    447         } else {
    448             if (state->outputTemp) {
    449                 delete [] state->outputTemp;
    450                 state->outputTemp = 0;
    451             }
    452             if (state->resampleTemp) {
    453                 delete [] state->resampleTemp;
    454                 state->resampleTemp = 0;
    455             }
    456             state->hook = process__genericNoResampling;
    457             if (all16BitsStereoNoResample && !volumeRamp) {
    458                 if (countActiveTracks == 1) {
    459                     state->hook = process__OneTrack16BitsStereoNoResampling;
    460                 }
    461             }
    462         }
    463     }
    464 
    465     LOGV("mixer configuration change: %d activeTracks (%08x) "
    466         "all16BitsStereoNoResample=%d, resampling=%d, volumeRamp=%d",
    467         countActiveTracks, state->enabledTracks,
    468         all16BitsStereoNoResample, resampling, volumeRamp);
    469 
    470    state->hook(state);
    471 
    472    // Now that the volume ramp has been done, set optimal state and
    473    // track hooks for subsequent mixer process
    474    if (countActiveTracks) {
    475        int allMuted = 1;
    476        uint32_t en = state->enabledTracks;
    477        while (en) {
    478            const int i = 31 - __builtin_clz(en);
    479            en &= ~(1<<i);
    480            track_t& t = state->tracks[i];
    481            if (!t.doesResample() && t.volumeRL == 0)
    482            {
    483                t.needs |= NEEDS_MUTE_ENABLED;
    484                t.hook = track__nop;
    485            } else {
    486                allMuted = 0;
    487            }
    488        }
    489        if (allMuted) {
    490            state->hook = process__nop;
    491        } else if (all16BitsStereoNoResample) {
    492            if (countActiveTracks == 1) {
    493               state->hook = process__OneTrack16BitsStereoNoResampling;
    494            }
    495        }
    496    }
    497 }
    498 
    499 static inline
    500 int32_t mulAdd(int16_t in, int16_t v, int32_t a)
    501 {
    502 #if defined(__arm__) && !defined(__thumb__)
    503     int32_t out;
    504     asm( "smlabb %[out], %[in], %[v], %[a] \n"
    505          : [out]"=r"(out)
    506          : [in]"%r"(in), [v]"r"(v), [a]"r"(a)
    507          : );
    508     return out;
    509 #else
    510     return a + in * int32_t(v);
    511 #endif
    512 }
    513 
    514 static inline
    515 int32_t mul(int16_t in, int16_t v)
    516 {
    517 #if defined(__arm__) && !defined(__thumb__)
    518     int32_t out;
    519     asm( "smulbb %[out], %[in], %[v] \n"
    520          : [out]"=r"(out)
    521          : [in]"%r"(in), [v]"r"(v)
    522          : );
    523     return out;
    524 #else
    525     return in * int32_t(v);
    526 #endif
    527 }
    528 
    529 static inline
    530 int32_t mulAddRL(int left, uint32_t inRL, uint32_t vRL, int32_t a)
    531 {
    532 #if defined(__arm__) && !defined(__thumb__)
    533     int32_t out;
    534     if (left) {
    535         asm( "smlabb %[out], %[inRL], %[vRL], %[a] \n"
    536              : [out]"=r"(out)
    537              : [inRL]"%r"(inRL), [vRL]"r"(vRL), [a]"r"(a)
    538              : );
    539     } else {
    540         asm( "smlatt %[out], %[inRL], %[vRL], %[a] \n"
    541              : [out]"=r"(out)
    542              : [inRL]"%r"(inRL), [vRL]"r"(vRL), [a]"r"(a)
    543              : );
    544     }
    545     return out;
    546 #else
    547     if (left) {
    548         return a + int16_t(inRL&0xFFFF) * int16_t(vRL&0xFFFF);
    549     } else {
    550         return a + int16_t(inRL>>16) * int16_t(vRL>>16);
    551     }
    552 #endif
    553 }
    554 
    555 static inline
    556 int32_t mulRL(int left, uint32_t inRL, uint32_t vRL)
    557 {
    558 #if defined(__arm__) && !defined(__thumb__)
    559     int32_t out;
    560     if (left) {
    561         asm( "smulbb %[out], %[inRL], %[vRL] \n"
    562              : [out]"=r"(out)
    563              : [inRL]"%r"(inRL), [vRL]"r"(vRL)
    564              : );
    565     } else {
    566         asm( "smultt %[out], %[inRL], %[vRL] \n"
    567              : [out]"=r"(out)
    568              : [inRL]"%r"(inRL), [vRL]"r"(vRL)
    569              : );
    570     }
    571     return out;
    572 #else
    573     if (left) {
    574         return int16_t(inRL&0xFFFF) * int16_t(vRL&0xFFFF);
    575     } else {
    576         return int16_t(inRL>>16) * int16_t(vRL>>16);
    577     }
    578 #endif
    579 }
    580 
    581 
    582 void AudioMixer::track__genericResample(track_t* t, int32_t* out, size_t outFrameCount, int32_t* temp, int32_t* aux)
    583 {
    584     t->resampler->setSampleRate(t->sampleRate);
    585 
    586     // ramp gain - resample to temp buffer and scale/mix in 2nd step
    587     if (aux != NULL) {
    588         // always resample with unity gain when sending to auxiliary buffer to be able
    589         // to apply send level after resampling
    590         // TODO: modify each resampler to support aux channel?
    591         t->resampler->setVolume(UNITY_GAIN, UNITY_GAIN);
    592         memset(temp, 0, outFrameCount * MAX_NUM_CHANNELS * sizeof(int32_t));
    593         t->resampler->resample(temp, outFrameCount, t->bufferProvider);
    594         if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc) {
    595             volumeRampStereo(t, out, outFrameCount, temp, aux);
    596         } else {
    597             volumeStereo(t, out, outFrameCount, temp, aux);
    598         }
    599     } else {
    600         if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]) {
    601             t->resampler->setVolume(UNITY_GAIN, UNITY_GAIN);
    602             memset(temp, 0, outFrameCount * MAX_NUM_CHANNELS * sizeof(int32_t));
    603             t->resampler->resample(temp, outFrameCount, t->bufferProvider);
    604             volumeRampStereo(t, out, outFrameCount, temp, aux);
    605         }
    606 
    607         // constant gain
    608         else {
    609             t->resampler->setVolume(t->volume[0], t->volume[1]);
    610             t->resampler->resample(out, outFrameCount, t->bufferProvider);
    611         }
    612     }
    613 }
    614 
    615 void AudioMixer::track__nop(track_t* t, int32_t* out, size_t outFrameCount, int32_t* temp, int32_t* aux)
    616 {
    617 }
    618 
    619 void AudioMixer::volumeRampStereo(track_t* t, int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux)
    620 {
    621     int32_t vl = t->prevVolume[0];
    622     int32_t vr = t->prevVolume[1];
    623     const int32_t vlInc = t->volumeInc[0];
    624     const int32_t vrInc = t->volumeInc[1];
    625 
    626     //LOGD("[0] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
    627     //        t, vlInc/65536.0f, vl/65536.0f, t->volume[0],
    628     //       (vl + vlInc*frameCount)/65536.0f, frameCount);
    629 
    630     // ramp volume
    631     if UNLIKELY(aux != NULL) {
    632         int32_t va = t->prevAuxLevel;
    633         const int32_t vaInc = t->auxInc;
    634         int32_t l;
    635         int32_t r;
    636 
    637         do {
    638             l = (*temp++ >> 12);
    639             r = (*temp++ >> 12);
    640             *out++ += (vl >> 16) * l;
    641             *out++ += (vr >> 16) * r;
    642             *aux++ += (va >> 17) * (l + r);
    643             vl += vlInc;
    644             vr += vrInc;
    645             va += vaInc;
    646         } while (--frameCount);
    647         t->prevAuxLevel = va;
    648     } else {
    649         do {
    650             *out++ += (vl >> 16) * (*temp++ >> 12);
    651             *out++ += (vr >> 16) * (*temp++ >> 12);
    652             vl += vlInc;
    653             vr += vrInc;
    654         } while (--frameCount);
    655     }
    656     t->prevVolume[0] = vl;
    657     t->prevVolume[1] = vr;
    658     t->adjustVolumeRamp((aux != NULL));
    659 }
    660 
    661 void AudioMixer::volumeStereo(track_t* t, int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux)
    662 {
    663     const int16_t vl = t->volume[0];
    664     const int16_t vr = t->volume[1];
    665 
    666     if UNLIKELY(aux != NULL) {
    667         const int16_t va = (int16_t)t->auxLevel;
    668         do {
    669             int16_t l = (int16_t)(*temp++ >> 12);
    670             int16_t r = (int16_t)(*temp++ >> 12);
    671             out[0] = mulAdd(l, vl, out[0]);
    672             int16_t a = (int16_t)(((int32_t)l + r) >> 1);
    673             out[1] = mulAdd(r, vr, out[1]);
    674             out += 2;
    675             aux[0] = mulAdd(a, va, aux[0]);
    676             aux++;
    677         } while (--frameCount);
    678     } else {
    679         do {
    680             int16_t l = (int16_t)(*temp++ >> 12);
    681             int16_t r = (int16_t)(*temp++ >> 12);
    682             out[0] = mulAdd(l, vl, out[0]);
    683             out[1] = mulAdd(r, vr, out[1]);
    684             out += 2;
    685         } while (--frameCount);
    686     }
    687 }
    688 
    689 void AudioMixer::track__16BitsStereo(track_t* t, int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux)
    690 {
    691     int16_t const *in = static_cast<int16_t const *>(t->in);
    692 
    693     if UNLIKELY(aux != NULL) {
    694         int32_t l;
    695         int32_t r;
    696         // ramp gain
    697         if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc) {
    698             int32_t vl = t->prevVolume[0];
    699             int32_t vr = t->prevVolume[1];
    700             int32_t va = t->prevAuxLevel;
    701             const int32_t vlInc = t->volumeInc[0];
    702             const int32_t vrInc = t->volumeInc[1];
    703             const int32_t vaInc = t->auxInc;
    704             // LOGD("[1] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
    705             //        t, vlInc/65536.0f, vl/65536.0f, t->volume[0],
    706             //        (vl + vlInc*frameCount)/65536.0f, frameCount);
    707 
    708             do {
    709                 l = (int32_t)*in++;
    710                 r = (int32_t)*in++;
    711                 *out++ += (vl >> 16) * l;
    712                 *out++ += (vr >> 16) * r;
    713                 *aux++ += (va >> 17) * (l + r);
    714                 vl += vlInc;
    715                 vr += vrInc;
    716                 va += vaInc;
    717             } while (--frameCount);
    718 
    719             t->prevVolume[0] = vl;
    720             t->prevVolume[1] = vr;
    721             t->prevAuxLevel = va;
    722             t->adjustVolumeRamp(true);
    723         }
    724 
    725         // constant gain
    726         else {
    727             const uint32_t vrl = t->volumeRL;
    728             const int16_t va = (int16_t)t->auxLevel;
    729             do {
    730                 uint32_t rl = *reinterpret_cast<uint32_t const *>(in);
    731                 int16_t a = (int16_t)(((int32_t)in[0] + in[1]) >> 1);
    732                 in += 2;
    733                 out[0] = mulAddRL(1, rl, vrl, out[0]);
    734                 out[1] = mulAddRL(0, rl, vrl, out[1]);
    735                 out += 2;
    736                 aux[0] = mulAdd(a, va, aux[0]);
    737                 aux++;
    738             } while (--frameCount);
    739         }
    740     } else {
    741         // ramp gain
    742         if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]) {
    743             int32_t vl = t->prevVolume[0];
    744             int32_t vr = t->prevVolume[1];
    745             const int32_t vlInc = t->volumeInc[0];
    746             const int32_t vrInc = t->volumeInc[1];
    747 
    748             // LOGD("[1] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
    749             //        t, vlInc/65536.0f, vl/65536.0f, t->volume[0],
    750             //        (vl + vlInc*frameCount)/65536.0f, frameCount);
    751 
    752             do {
    753                 *out++ += (vl >> 16) * (int32_t) *in++;
    754                 *out++ += (vr >> 16) * (int32_t) *in++;
    755                 vl += vlInc;
    756                 vr += vrInc;
    757             } while (--frameCount);
    758 
    759             t->prevVolume[0] = vl;
    760             t->prevVolume[1] = vr;
    761             t->adjustVolumeRamp(false);
    762         }
    763 
    764         // constant gain
    765         else {
    766             const uint32_t vrl = t->volumeRL;
    767             do {
    768                 uint32_t rl = *reinterpret_cast<uint32_t const *>(in);
    769                 in += 2;
    770                 out[0] = mulAddRL(1, rl, vrl, out[0]);
    771                 out[1] = mulAddRL(0, rl, vrl, out[1]);
    772                 out += 2;
    773             } while (--frameCount);
    774         }
    775     }
    776     t->in = in;
    777 }
    778 
    779 void AudioMixer::track__16BitsMono(track_t* t, int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux)
    780 {
    781     int16_t const *in = static_cast<int16_t const *>(t->in);
    782 
    783     if UNLIKELY(aux != NULL) {
    784         // ramp gain
    785         if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc) {
    786             int32_t vl = t->prevVolume[0];
    787             int32_t vr = t->prevVolume[1];
    788             int32_t va = t->prevAuxLevel;
    789             const int32_t vlInc = t->volumeInc[0];
    790             const int32_t vrInc = t->volumeInc[1];
    791             const int32_t vaInc = t->auxInc;
    792 
    793             // LOGD("[2] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
    794             //         t, vlInc/65536.0f, vl/65536.0f, t->volume[0],
    795             //         (vl + vlInc*frameCount)/65536.0f, frameCount);
    796 
    797             do {
    798                 int32_t l = *in++;
    799                 *out++ += (vl >> 16) * l;
    800                 *out++ += (vr >> 16) * l;
    801                 *aux++ += (va >> 16) * l;
    802                 vl += vlInc;
    803                 vr += vrInc;
    804                 va += vaInc;
    805             } while (--frameCount);
    806 
    807             t->prevVolume[0] = vl;
    808             t->prevVolume[1] = vr;
    809             t->prevAuxLevel = va;
    810             t->adjustVolumeRamp(true);
    811         }
    812         // constant gain
    813         else {
    814             const int16_t vl = t->volume[0];
    815             const int16_t vr = t->volume[1];
    816             const int16_t va = (int16_t)t->auxLevel;
    817             do {
    818                 int16_t l = *in++;
    819                 out[0] = mulAdd(l, vl, out[0]);
    820                 out[1] = mulAdd(l, vr, out[1]);
    821                 out += 2;
    822                 aux[0] = mulAdd(l, va, aux[0]);
    823                 aux++;
    824             } while (--frameCount);
    825         }
    826     } else {
    827         // ramp gain
    828         if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]) {
    829             int32_t vl = t->prevVolume[0];
    830             int32_t vr = t->prevVolume[1];
    831             const int32_t vlInc = t->volumeInc[0];
    832             const int32_t vrInc = t->volumeInc[1];
    833 
    834             // LOGD("[2] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
    835             //         t, vlInc/65536.0f, vl/65536.0f, t->volume[0],
    836             //         (vl + vlInc*frameCount)/65536.0f, frameCount);
    837 
    838             do {
    839                 int32_t l = *in++;
    840                 *out++ += (vl >> 16) * l;
    841                 *out++ += (vr >> 16) * l;
    842                 vl += vlInc;
    843                 vr += vrInc;
    844             } while (--frameCount);
    845 
    846             t->prevVolume[0] = vl;
    847             t->prevVolume[1] = vr;
    848             t->adjustVolumeRamp(false);
    849         }
    850         // constant gain
    851         else {
    852             const int16_t vl = t->volume[0];
    853             const int16_t vr = t->volume[1];
    854             do {
    855                 int16_t l = *in++;
    856                 out[0] = mulAdd(l, vl, out[0]);
    857                 out[1] = mulAdd(l, vr, out[1]);
    858                 out += 2;
    859             } while (--frameCount);
    860         }
    861     }
    862     t->in = in;
    863 }
    864 
    865 void AudioMixer::ditherAndClamp(int32_t* out, int32_t const *sums, size_t c)
    866 {
    867     for (size_t i=0 ; i<c ; i++) {
    868         int32_t l = *sums++;
    869         int32_t r = *sums++;
    870         int32_t nl = l >> 12;
    871         int32_t nr = r >> 12;
    872         l = clamp16(nl);
    873         r = clamp16(nr);
    874         *out++ = (r<<16) | (l & 0xFFFF);
    875     }
    876 }
    877 
    878 // no-op case
    879 void AudioMixer::process__nop(state_t* state)
    880 {
    881     uint32_t e0 = state->enabledTracks;
    882     size_t bufSize = state->frameCount * sizeof(int16_t) * MAX_NUM_CHANNELS;
    883     while (e0) {
    884         // process by group of tracks with same output buffer to
    885         // avoid multiple memset() on same buffer
    886         uint32_t e1 = e0, e2 = e0;
    887         int i = 31 - __builtin_clz(e1);
    888         track_t& t1 = state->tracks[i];
    889         e2 &= ~(1<<i);
    890         while (e2) {
    891             i = 31 - __builtin_clz(e2);
    892             e2 &= ~(1<<i);
    893             track_t& t2 = state->tracks[i];
    894             if UNLIKELY(t2.mainBuffer != t1.mainBuffer) {
    895                 e1 &= ~(1<<i);
    896             }
    897         }
    898         e0 &= ~(e1);
    899 
    900         memset(t1.mainBuffer, 0, bufSize);
    901 
    902         while (e1) {
    903             i = 31 - __builtin_clz(e1);
    904             e1 &= ~(1<<i);
    905             t1 = state->tracks[i];
    906             size_t outFrames = state->frameCount;
    907             while (outFrames) {
    908                 t1.buffer.frameCount = outFrames;
    909                 t1.bufferProvider->getNextBuffer(&t1.buffer);
    910                 if (!t1.buffer.raw) break;
    911                 outFrames -= t1.buffer.frameCount;
    912                 t1.bufferProvider->releaseBuffer(&t1.buffer);
    913             }
    914         }
    915     }
    916 }
    917 
    918 // generic code without resampling
    919 void AudioMixer::process__genericNoResampling(state_t* state)
    920 {
    921     int32_t outTemp[BLOCKSIZE * MAX_NUM_CHANNELS] __attribute__((aligned(32)));
    922 
    923     // acquire each track's buffer
    924     uint32_t enabledTracks = state->enabledTracks;
    925     uint32_t e0 = enabledTracks;
    926     while (e0) {
    927         const int i = 31 - __builtin_clz(e0);
    928         e0 &= ~(1<<i);
    929         track_t& t = state->tracks[i];
    930         t.buffer.frameCount = state->frameCount;
    931         t.bufferProvider->getNextBuffer(&t.buffer);
    932         t.frameCount = t.buffer.frameCount;
    933         t.in = t.buffer.raw;
    934         // t.in == NULL can happen if the track was flushed just after having
    935         // been enabled for mixing.
    936         if (t.in == NULL)
    937             enabledTracks &= ~(1<<i);
    938     }
    939 
    940     e0 = enabledTracks;
    941     while (e0) {
    942         // process by group of tracks with same output buffer to
    943         // optimize cache use
    944         uint32_t e1 = e0, e2 = e0;
    945         int j = 31 - __builtin_clz(e1);
    946         track_t& t1 = state->tracks[j];
    947         e2 &= ~(1<<j);
    948         while (e2) {
    949             j = 31 - __builtin_clz(e2);
    950             e2 &= ~(1<<j);
    951             track_t& t2 = state->tracks[j];
    952             if UNLIKELY(t2.mainBuffer != t1.mainBuffer) {
    953                 e1 &= ~(1<<j);
    954             }
    955         }
    956         e0 &= ~(e1);
    957         // this assumes output 16 bits stereo, no resampling
    958         int32_t *out = t1.mainBuffer;
    959         size_t numFrames = 0;
    960         do {
    961             memset(outTemp, 0, sizeof(outTemp));
    962             e2 = e1;
    963             while (e2) {
    964                 const int i = 31 - __builtin_clz(e2);
    965                 e2 &= ~(1<<i);
    966                 track_t& t = state->tracks[i];
    967                 size_t outFrames = BLOCKSIZE;
    968                 int32_t *aux = NULL;
    969                 if UNLIKELY((t.needs & NEEDS_AUX__MASK) == NEEDS_AUX_ENABLED) {
    970                     aux = t.auxBuffer + numFrames;
    971                 }
    972                 while (outFrames) {
    973                     size_t inFrames = (t.frameCount > outFrames)?outFrames:t.frameCount;
    974                     if (inFrames) {
    975                         (t.hook)(&t, outTemp + (BLOCKSIZE-outFrames)*MAX_NUM_CHANNELS, inFrames, state->resampleTemp, aux);
    976                         t.frameCount -= inFrames;
    977                         outFrames -= inFrames;
    978                         if UNLIKELY(aux != NULL) {
    979                             aux += inFrames;
    980                         }
    981                     }
    982                     if (t.frameCount == 0 && outFrames) {
    983                         t.bufferProvider->releaseBuffer(&t.buffer);
    984                         t.buffer.frameCount = (state->frameCount - numFrames) - (BLOCKSIZE - outFrames);
    985                         t.bufferProvider->getNextBuffer(&t.buffer);
    986                         t.in = t.buffer.raw;
    987                         if (t.in == NULL) {
    988                             enabledTracks &= ~(1<<i);
    989                             e1 &= ~(1<<i);
    990                             break;
    991                         }
    992                         t.frameCount = t.buffer.frameCount;
    993                     }
    994                 }
    995             }
    996             ditherAndClamp(out, outTemp, BLOCKSIZE);
    997             out += BLOCKSIZE;
    998             numFrames += BLOCKSIZE;
    999         } while (numFrames < state->frameCount);
   1000     }
   1001 
   1002     // release each track's buffer
   1003     e0 = enabledTracks;
   1004     while (e0) {
   1005         const int i = 31 - __builtin_clz(e0);
   1006         e0 &= ~(1<<i);
   1007         track_t& t = state->tracks[i];
   1008         t.bufferProvider->releaseBuffer(&t.buffer);
   1009     }
   1010 }
   1011 
   1012 
   1013   // generic code with resampling
   1014 void AudioMixer::process__genericResampling(state_t* state)
   1015 {
   1016     int32_t* const outTemp = state->outputTemp;
   1017     const size_t size = sizeof(int32_t) * MAX_NUM_CHANNELS * state->frameCount;
   1018 
   1019     size_t numFrames = state->frameCount;
   1020 
   1021     uint32_t e0 = state->enabledTracks;
   1022     while (e0) {
   1023         // process by group of tracks with same output buffer
   1024         // to optimize cache use
   1025         uint32_t e1 = e0, e2 = e0;
   1026         int j = 31 - __builtin_clz(e1);
   1027         track_t& t1 = state->tracks[j];
   1028         e2 &= ~(1<<j);
   1029         while (e2) {
   1030             j = 31 - __builtin_clz(e2);
   1031             e2 &= ~(1<<j);
   1032             track_t& t2 = state->tracks[j];
   1033             if UNLIKELY(t2.mainBuffer != t1.mainBuffer) {
   1034                 e1 &= ~(1<<j);
   1035             }
   1036         }
   1037         e0 &= ~(e1);
   1038         int32_t *out = t1.mainBuffer;
   1039         memset(outTemp, 0, size);
   1040         while (e1) {
   1041             const int i = 31 - __builtin_clz(e1);
   1042             e1 &= ~(1<<i);
   1043             track_t& t = state->tracks[i];
   1044             int32_t *aux = NULL;
   1045             if UNLIKELY((t.needs & NEEDS_AUX__MASK) == NEEDS_AUX_ENABLED) {
   1046                 aux = t.auxBuffer;
   1047             }
   1048 
   1049             // this is a little goofy, on the resampling case we don't
   1050             // acquire/release the buffers because it's done by
   1051             // the resampler.
   1052             if ((t.needs & NEEDS_RESAMPLE__MASK) == NEEDS_RESAMPLE_ENABLED) {
   1053                 (t.hook)(&t, outTemp, numFrames, state->resampleTemp, aux);
   1054             } else {
   1055 
   1056                 size_t outFrames = 0;
   1057 
   1058                 while (outFrames < numFrames) {
   1059                     t.buffer.frameCount = numFrames - outFrames;
   1060                     t.bufferProvider->getNextBuffer(&t.buffer);
   1061                     t.in = t.buffer.raw;
   1062                     // t.in == NULL can happen if the track was flushed just after having
   1063                     // been enabled for mixing.
   1064                     if (t.in == NULL) break;
   1065 
   1066                     if UNLIKELY(aux != NULL) {
   1067                         aux += outFrames;
   1068                     }
   1069                     (t.hook)(&t, outTemp + outFrames*MAX_NUM_CHANNELS, t.buffer.frameCount, state->resampleTemp, aux);
   1070                     outFrames += t.buffer.frameCount;
   1071                     t.bufferProvider->releaseBuffer(&t.buffer);
   1072                 }
   1073             }
   1074         }
   1075         ditherAndClamp(out, outTemp, numFrames);
   1076     }
   1077 }
   1078 
   1079 // one track, 16 bits stereo without resampling is the most common case
   1080 void AudioMixer::process__OneTrack16BitsStereoNoResampling(state_t* state)
   1081 {
   1082     const int i = 31 - __builtin_clz(state->enabledTracks);
   1083     const track_t& t = state->tracks[i];
   1084 
   1085     AudioBufferProvider::Buffer& b(t.buffer);
   1086 
   1087     int32_t* out = t.mainBuffer;
   1088     size_t numFrames = state->frameCount;
   1089 
   1090     const int16_t vl = t.volume[0];
   1091     const int16_t vr = t.volume[1];
   1092     const uint32_t vrl = t.volumeRL;
   1093     while (numFrames) {
   1094         b.frameCount = numFrames;
   1095         t.bufferProvider->getNextBuffer(&b);
   1096         int16_t const *in = b.i16;
   1097 
   1098         // in == NULL can happen if the track was flushed just after having
   1099         // been enabled for mixing.
   1100         if (in == NULL || ((unsigned long)in & 3)) {
   1101             memset(out, 0, numFrames*MAX_NUM_CHANNELS*sizeof(int16_t));
   1102             LOGE_IF(((unsigned long)in & 3), "process stereo track: input buffer alignment pb: buffer %p track %d, channels %d, needs %08x",
   1103                     in, i, t.channelCount, t.needs);
   1104             return;
   1105         }
   1106         size_t outFrames = b.frameCount;
   1107 
   1108         if (UNLIKELY(uint32_t(vl) > UNITY_GAIN || uint32_t(vr) > UNITY_GAIN)) {
   1109             // volume is boosted, so we might need to clamp even though
   1110             // we process only one track.
   1111             do {
   1112                 uint32_t rl = *reinterpret_cast<uint32_t const *>(in);
   1113                 in += 2;
   1114                 int32_t l = mulRL(1, rl, vrl) >> 12;
   1115                 int32_t r = mulRL(0, rl, vrl) >> 12;
   1116                 // clamping...
   1117                 l = clamp16(l);
   1118                 r = clamp16(r);
   1119                 *out++ = (r<<16) | (l & 0xFFFF);
   1120             } while (--outFrames);
   1121         } else {
   1122             do {
   1123                 uint32_t rl = *reinterpret_cast<uint32_t const *>(in);
   1124                 in += 2;
   1125                 int32_t l = mulRL(1, rl, vrl) >> 12;
   1126                 int32_t r = mulRL(0, rl, vrl) >> 12;
   1127                 *out++ = (r<<16) | (l & 0xFFFF);
   1128             } while (--outFrames);
   1129         }
   1130         numFrames -= b.frameCount;
   1131         t.bufferProvider->releaseBuffer(&b);
   1132     }
   1133 }
   1134 
   1135 // 2 tracks is also a common case
   1136 // NEVER used in current implementation of process__validate()
   1137 // only use if the 2 tracks have the same output buffer
   1138 void AudioMixer::process__TwoTracks16BitsStereoNoResampling(state_t* state)
   1139 {
   1140     int i;
   1141     uint32_t en = state->enabledTracks;
   1142 
   1143     i = 31 - __builtin_clz(en);
   1144     const track_t& t0 = state->tracks[i];
   1145     AudioBufferProvider::Buffer& b0(t0.buffer);
   1146 
   1147     en &= ~(1<<i);
   1148     i = 31 - __builtin_clz(en);
   1149     const track_t& t1 = state->tracks[i];
   1150     AudioBufferProvider::Buffer& b1(t1.buffer);
   1151 
   1152     int16_t const *in0;
   1153     const int16_t vl0 = t0.volume[0];
   1154     const int16_t vr0 = t0.volume[1];
   1155     size_t frameCount0 = 0;
   1156 
   1157     int16_t const *in1;
   1158     const int16_t vl1 = t1.volume[0];
   1159     const int16_t vr1 = t1.volume[1];
   1160     size_t frameCount1 = 0;
   1161 
   1162     //FIXME: only works if two tracks use same buffer
   1163     int32_t* out = t0.mainBuffer;
   1164     size_t numFrames = state->frameCount;
   1165     int16_t const *buff = NULL;
   1166 
   1167 
   1168     while (numFrames) {
   1169 
   1170         if (frameCount0 == 0) {
   1171             b0.frameCount = numFrames;
   1172             t0.bufferProvider->getNextBuffer(&b0);
   1173             if (b0.i16 == NULL) {
   1174                 if (buff == NULL) {
   1175                     buff = new int16_t[MAX_NUM_CHANNELS * state->frameCount];
   1176                 }
   1177                 in0 = buff;
   1178                 b0.frameCount = numFrames;
   1179             } else {
   1180                 in0 = b0.i16;
   1181             }
   1182             frameCount0 = b0.frameCount;
   1183         }
   1184         if (frameCount1 == 0) {
   1185             b1.frameCount = numFrames;
   1186             t1.bufferProvider->getNextBuffer(&b1);
   1187             if (b1.i16 == NULL) {
   1188                 if (buff == NULL) {
   1189                     buff = new int16_t[MAX_NUM_CHANNELS * state->frameCount];
   1190                 }
   1191                 in1 = buff;
   1192                 b1.frameCount = numFrames;
   1193                } else {
   1194                 in1 = b1.i16;
   1195             }
   1196             frameCount1 = b1.frameCount;
   1197         }
   1198 
   1199         size_t outFrames = frameCount0 < frameCount1?frameCount0:frameCount1;
   1200 
   1201         numFrames -= outFrames;
   1202         frameCount0 -= outFrames;
   1203         frameCount1 -= outFrames;
   1204 
   1205         do {
   1206             int32_t l0 = *in0++;
   1207             int32_t r0 = *in0++;
   1208             l0 = mul(l0, vl0);
   1209             r0 = mul(r0, vr0);
   1210             int32_t l = *in1++;
   1211             int32_t r = *in1++;
   1212             l = mulAdd(l, vl1, l0) >> 12;
   1213             r = mulAdd(r, vr1, r0) >> 12;
   1214             // clamping...
   1215             l = clamp16(l);
   1216             r = clamp16(r);
   1217             *out++ = (r<<16) | (l & 0xFFFF);
   1218         } while (--outFrames);
   1219 
   1220         if (frameCount0 == 0) {
   1221             t0.bufferProvider->releaseBuffer(&b0);
   1222         }
   1223         if (frameCount1 == 0) {
   1224             t1.bufferProvider->releaseBuffer(&b1);
   1225         }
   1226     }
   1227 
   1228     if (buff != NULL) {
   1229         delete [] buff;
   1230     }
   1231 }
   1232 
   1233 // ----------------------------------------------------------------------------
   1234 }; // namespace android
   1235 
   1236