diff options
Diffstat (limited to 'services/audioflinger/AudioMixer.cpp')
-rw-r--r-- | services/audioflinger/AudioMixer.cpp | 526 |
1 files changed, 214 insertions, 312 deletions
diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index 9dda256..0b9f8ba 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -18,6 +18,7 @@ #define LOG_TAG "AudioMixer" //#define LOG_NDEBUG 0 +#include <assert.h> #include <stdint.h> #include <string.h> #include <stdlib.h> @@ -27,240 +28,229 @@ #include <utils/Log.h> #include <cutils/bitops.h> +#include <cutils/compiler.h> #include <system/audio.h> +#include <audio_utils/primitives.h> + #include "AudioMixer.h" namespace android { -// ---------------------------------------------------------------------------- - -static inline int16_t clamp16(int32_t sample) -{ - if ((sample>>15) ^ (sample>>31)) - sample = 0x7FFF ^ (sample>>31); - return sample; -} // ---------------------------------------------------------------------------- AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) - : mActiveTrack(0), mTrackNames(0), mSampleRate(sampleRate) + : mTrackNames(0), mSampleRate(sampleRate) { + // AudioMixer is not yet capable of multi-channel beyond stereo + assert(2 == MAX_NUM_CHANNELS); mState.enabledTracks= 0; mState.needsChanged = 0; mState.frameCount = frameCount; - mState.outputTemp = 0; - mState.resampleTemp = 0; mState.hook = process__nop; + mState.outputTemp = NULL; + mState.resampleTemp = NULL; + // mState.reserved track_t* t = mState.tracks; - for (int i=0 ; i<32 ; i++) { + for (unsigned i=0 ; i < MAX_NUM_TRACKS ; i++) { t->needs = 0; t->volume[0] = UNITY_GAIN; t->volume[1] = UNITY_GAIN; + // no initialization needed + // t->prevVolume[0] + // t->prevVolume[1] t->volumeInc[0] = 0; t->volumeInc[1] = 0; t->auxLevel = 0; t->auxInc = 0; + // no initialization needed + // t->prevAuxLevel + // t->frameCount t->channelCount = 2; t->enabled = 0; t->format = 16; t->channelMask = AUDIO_CHANNEL_OUT_STEREO; - t->buffer.raw = 0; - t->bufferProvider = 0; - t->hook = 0; - t->resampler = 0; + t->bufferProvider = NULL; + t->buffer.raw = NULL; + // t->buffer.frameCount + t->hook = NULL; + t->in = NULL; + t->resampler = NULL; t->sampleRate = mSampleRate; - t->in = 0; t->mainBuffer = NULL; t->auxBuffer = NULL; t++; } } - AudioMixer::~AudioMixer() - { - track_t* t = mState.tracks; - for (int i=0 ; i<32 ; i++) { - delete t->resampler; - t++; - } - delete [] mState.outputTemp; - delete [] mState.resampleTemp; - } - - int AudioMixer::getTrackName() - { - uint32_t names = mTrackNames; - uint32_t mask = 1; - int n = 0; - while (names & mask) { - mask <<= 1; - n++; +AudioMixer::~AudioMixer() +{ + track_t* t = mState.tracks; + for (unsigned i=0 ; i < MAX_NUM_TRACKS ; i++) { + delete t->resampler; + t++; } - if (mask) { + delete [] mState.outputTemp; + delete [] mState.resampleTemp; +} + +int AudioMixer::getTrackName() +{ + uint32_t names = ~mTrackNames; + if (names != 0) { + int n = __builtin_ctz(names); ALOGV("add track (%d)", n); - mTrackNames |= mask; + mTrackNames |= 1 << n; return TRACK0 + n; } return -1; - } +} - void AudioMixer::invalidateState(uint32_t mask) - { +void AudioMixer::invalidateState(uint32_t mask) +{ if (mask) { mState.needsChanged |= mask; mState.hook = process__validate; } } - void AudioMixer::deleteTrackName(int name) - { +void AudioMixer::deleteTrackName(int name) +{ name -= TRACK0; - if (uint32_t(name) < MAX_NUM_TRACKS) { - ALOGV("deleteTrackName(%d)", name); - track_t& track(mState.tracks[ name ]); - if (track.enabled != 0) { - track.enabled = 0; - invalidateState(1<<name); - } - if (track.resampler) { - // delete the resampler - delete track.resampler; - track.resampler = 0; - track.sampleRate = mSampleRate; - invalidateState(1<<name); - } - track.volumeInc[0] = 0; - track.volumeInc[1] = 0; - mTrackNames &= ~(1<<name); + assert(uint32_t(name) < MAX_NUM_TRACKS); + ALOGV("deleteTrackName(%d)", name); + track_t& track(mState.tracks[ name ]); + if (track.enabled != 0) { + track.enabled = 0; + invalidateState(1<<name); } - } - -status_t AudioMixer::enable(int name) -{ - switch (name) { - case MIXING: { - if (mState.tracks[ mActiveTrack ].enabled != 1) { - mState.tracks[ mActiveTrack ].enabled = 1; - ALOGV("enable(%d)", mActiveTrack); - invalidateState(1<<mActiveTrack); - } - } break; - default: - return NAME_NOT_FOUND; + if (track.resampler != NULL) { + // delete the resampler + delete track.resampler; + track.resampler = NULL; + track.sampleRate = mSampleRate; + invalidateState(1<<name); } - return NO_ERROR; + track.volumeInc[0] = 0; + track.volumeInc[1] = 0; + mTrackNames &= ~(1<<name); } -status_t AudioMixer::disable(int name) +void AudioMixer::enable(int name) { - switch (name) { - case MIXING: { - if (mState.tracks[ mActiveTrack ].enabled != 0) { - mState.tracks[ mActiveTrack ].enabled = 0; - ALOGV("disable(%d)", mActiveTrack); - invalidateState(1<<mActiveTrack); - } - } break; - default: - return NAME_NOT_FOUND; + name -= TRACK0; + assert(uint32_t(name) < MAX_NUM_TRACKS); + track_t& track = mState.tracks[name]; + + if (track.enabled != 1) { + track.enabled = 1; + ALOGV("enable(%d)", name); + invalidateState(1 << name); } - return NO_ERROR; } -status_t AudioMixer::setActiveTrack(int track) +void AudioMixer::disable(int name) { - if (uint32_t(track-TRACK0) >= MAX_NUM_TRACKS) { - return BAD_VALUE; + name -= TRACK0; + assert(uint32_t(name) < MAX_NUM_TRACKS); + track_t& track = mState.tracks[name]; + + if (track.enabled != 0) { + track.enabled = 0; + ALOGV("disable(%d)", name); + invalidateState(1 << name); } - mActiveTrack = track - TRACK0; - return NO_ERROR; } -status_t AudioMixer::setParameter(int target, int name, void *value) +void AudioMixer::setParameter(int name, int target, int param, void *value) { + name -= TRACK0; + assert(uint32_t(name) < MAX_NUM_TRACKS); + track_t& track = mState.tracks[name]; + int valueInt = (int)value; int32_t *valueBuf = (int32_t *)value; switch (target) { + case TRACK: - if (name == CHANNEL_MASK) { + switch (param) { + case CHANNEL_MASK: { uint32_t mask = (uint32_t)value; - if (mState.tracks[ mActiveTrack ].channelMask != mask) { + if (track.channelMask != mask) { uint8_t channelCount = popcount(mask); - if ((channelCount <= MAX_NUM_CHANNELS) && (channelCount)) { - mState.tracks[ mActiveTrack ].channelMask = mask; - mState.tracks[ mActiveTrack ].channelCount = channelCount; - ALOGV("setParameter(TRACK, CHANNEL_MASK, %x)", mask); - invalidateState(1<<mActiveTrack); - return NO_ERROR; - } - } else { - return NO_ERROR; + assert((channelCount <= MAX_NUM_CHANNELS) && (channelCount)); + track.channelMask = mask; + track.channelCount = channelCount; + ALOGV("setParameter(TRACK, CHANNEL_MASK, %x)", mask); + invalidateState(1 << name); } - } - if (name == MAIN_BUFFER) { - if (mState.tracks[ mActiveTrack ].mainBuffer != valueBuf) { - mState.tracks[ mActiveTrack ].mainBuffer = valueBuf; + } break; + case MAIN_BUFFER: + if (track.mainBuffer != valueBuf) { + track.mainBuffer = valueBuf; ALOGV("setParameter(TRACK, MAIN_BUFFER, %p)", valueBuf); - invalidateState(1<<mActiveTrack); + invalidateState(1 << name); } - return NO_ERROR; - } - if (name == AUX_BUFFER) { - if (mState.tracks[ mActiveTrack ].auxBuffer != valueBuf) { - mState.tracks[ mActiveTrack ].auxBuffer = valueBuf; + break; + case AUX_BUFFER: + if (track.auxBuffer != valueBuf) { + track.auxBuffer = valueBuf; ALOGV("setParameter(TRACK, AUX_BUFFER, %p)", valueBuf); - invalidateState(1<<mActiveTrack); + invalidateState(1 << name); } - return NO_ERROR; + break; + default: + // bad param + assert(false); } - break; + case RESAMPLE: - if (name == SAMPLE_RATE) { - if (valueInt > 0) { - track_t& track = mState.tracks[ mActiveTrack ]; - if (track.setResampler(uint32_t(valueInt), mSampleRate)) { - ALOGV("setParameter(RESAMPLE, SAMPLE_RATE, %u)", - uint32_t(valueInt)); - invalidateState(1<<mActiveTrack); - } - return NO_ERROR; + switch (param) { + case SAMPLE_RATE: + assert(valueInt > 0); + if (track.setResampler(uint32_t(valueInt), mSampleRate)) { + ALOGV("setParameter(RESAMPLE, SAMPLE_RATE, %u)", + uint32_t(valueInt)); + invalidateState(1 << name); } - } - if (name == RESET) { - track_t& track = mState.tracks[ mActiveTrack ]; + break; + case RESET: track.resetResampler(); - invalidateState(1<<mActiveTrack); - return NO_ERROR; + invalidateState(1 << name); + break; + default: + // bad param + assert(false); } break; + case RAMP_VOLUME: case VOLUME: - if ((uint32_t(name-VOLUME0) < MAX_NUM_CHANNELS)) { - track_t& track = mState.tracks[ mActiveTrack ]; - if (track.volume[name-VOLUME0] != valueInt) { + switch (param) { + case VOLUME0: + case VOLUME1: + if (track.volume[param-VOLUME0] != valueInt) { ALOGV("setParameter(VOLUME, VOLUME0/1: %04x)", valueInt); - track.prevVolume[name-VOLUME0] = track.volume[name-VOLUME0] << 16; - track.volume[name-VOLUME0] = valueInt; + track.prevVolume[param-VOLUME0] = track.volume[param-VOLUME0] << 16; + track.volume[param-VOLUME0] = valueInt; if (target == VOLUME) { - track.prevVolume[name-VOLUME0] = valueInt << 16; - track.volumeInc[name-VOLUME0] = 0; + track.prevVolume[param-VOLUME0] = valueInt << 16; + track.volumeInc[param-VOLUME0] = 0; } else { - int32_t d = (valueInt<<16) - track.prevVolume[name-VOLUME0]; + int32_t d = (valueInt<<16) - track.prevVolume[param-VOLUME0]; int32_t volInc = d / int32_t(mState.frameCount); - track.volumeInc[name-VOLUME0] = volInc; + track.volumeInc[param-VOLUME0] = volInc; if (volInc == 0) { - track.prevVolume[name-VOLUME0] = valueInt << 16; + track.prevVolume[param-VOLUME0] = valueInt << 16; } } - invalidateState(1<<mActiveTrack); + invalidateState(1 << name); } - return NO_ERROR; - } else if (name == AUXLEVEL) { - track_t& track = mState.tracks[ mActiveTrack ]; + break; + case AUXLEVEL: if (track.auxLevel != valueInt) { ALOGV("setParameter(VOLUME, AUXLEVEL: %04x)", valueInt); track.prevAuxLevel = track.auxLevel << 16; @@ -276,13 +266,19 @@ status_t AudioMixer::setParameter(int target, int name, void *value) track.prevAuxLevel = valueInt << 16; } } - invalidateState(1<<mActiveTrack); + invalidateState(1 << name); } - return NO_ERROR; + break; + default: + // bad param + assert(false); } break; + + default: + // bad target + assert(false); } - return BAD_VALUE; } bool AudioMixer::track_t::setResampler(uint32_t value, uint32_t devSampleRate) @@ -290,7 +286,7 @@ bool AudioMixer::track_t::setResampler(uint32_t value, uint32_t devSampleRate) if (value!=devSampleRate || resampler) { if (sampleRate != value) { sampleRate = value; - if (resampler == 0) { + if (resampler == NULL) { resampler = AudioResampler::create( format, channelCount, devSampleRate); } @@ -302,12 +298,12 @@ bool AudioMixer::track_t::setResampler(uint32_t value, uint32_t devSampleRate) bool AudioMixer::track_t::doesResample() const { - return resampler != 0; + return resampler != NULL; } void AudioMixer::track_t::resetResampler() { - if (resampler != 0) { + if (resampler != NULL) { resampler->reset(); } } @@ -315,7 +311,7 @@ void AudioMixer::track_t::resetResampler() inline void AudioMixer::track_t::adjustVolumeRamp(bool aux) { - for (int i=0 ; i<2 ; i++) { + for (uint32_t i=0 ; i<MAX_NUM_CHANNELS ; i++) { if (((volumeInc[i]>0) && (((prevVolume[i]+volumeInc[i])>>16) >= volume[i])) || ((volumeInc[i]<0) && (((prevVolume[i]+volumeInc[i])>>16) <= volume[i]))) { volumeInc[i] = 0; @@ -349,10 +345,11 @@ size_t AudioMixer::getUnreleasedFrames(int name) return 0; } -status_t AudioMixer::setBufferProvider(AudioBufferProvider* buffer) +void AudioMixer::setBufferProvider(int name, AudioBufferProvider* buffer) { - mState.tracks[ mActiveTrack ].bufferProvider = buffer; - return NO_ERROR; + name -= TRACK0; + assert(uint32_t(name) < MAX_NUM_TRACKS); + mState.tracks[name].bufferProvider = buffer; } @@ -447,11 +444,11 @@ void AudioMixer::process__validate(state_t* state) } else { if (state->outputTemp) { delete [] state->outputTemp; - state->outputTemp = 0; + state->outputTemp = NULL; } if (state->resampleTemp) { delete [] state->resampleTemp; - state->resampleTemp = 0; + state->resampleTemp = NULL; } state->hook = process__genericNoResampling; if (all16BitsStereoNoResample && !volumeRamp) { @@ -467,115 +464,33 @@ void AudioMixer::process__validate(state_t* state) countActiveTracks, state->enabledTracks, all16BitsStereoNoResample, resampling, volumeRamp); - state->hook(state); - - // Now that the volume ramp has been done, set optimal state and - // track hooks for subsequent mixer process - if (countActiveTracks) { - int allMuted = 1; - uint32_t en = state->enabledTracks; - while (en) { - const int i = 31 - __builtin_clz(en); - en &= ~(1<<i); - track_t& t = state->tracks[i]; - if (!t.doesResample() && t.volumeRL == 0) - { - t.needs |= NEEDS_MUTE_ENABLED; - t.hook = track__nop; - } else { - allMuted = 0; - } - } - if (allMuted) { - state->hook = process__nop; - } else if (all16BitsStereoNoResample) { - if (countActiveTracks == 1) { - state->hook = process__OneTrack16BitsStereoNoResampling; - } - } - } -} - -static inline -int32_t mulAdd(int16_t in, int16_t v, int32_t a) -{ -#if defined(__arm__) && !defined(__thumb__) - int32_t out; - asm( "smlabb %[out], %[in], %[v], %[a] \n" - : [out]"=r"(out) - : [in]"%r"(in), [v]"r"(v), [a]"r"(a) - : ); - return out; -#else - return a + in * int32_t(v); -#endif -} - -static inline -int32_t mul(int16_t in, int16_t v) -{ -#if defined(__arm__) && !defined(__thumb__) - int32_t out; - asm( "smulbb %[out], %[in], %[v] \n" - : [out]"=r"(out) - : [in]"%r"(in), [v]"r"(v) - : ); - return out; -#else - return in * int32_t(v); -#endif -} + state->hook(state); -static inline -int32_t mulAddRL(int left, uint32_t inRL, uint32_t vRL, int32_t a) -{ -#if defined(__arm__) && !defined(__thumb__) - int32_t out; - if (left) { - asm( "smlabb %[out], %[inRL], %[vRL], %[a] \n" - : [out]"=r"(out) - : [inRL]"%r"(inRL), [vRL]"r"(vRL), [a]"r"(a) - : ); - } else { - asm( "smlatt %[out], %[inRL], %[vRL], %[a] \n" - : [out]"=r"(out) - : [inRL]"%r"(inRL), [vRL]"r"(vRL), [a]"r"(a) - : ); - } - return out; -#else - if (left) { - return a + int16_t(inRL&0xFFFF) * int16_t(vRL&0xFFFF); - } else { - return a + int16_t(inRL>>16) * int16_t(vRL>>16); - } -#endif -} - -static inline -int32_t mulRL(int left, uint32_t inRL, uint32_t vRL) -{ -#if defined(__arm__) && !defined(__thumb__) - int32_t out; - if (left) { - asm( "smulbb %[out], %[inRL], %[vRL] \n" - : [out]"=r"(out) - : [inRL]"%r"(inRL), [vRL]"r"(vRL) - : ); - } else { - asm( "smultt %[out], %[inRL], %[vRL] \n" - : [out]"=r"(out) - : [inRL]"%r"(inRL), [vRL]"r"(vRL) - : ); - } - return out; -#else - if (left) { - return int16_t(inRL&0xFFFF) * int16_t(vRL&0xFFFF); - } else { - return int16_t(inRL>>16) * int16_t(vRL>>16); + // Now that the volume ramp has been done, set optimal state and + // track hooks for subsequent mixer process + if (countActiveTracks) { + int allMuted = 1; + uint32_t en = state->enabledTracks; + while (en) { + const int i = 31 - __builtin_clz(en); + en &= ~(1<<i); + track_t& t = state->tracks[i]; + if (!t.doesResample() && t.volumeRL == 0) + { + t.needs |= NEEDS_MUTE_ENABLED; + t.hook = track__nop; + } else { + allMuted = 0; + } + } + if (allMuted) { + state->hook = process__nop; + } else if (all16BitsStereoNoResample) { + if (countActiveTracks == 1) { + state->hook = process__OneTrack16BitsStereoNoResampling; + } + } } -#endif } @@ -591,13 +506,13 @@ void AudioMixer::track__genericResample(track_t* t, int32_t* out, size_t outFram t->resampler->setVolume(UNITY_GAIN, UNITY_GAIN); memset(temp, 0, outFrameCount * MAX_NUM_CHANNELS * sizeof(int32_t)); t->resampler->resample(temp, outFrameCount, t->bufferProvider); - if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc) { + if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc)) { volumeRampStereo(t, out, outFrameCount, temp, aux); } else { volumeStereo(t, out, outFrameCount, temp, aux); } } else { - if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]) { + if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1])) { t->resampler->setVolume(UNITY_GAIN, UNITY_GAIN); memset(temp, 0, outFrameCount * MAX_NUM_CHANNELS * sizeof(int32_t)); t->resampler->resample(temp, outFrameCount, t->bufferProvider); @@ -628,7 +543,7 @@ void AudioMixer::volumeRampStereo(track_t* t, int32_t* out, size_t frameCount, i // (vl + vlInc*frameCount)/65536.0f, frameCount); // ramp volume - if UNLIKELY(aux != NULL) { + if (CC_UNLIKELY(aux != NULL)) { int32_t va = t->prevAuxLevel; const int32_t vaInc = t->auxInc; int32_t l; @@ -663,7 +578,7 @@ void AudioMixer::volumeStereo(track_t* t, int32_t* out, size_t frameCount, int32 const int16_t vl = t->volume[0]; const int16_t vr = t->volume[1]; - if UNLIKELY(aux != NULL) { + if (CC_UNLIKELY(aux != NULL)) { const int16_t va = (int16_t)t->auxLevel; do { int16_t l = (int16_t)(*temp++ >> 12); @@ -688,13 +603,13 @@ void AudioMixer::volumeStereo(track_t* t, int32_t* out, size_t frameCount, int32 void AudioMixer::track__16BitsStereo(track_t* t, int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux) { - int16_t const *in = static_cast<int16_t const *>(t->in); + const int16_t *in = static_cast<const int16_t *>(t->in); - if UNLIKELY(aux != NULL) { + if (CC_UNLIKELY(aux != NULL)) { int32_t l; int32_t r; // ramp gain - if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc) { + if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc)) { int32_t vl = t->prevVolume[0]; int32_t vr = t->prevVolume[1]; int32_t va = t->prevAuxLevel; @@ -727,7 +642,7 @@ void AudioMixer::track__16BitsStereo(track_t* t, int32_t* out, size_t frameCount const uint32_t vrl = t->volumeRL; const int16_t va = (int16_t)t->auxLevel; do { - uint32_t rl = *reinterpret_cast<uint32_t const *>(in); + uint32_t rl = *reinterpret_cast<const uint32_t *>(in); int16_t a = (int16_t)(((int32_t)in[0] + in[1]) >> 1); in += 2; out[0] = mulAddRL(1, rl, vrl, out[0]); @@ -739,7 +654,7 @@ void AudioMixer::track__16BitsStereo(track_t* t, int32_t* out, size_t frameCount } } else { // ramp gain - if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]) { + if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1])) { int32_t vl = t->prevVolume[0]; int32_t vr = t->prevVolume[1]; const int32_t vlInc = t->volumeInc[0]; @@ -765,7 +680,7 @@ void AudioMixer::track__16BitsStereo(track_t* t, int32_t* out, size_t frameCount else { const uint32_t vrl = t->volumeRL; do { - uint32_t rl = *reinterpret_cast<uint32_t const *>(in); + uint32_t rl = *reinterpret_cast<const uint32_t *>(in); in += 2; out[0] = mulAddRL(1, rl, vrl, out[0]); out[1] = mulAddRL(0, rl, vrl, out[1]); @@ -778,11 +693,11 @@ void AudioMixer::track__16BitsStereo(track_t* t, int32_t* out, size_t frameCount void AudioMixer::track__16BitsMono(track_t* t, int32_t* out, size_t frameCount, int32_t* temp, int32_t* aux) { - int16_t const *in = static_cast<int16_t const *>(t->in); + const int16_t *in = static_cast<int16_t const *>(t->in); - if UNLIKELY(aux != NULL) { + if (CC_UNLIKELY(aux != NULL)) { // ramp gain - if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc) { + if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc)) { int32_t vl = t->prevVolume[0]; int32_t vr = t->prevVolume[1]; int32_t va = t->prevAuxLevel; @@ -825,7 +740,7 @@ void AudioMixer::track__16BitsMono(track_t* t, int32_t* out, size_t frameCount, } } else { // ramp gain - if UNLIKELY(t->volumeInc[0]|t->volumeInc[1]) { + if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1])) { int32_t vl = t->prevVolume[0]; int32_t vr = t->prevVolume[1]; const int32_t vlInc = t->volumeInc[0]; @@ -862,19 +777,6 @@ void AudioMixer::track__16BitsMono(track_t* t, int32_t* out, size_t frameCount, t->in = in; } -void AudioMixer::ditherAndClamp(int32_t* out, int32_t const *sums, size_t c) -{ - for (size_t i=0 ; i<c ; i++) { - int32_t l = *sums++; - int32_t r = *sums++; - int32_t nl = l >> 12; - int32_t nr = r >> 12; - l = clamp16(nl); - r = clamp16(nr); - *out++ = (r<<16) | (l & 0xFFFF); - } -} - // no-op case void AudioMixer::process__nop(state_t* state) { @@ -891,7 +793,7 @@ void AudioMixer::process__nop(state_t* state) i = 31 - __builtin_clz(e2); e2 &= ~(1<<i); track_t& t2 = state->tracks[i]; - if UNLIKELY(t2.mainBuffer != t1.mainBuffer) { + if (CC_UNLIKELY(t2.mainBuffer != t1.mainBuffer)) { e1 &= ~(1<<i); } } @@ -907,7 +809,7 @@ void AudioMixer::process__nop(state_t* state) while (outFrames) { t1.buffer.frameCount = outFrames; t1.bufferProvider->getNextBuffer(&t1.buffer); - if (!t1.buffer.raw) break; + if (t1.buffer.raw == NULL) break; outFrames -= t1.buffer.frameCount; t1.bufferProvider->releaseBuffer(&t1.buffer); } @@ -949,7 +851,7 @@ void AudioMixer::process__genericNoResampling(state_t* state) j = 31 - __builtin_clz(e2); e2 &= ~(1<<j); track_t& t2 = state->tracks[j]; - if UNLIKELY(t2.mainBuffer != t1.mainBuffer) { + if (CC_UNLIKELY(t2.mainBuffer != t1.mainBuffer)) { e1 &= ~(1<<j); } } @@ -966,7 +868,7 @@ void AudioMixer::process__genericNoResampling(state_t* state) track_t& t = state->tracks[i]; size_t outFrames = BLOCKSIZE; int32_t *aux = NULL; - if UNLIKELY((t.needs & NEEDS_AUX__MASK) == NEEDS_AUX_ENABLED) { + if (CC_UNLIKELY((t.needs & NEEDS_AUX__MASK) == NEEDS_AUX_ENABLED)) { aux = t.auxBuffer + numFrames; } while (outFrames) { @@ -975,7 +877,7 @@ void AudioMixer::process__genericNoResampling(state_t* state) (t.hook)(&t, outTemp + (BLOCKSIZE-outFrames)*MAX_NUM_CHANNELS, inFrames, state->resampleTemp, aux); t.frameCount -= inFrames; outFrames -= inFrames; - if UNLIKELY(aux != NULL) { + if (CC_UNLIKELY(aux != NULL)) { aux += inFrames; } } @@ -1010,9 +912,10 @@ void AudioMixer::process__genericNoResampling(state_t* state) } - // generic code with resampling +// generic code with resampling void AudioMixer::process__genericResampling(state_t* state) { + // this const just means that local variable outTemp doesn't change int32_t* const outTemp = state->outputTemp; const size_t size = sizeof(int32_t) * MAX_NUM_CHANNELS * state->frameCount; @@ -1030,7 +933,7 @@ void AudioMixer::process__genericResampling(state_t* state) j = 31 - __builtin_clz(e2); e2 &= ~(1<<j); track_t& t2 = state->tracks[j]; - if UNLIKELY(t2.mainBuffer != t1.mainBuffer) { + if (CC_UNLIKELY(t2.mainBuffer != t1.mainBuffer)) { e1 &= ~(1<<j); } } @@ -1042,7 +945,7 @@ void AudioMixer::process__genericResampling(state_t* state) e1 &= ~(1<<i); track_t& t = state->tracks[i]; int32_t *aux = NULL; - if UNLIKELY((t.needs & NEEDS_AUX__MASK) == NEEDS_AUX_ENABLED) { + if (CC_UNLIKELY((t.needs & NEEDS_AUX__MASK) == NEEDS_AUX_ENABLED)) { aux = t.auxBuffer; } @@ -1063,7 +966,7 @@ void AudioMixer::process__genericResampling(state_t* state) // been enabled for mixing. if (t.in == NULL) break; - if UNLIKELY(aux != NULL) { + if (CC_UNLIKELY(aux != NULL)) { aux += outFrames; } (t.hook)(&t, outTemp + outFrames*MAX_NUM_CHANNELS, t.buffer.frameCount, state->resampleTemp, aux); @@ -1093,7 +996,7 @@ void AudioMixer::process__OneTrack16BitsStereoNoResampling(state_t* state) while (numFrames) { b.frameCount = numFrames; t.bufferProvider->getNextBuffer(&b); - int16_t const *in = b.i16; + const int16_t *in = b.i16; // in == NULL can happen if the track was flushed just after having // been enabled for mixing. @@ -1105,11 +1008,11 @@ void AudioMixer::process__OneTrack16BitsStereoNoResampling(state_t* state) } size_t outFrames = b.frameCount; - if (UNLIKELY(uint32_t(vl) > UNITY_GAIN || uint32_t(vr) > UNITY_GAIN)) { + if (CC_UNLIKELY(uint32_t(vl) > UNITY_GAIN || uint32_t(vr) > UNITY_GAIN)) { // volume is boosted, so we might need to clamp even though // we process only one track. do { - uint32_t rl = *reinterpret_cast<uint32_t const *>(in); + uint32_t rl = *reinterpret_cast<const uint32_t *>(in); in += 2; int32_t l = mulRL(1, rl, vrl) >> 12; int32_t r = mulRL(0, rl, vrl) >> 12; @@ -1120,7 +1023,7 @@ void AudioMixer::process__OneTrack16BitsStereoNoResampling(state_t* state) } while (--outFrames); } else { do { - uint32_t rl = *reinterpret_cast<uint32_t const *>(in); + uint32_t rl = *reinterpret_cast<const uint32_t *>(in); in += 2; int32_t l = mulRL(1, rl, vrl) >> 12; int32_t r = mulRL(0, rl, vrl) >> 12; @@ -1132,6 +1035,7 @@ void AudioMixer::process__OneTrack16BitsStereoNoResampling(state_t* state) } } +#if 0 // 2 tracks is also a common case // NEVER used in current implementation of process__validate() // only use if the 2 tracks have the same output buffer @@ -1149,12 +1053,12 @@ void AudioMixer::process__TwoTracks16BitsStereoNoResampling(state_t* state) const track_t& t1 = state->tracks[i]; AudioBufferProvider::Buffer& b1(t1.buffer); - int16_t const *in0; + const int16_t *in0; const int16_t vl0 = t0.volume[0]; const int16_t vr0 = t0.volume[1]; size_t frameCount0 = 0; - int16_t const *in1; + const int16_t *in1; const int16_t vl1 = t1.volume[0]; const int16_t vr1 = t1.volume[1]; size_t frameCount1 = 0; @@ -1162,7 +1066,7 @@ void AudioMixer::process__TwoTracks16BitsStereoNoResampling(state_t* state) //FIXME: only works if two tracks use same buffer int32_t* out = t0.mainBuffer; size_t numFrames = state->frameCount; - int16_t const *buff = NULL; + const int16_t *buff = NULL; while (numFrames) { @@ -1190,7 +1094,7 @@ void AudioMixer::process__TwoTracks16BitsStereoNoResampling(state_t* state) } in1 = buff; b1.frameCount = numFrames; - } else { + } else { in1 = b1.i16; } frameCount1 = b1.frameCount; @@ -1225,11 +1129,9 @@ void AudioMixer::process__TwoTracks16BitsStereoNoResampling(state_t* state) } } - if (buff != NULL) { - delete [] buff; - } + delete [] buff; } +#endif // ---------------------------------------------------------------------------- }; // namespace android - |