AudioMixer.cpp revision 5866a3b9689035580c31f1a02037b8176d7508a7
1/*
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 "Configuration.h"
22#include <stdint.h>
23#include <string.h>
24#include <stdlib.h>
25#include <sys/types.h>
26
27#include <utils/Errors.h>
28#include <utils/Log.h>
29
30#include <cutils/bitops.h>
31#include <cutils/compiler.h>
32#include <utils/Debug.h>
33
34#include <system/audio.h>
35
36#include <audio_utils/primitives.h>
37#include <audio_utils/format.h>
38#include <common_time/local_clock.h>
39#include <common_time/cc_helper.h>
40
41#include <media/EffectsFactoryApi.h>
42
43#include "AudioMixer.h"
44
45namespace android {
46
47// ----------------------------------------------------------------------------
48AudioMixer::DownmixerBufferProvider::DownmixerBufferProvider() : AudioBufferProvider(),
49        mTrackBufferProvider(NULL), mDownmixHandle(NULL)
50{
51}
52
53AudioMixer::DownmixerBufferProvider::~DownmixerBufferProvider()
54{
55    ALOGV("AudioMixer deleting DownmixerBufferProvider (%p)", this);
56    EffectRelease(mDownmixHandle);
57}
58
59status_t AudioMixer::DownmixerBufferProvider::getNextBuffer(AudioBufferProvider::Buffer *pBuffer,
60        int64_t pts) {
61    //ALOGV("DownmixerBufferProvider::getNextBuffer()");
62    if (mTrackBufferProvider != NULL) {
63        status_t res = mTrackBufferProvider->getNextBuffer(pBuffer, pts);
64        if (res == OK) {
65            mDownmixConfig.inputCfg.buffer.frameCount = pBuffer->frameCount;
66            mDownmixConfig.inputCfg.buffer.raw = pBuffer->raw;
67            mDownmixConfig.outputCfg.buffer.frameCount = pBuffer->frameCount;
68            mDownmixConfig.outputCfg.buffer.raw = mDownmixConfig.inputCfg.buffer.raw;
69            // in-place so overwrite the buffer contents, has been set in prepareTrackForDownmix()
70            //mDownmixConfig.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_WRITE;
71
72            res = (*mDownmixHandle)->process(mDownmixHandle,
73                    &mDownmixConfig.inputCfg.buffer, &mDownmixConfig.outputCfg.buffer);
74            //ALOGV("getNextBuffer is downmixing");
75        }
76        return res;
77    } else {
78        ALOGE("DownmixerBufferProvider::getNextBuffer() error: NULL track buffer provider");
79        return NO_INIT;
80    }
81}
82
83void AudioMixer::DownmixerBufferProvider::releaseBuffer(AudioBufferProvider::Buffer *pBuffer) {
84    //ALOGV("DownmixerBufferProvider::releaseBuffer()");
85    if (mTrackBufferProvider != NULL) {
86        mTrackBufferProvider->releaseBuffer(pBuffer);
87    } else {
88        ALOGE("DownmixerBufferProvider::releaseBuffer() error: NULL track buffer provider");
89    }
90}
91
92template <typename T>
93T min(const T& a, const T& b)
94{
95    return a < b ? a : b;
96}
97
98AudioMixer::ReformatBufferProvider::ReformatBufferProvider(int32_t channels,
99        audio_format_t inputFormat, audio_format_t outputFormat) :
100        mTrackBufferProvider(NULL),
101        mChannels(channels),
102        mInputFormat(inputFormat),
103        mOutputFormat(outputFormat),
104        mInputFrameSize(channels * audio_bytes_per_sample(inputFormat)),
105        mOutputFrameSize(channels * audio_bytes_per_sample(outputFormat)),
106        mOutputData(NULL),
107        mOutputCount(0),
108        mConsumed(0)
109{
110    ALOGV("ReformatBufferProvider(%p)(%d, %#x, %#x)", this, channels, inputFormat, outputFormat);
111    if (requiresInternalBuffers()) {
112        mOutputCount = 256;
113        (void)posix_memalign(&mOutputData, 32, mOutputCount * mOutputFrameSize);
114    }
115    mBuffer.frameCount = 0;
116}
117
118AudioMixer::ReformatBufferProvider::~ReformatBufferProvider()
119{
120    ALOGV("~ReformatBufferProvider(%p)", this);
121    if (mBuffer.frameCount != 0) {
122        mTrackBufferProvider->releaseBuffer(&mBuffer);
123    }
124    free(mOutputData);
125}
126
127status_t AudioMixer::ReformatBufferProvider::getNextBuffer(AudioBufferProvider::Buffer *pBuffer,
128        int64_t pts) {
129    //ALOGV("ReformatBufferProvider(%p)::getNextBuffer(%p (%zu), %lld)",
130    //        this, pBuffer, pBuffer->frameCount, pts);
131    if (!requiresInternalBuffers()) {
132        status_t res = mTrackBufferProvider->getNextBuffer(pBuffer, pts);
133        if (res == OK) {
134            memcpy_by_audio_format(pBuffer->raw, mOutputFormat, pBuffer->raw, mInputFormat,
135                    pBuffer->frameCount * mChannels);
136        }
137        return res;
138    }
139    if (mBuffer.frameCount == 0) {
140        mBuffer.frameCount = pBuffer->frameCount;
141        status_t res = mTrackBufferProvider->getNextBuffer(&mBuffer, pts);
142        // TODO: Track down a bug in the upstream provider
143        // LOG_ALWAYS_FATAL_IF(res == OK && mBuffer.frameCount == 0,
144        //        "ReformatBufferProvider::getNextBuffer():"
145        //        " Invalid zero framecount returned from getNextBuffer()");
146        if (res != OK || mBuffer.frameCount == 0) {
147            pBuffer->raw = NULL;
148            pBuffer->frameCount = 0;
149            return res;
150        }
151    }
152    ALOG_ASSERT(mConsumed < mBuffer.frameCount);
153    size_t count = min(mOutputCount, mBuffer.frameCount - mConsumed);
154    count = min(count, pBuffer->frameCount);
155    pBuffer->raw = mOutputData;
156    pBuffer->frameCount = count;
157    //ALOGV("reformatting %d frames from %#x to %#x, %d chan",
158    //        pBuffer->frameCount, mInputFormat, mOutputFormat, mChannels);
159    memcpy_by_audio_format(pBuffer->raw, mOutputFormat,
160            (uint8_t*)mBuffer.raw + mConsumed * mInputFrameSize, mInputFormat,
161            pBuffer->frameCount * mChannels);
162    return OK;
163}
164
165void AudioMixer::ReformatBufferProvider::releaseBuffer(AudioBufferProvider::Buffer *pBuffer) {
166    //ALOGV("ReformatBufferProvider(%p)::releaseBuffer(%p(%zu))",
167    //        this, pBuffer, pBuffer->frameCount);
168    if (!requiresInternalBuffers()) {
169        mTrackBufferProvider->releaseBuffer(pBuffer);
170        return;
171    }
172    // LOG_ALWAYS_FATAL_IF(pBuffer->frameCount == 0, "Invalid framecount");
173    mConsumed += pBuffer->frameCount; // TODO: update for efficiency to reuse existing content
174    if (mConsumed != 0 && mConsumed >= mBuffer.frameCount) {
175        mConsumed = 0;
176        mTrackBufferProvider->releaseBuffer(&mBuffer);
177        // ALOG_ASSERT(mBuffer.frameCount == 0);
178    }
179    pBuffer->raw = NULL;
180    pBuffer->frameCount = 0;
181}
182
183void AudioMixer::ReformatBufferProvider::reset() {
184    if (mBuffer.frameCount != 0) {
185        mTrackBufferProvider->releaseBuffer(&mBuffer);
186    }
187    mConsumed = 0;
188}
189
190// ----------------------------------------------------------------------------
191bool AudioMixer::sIsMultichannelCapable = false;
192
193effect_descriptor_t AudioMixer::sDwnmFxDesc;
194
195// Ensure mConfiguredNames bitmask is initialized properly on all architectures.
196// The value of 1 << x is undefined in C when x >= 32.
197
198AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate, uint32_t maxNumTracks)
199    :   mTrackNames(0), mConfiguredNames((maxNumTracks >= 32 ? 0 : 1 << maxNumTracks) - 1),
200        mSampleRate(sampleRate)
201{
202    // AudioMixer is not yet capable of multi-channel beyond stereo
203    COMPILE_TIME_ASSERT_FUNCTION_SCOPE(2 == MAX_NUM_CHANNELS);
204
205    ALOG_ASSERT(maxNumTracks <= MAX_NUM_TRACKS, "maxNumTracks %u > MAX_NUM_TRACKS %u",
206            maxNumTracks, MAX_NUM_TRACKS);
207
208    // AudioMixer is not yet capable of more than 32 active track inputs
209    ALOG_ASSERT(32 >= MAX_NUM_TRACKS, "bad MAX_NUM_TRACKS %d", MAX_NUM_TRACKS);
210
211    // AudioMixer is not yet capable of multi-channel output beyond stereo
212    ALOG_ASSERT(2 == MAX_NUM_CHANNELS, "bad MAX_NUM_CHANNELS %d", MAX_NUM_CHANNELS);
213
214    pthread_once(&sOnceControl, &sInitRoutine);
215
216    mState.enabledTracks= 0;
217    mState.needsChanged = 0;
218    mState.frameCount   = frameCount;
219    mState.hook         = process__nop;
220    mState.outputTemp   = NULL;
221    mState.resampleTemp = NULL;
222    mState.mLog         = &mDummyLog;
223    // mState.reserved
224
225    // FIXME Most of the following initialization is probably redundant since
226    // tracks[i] should only be referenced if (mTrackNames & (1 << i)) != 0
227    // and mTrackNames is initially 0.  However, leave it here until that's verified.
228    track_t* t = mState.tracks;
229    for (unsigned i=0 ; i < MAX_NUM_TRACKS ; i++) {
230        t->resampler = NULL;
231        t->downmixerBufferProvider = NULL;
232        t++;
233    }
234
235}
236
237AudioMixer::~AudioMixer()
238{
239    track_t* t = mState.tracks;
240    for (unsigned i=0 ; i < MAX_NUM_TRACKS ; i++) {
241        delete t->resampler;
242        delete t->downmixerBufferProvider;
243        t++;
244    }
245    delete [] mState.outputTemp;
246    delete [] mState.resampleTemp;
247}
248
249void AudioMixer::setLog(NBLog::Writer *log)
250{
251    mState.mLog = log;
252}
253
254int AudioMixer::getTrackName(audio_channel_mask_t channelMask,
255        audio_format_t format, int sessionId)
256{
257    if (!isValidPcmTrackFormat(format)) {
258        ALOGE("AudioMixer::getTrackName invalid format (%#x)", format);
259        return -1;
260    }
261    uint32_t names = (~mTrackNames) & mConfiguredNames;
262    if (names != 0) {
263        int n = __builtin_ctz(names);
264        ALOGV("add track (%d)", n);
265        // assume default parameters for the track, except where noted below
266        track_t* t = &mState.tracks[n];
267        t->needs = 0;
268        t->volume[0] = UNITY_GAIN;
269        t->volume[1] = UNITY_GAIN;
270        // no initialization needed
271        // t->prevVolume[0]
272        // t->prevVolume[1]
273        t->volumeInc[0] = 0;
274        t->volumeInc[1] = 0;
275        t->auxLevel = 0;
276        t->auxInc = 0;
277        // no initialization needed
278        // t->prevAuxLevel
279        // t->frameCount
280        t->channelCount = audio_channel_count_from_out_mask(channelMask);
281        t->enabled = false;
282        ALOGV_IF(channelMask != AUDIO_CHANNEL_OUT_STEREO,
283                "Non-stereo channel mask: %d\n", channelMask);
284        t->channelMask = channelMask;
285        t->sessionId = sessionId;
286        // setBufferProvider(name, AudioBufferProvider *) is required before enable(name)
287        t->bufferProvider = NULL;
288        t->buffer.raw = NULL;
289        // no initialization needed
290        // t->buffer.frameCount
291        t->hook = NULL;
292        t->in = NULL;
293        t->resampler = NULL;
294        t->sampleRate = mSampleRate;
295        // setParameter(name, TRACK, MAIN_BUFFER, mixBuffer) is required before enable(name)
296        t->mainBuffer = NULL;
297        t->auxBuffer = NULL;
298        t->mInputBufferProvider = NULL;
299        t->mReformatBufferProvider = NULL;
300        t->downmixerBufferProvider = NULL;
301        t->mMixerFormat = AUDIO_FORMAT_PCM_16_BIT;
302        t->mFormat = format;
303        t->mMixerInFormat = AUDIO_FORMAT_PCM_16_BIT;
304        if (t->mFormat != t->mMixerInFormat) {
305            prepareTrackForReformat(t, n);
306        }
307        status_t status = initTrackDownmix(&mState.tracks[n], n, channelMask);
308        if (status != OK) {
309            ALOGE("AudioMixer::getTrackName invalid channelMask (%#x)", channelMask);
310            return -1;
311        }
312        mTrackNames |= 1 << n;
313        return TRACK0 + n;
314    }
315    ALOGE("AudioMixer::getTrackName out of available tracks");
316    return -1;
317}
318
319void AudioMixer::invalidateState(uint32_t mask)
320{
321    if (mask != 0) {
322        mState.needsChanged |= mask;
323        mState.hook = process__validate;
324    }
325 }
326
327status_t AudioMixer::initTrackDownmix(track_t* pTrack, int trackNum, audio_channel_mask_t mask)
328{
329    uint32_t channelCount = audio_channel_count_from_out_mask(mask);
330    ALOG_ASSERT((channelCount <= MAX_NUM_CHANNELS_TO_DOWNMIX) && channelCount);
331    status_t status = OK;
332    if (channelCount > MAX_NUM_CHANNELS) {
333        pTrack->channelMask = mask;
334        pTrack->channelCount = channelCount;
335        ALOGV("initTrackDownmix(track=%d, mask=0x%x) calls prepareTrackForDownmix()",
336                trackNum, mask);
337        status = prepareTrackForDownmix(pTrack, trackNum);
338    } else {
339        unprepareTrackForDownmix(pTrack, trackNum);
340    }
341    return status;
342}
343
344void AudioMixer::unprepareTrackForDownmix(track_t* pTrack, int trackName __unused) {
345    ALOGV("AudioMixer::unprepareTrackForDownmix(%d)", trackName);
346
347    if (pTrack->downmixerBufferProvider != NULL) {
348        // this track had previously been configured with a downmixer, delete it
349        ALOGV(" deleting old downmixer");
350        delete pTrack->downmixerBufferProvider;
351        pTrack->downmixerBufferProvider = NULL;
352        reconfigureBufferProviders(pTrack);
353    } else {
354        ALOGV(" nothing to do, no downmixer to delete");
355    }
356}
357
358status_t AudioMixer::prepareTrackForDownmix(track_t* pTrack, int trackName)
359{
360    ALOGV("AudioMixer::prepareTrackForDownmix(%d) with mask 0x%x", trackName, pTrack->channelMask);
361
362    // discard the previous downmixer if there was one
363    unprepareTrackForDownmix(pTrack, trackName);
364
365    DownmixerBufferProvider* pDbp = new DownmixerBufferProvider();
366    int32_t status;
367
368    if (!sIsMultichannelCapable) {
369        ALOGE("prepareTrackForDownmix(%d) fails: mixer doesn't support multichannel content",
370                trackName);
371        goto noDownmixForActiveTrack;
372    }
373
374    if (EffectCreate(&sDwnmFxDesc.uuid,
375            pTrack->sessionId /*sessionId*/, -2 /*ioId not relevant here, using random value*/,
376            &pDbp->mDownmixHandle/*pHandle*/) != 0) {
377        ALOGE("prepareTrackForDownmix(%d) fails: error creating downmixer effect", trackName);
378        goto noDownmixForActiveTrack;
379    }
380
381    // channel input configuration will be overridden per-track
382    pDbp->mDownmixConfig.inputCfg.channels = pTrack->channelMask;
383    pDbp->mDownmixConfig.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
384    pDbp->mDownmixConfig.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
385    pDbp->mDownmixConfig.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
386    pDbp->mDownmixConfig.inputCfg.samplingRate = pTrack->sampleRate;
387    pDbp->mDownmixConfig.outputCfg.samplingRate = pTrack->sampleRate;
388    pDbp->mDownmixConfig.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
389    pDbp->mDownmixConfig.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_WRITE;
390    // input and output buffer provider, and frame count will not be used as the downmix effect
391    // process() function is called directly (see DownmixerBufferProvider::getNextBuffer())
392    pDbp->mDownmixConfig.inputCfg.mask = EFFECT_CONFIG_SMP_RATE | EFFECT_CONFIG_CHANNELS |
393            EFFECT_CONFIG_FORMAT | EFFECT_CONFIG_ACC_MODE;
394    pDbp->mDownmixConfig.outputCfg.mask = pDbp->mDownmixConfig.inputCfg.mask;
395
396    {// scope for local variables that are not used in goto label "noDownmixForActiveTrack"
397        int cmdStatus;
398        uint32_t replySize = sizeof(int);
399
400        // Configure and enable downmixer
401        status = (*pDbp->mDownmixHandle)->command(pDbp->mDownmixHandle,
402                EFFECT_CMD_SET_CONFIG /*cmdCode*/, sizeof(effect_config_t) /*cmdSize*/,
403                &pDbp->mDownmixConfig /*pCmdData*/,
404                &replySize /*replySize*/, &cmdStatus /*pReplyData*/);
405        if ((status != 0) || (cmdStatus != 0)) {
406            ALOGE("error %d while configuring downmixer for track %d", status, trackName);
407            goto noDownmixForActiveTrack;
408        }
409        replySize = sizeof(int);
410        status = (*pDbp->mDownmixHandle)->command(pDbp->mDownmixHandle,
411                EFFECT_CMD_ENABLE /*cmdCode*/, 0 /*cmdSize*/, NULL /*pCmdData*/,
412                &replySize /*replySize*/, &cmdStatus /*pReplyData*/);
413        if ((status != 0) || (cmdStatus != 0)) {
414            ALOGE("error %d while enabling downmixer for track %d", status, trackName);
415            goto noDownmixForActiveTrack;
416        }
417
418        // Set downmix type
419        // parameter size rounded for padding on 32bit boundary
420        const int psizePadded = ((sizeof(downmix_params_t) - 1)/sizeof(int) + 1) * sizeof(int);
421        const int downmixParamSize =
422                sizeof(effect_param_t) + psizePadded + sizeof(downmix_type_t);
423        effect_param_t * const param = (effect_param_t *) malloc(downmixParamSize);
424        param->psize = sizeof(downmix_params_t);
425        const downmix_params_t downmixParam = DOWNMIX_PARAM_TYPE;
426        memcpy(param->data, &downmixParam, param->psize);
427        const downmix_type_t downmixType = DOWNMIX_TYPE_FOLD;
428        param->vsize = sizeof(downmix_type_t);
429        memcpy(param->data + psizePadded, &downmixType, param->vsize);
430
431        status = (*pDbp->mDownmixHandle)->command(pDbp->mDownmixHandle,
432                EFFECT_CMD_SET_PARAM /* cmdCode */, downmixParamSize/* cmdSize */,
433                param /*pCmndData*/, &replySize /*replySize*/, &cmdStatus /*pReplyData*/);
434
435        free(param);
436
437        if ((status != 0) || (cmdStatus != 0)) {
438            ALOGE("error %d while setting downmix type for track %d", status, trackName);
439            goto noDownmixForActiveTrack;
440        } else {
441            ALOGV("downmix type set to %d for track %d", (int) downmixType, trackName);
442        }
443    }// end of scope for local variables that are not used in goto label "noDownmixForActiveTrack"
444
445    // initialization successful:
446    pTrack->downmixerBufferProvider = pDbp;
447    reconfigureBufferProviders(pTrack);
448    return NO_ERROR;
449
450noDownmixForActiveTrack:
451    delete pDbp;
452    pTrack->downmixerBufferProvider = NULL;
453    reconfigureBufferProviders(pTrack);
454    return NO_INIT;
455}
456
457void AudioMixer::unprepareTrackForReformat(track_t* pTrack, int trackName __unused) {
458    ALOGV("AudioMixer::unprepareTrackForReformat(%d)", trackName);
459    if (pTrack->mReformatBufferProvider != NULL) {
460        delete pTrack->mReformatBufferProvider;
461        pTrack->mReformatBufferProvider = NULL;
462        reconfigureBufferProviders(pTrack);
463    }
464}
465
466status_t AudioMixer::prepareTrackForReformat(track_t* pTrack, int trackName)
467{
468    ALOGV("AudioMixer::prepareTrackForReformat(%d) with format %#x", trackName, pTrack->mFormat);
469    // discard the previous reformatter if there was one
470     unprepareTrackForReformat(pTrack, trackName);
471     pTrack->mReformatBufferProvider = new ReformatBufferProvider(
472             audio_channel_count_from_out_mask(pTrack->channelMask),
473             pTrack->mFormat, pTrack->mMixerInFormat);
474     reconfigureBufferProviders(pTrack);
475     return NO_ERROR;
476}
477
478void AudioMixer::reconfigureBufferProviders(track_t* pTrack)
479{
480    pTrack->bufferProvider = pTrack->mInputBufferProvider;
481    if (pTrack->mReformatBufferProvider) {
482        pTrack->mReformatBufferProvider->mTrackBufferProvider = pTrack->bufferProvider;
483        pTrack->bufferProvider = pTrack->mReformatBufferProvider;
484    }
485    if (pTrack->downmixerBufferProvider) {
486        pTrack->downmixerBufferProvider->mTrackBufferProvider = pTrack->bufferProvider;
487        pTrack->bufferProvider = pTrack->downmixerBufferProvider;
488    }
489}
490
491void AudioMixer::deleteTrackName(int name)
492{
493    ALOGV("AudioMixer::deleteTrackName(%d)", name);
494    name -= TRACK0;
495    ALOG_ASSERT(uint32_t(name) < MAX_NUM_TRACKS, "bad track name %d", name);
496    ALOGV("deleteTrackName(%d)", name);
497    track_t& track(mState.tracks[ name ]);
498    if (track.enabled) {
499        track.enabled = false;
500        invalidateState(1<<name);
501    }
502    // delete the resampler
503    delete track.resampler;
504    track.resampler = NULL;
505    // delete the downmixer
506    unprepareTrackForDownmix(&mState.tracks[name], name);
507    // delete the reformatter
508    unprepareTrackForReformat(&mState.tracks[name], name);
509
510    mTrackNames &= ~(1<<name);
511}
512
513void AudioMixer::enable(int name)
514{
515    name -= TRACK0;
516    ALOG_ASSERT(uint32_t(name) < MAX_NUM_TRACKS, "bad track name %d", name);
517    track_t& track = mState.tracks[name];
518
519    if (!track.enabled) {
520        track.enabled = true;
521        ALOGV("enable(%d)", name);
522        invalidateState(1 << name);
523    }
524}
525
526void AudioMixer::disable(int name)
527{
528    name -= TRACK0;
529    ALOG_ASSERT(uint32_t(name) < MAX_NUM_TRACKS, "bad track name %d", name);
530    track_t& track = mState.tracks[name];
531
532    if (track.enabled) {
533        track.enabled = false;
534        ALOGV("disable(%d)", name);
535        invalidateState(1 << name);
536    }
537}
538
539/* Sets the volume ramp variables for the AudioMixer.
540 *
541 * The volume ramp variables are used to transition between the previous
542 * volume to the target volume.  The duration of the transition is
543 * set by ramp, which is either 0 for immediate, or typically one state
544 * framecount period.
545 *
546 * @param newValue new volume target in U4.12.
547 * @param ramp number of frames to increment over. ramp is 0 if the volume
548 * should be set immediately.
549 * @param volume reference to the U4.12 target volume, set on return.
550 * @param prevVolume reference to the U4.27 previous volume, set on return.
551 * @param volumeInc reference to the increment per output audio frame, set on return.
552 * @return true if the volume has changed, false if volume is same.
553 */
554static inline bool setVolumeRampVariables(int32_t newValue, int32_t ramp,
555        int16_t &volume, int32_t &prevVolume, int32_t &volumeInc) {
556    if (newValue == volume) {
557        return false;
558    }
559    if (ramp != 0) {
560        volumeInc = ((newValue - volume) << 16) / ramp;
561        prevVolume = (volumeInc == 0 ? newValue : volume) << 16;
562    } else {
563        volumeInc = 0;
564        prevVolume = newValue << 16;
565    }
566    volume = newValue;
567    return true;
568}
569
570void AudioMixer::setParameter(int name, int target, int param, void *value)
571{
572    name -= TRACK0;
573    ALOG_ASSERT(uint32_t(name) < MAX_NUM_TRACKS, "bad track name %d", name);
574    track_t& track = mState.tracks[name];
575
576    int valueInt = static_cast<int>(reinterpret_cast<uintptr_t>(value));
577    int32_t *valueBuf = reinterpret_cast<int32_t*>(value);
578
579    switch (target) {
580
581    case TRACK:
582        switch (param) {
583        case CHANNEL_MASK: {
584            audio_channel_mask_t mask =
585                static_cast<audio_channel_mask_t>(reinterpret_cast<uintptr_t>(value));
586            if (track.channelMask != mask) {
587                uint32_t channelCount = audio_channel_count_from_out_mask(mask);
588                ALOG_ASSERT((channelCount <= MAX_NUM_CHANNELS_TO_DOWNMIX) && channelCount);
589                track.channelMask = mask;
590                track.channelCount = channelCount;
591                // the mask has changed, does this track need a downmixer?
592                initTrackDownmix(&mState.tracks[name], name, mask);
593                ALOGV("setParameter(TRACK, CHANNEL_MASK, %x)", mask);
594                invalidateState(1 << name);
595            }
596            } break;
597        case MAIN_BUFFER:
598            if (track.mainBuffer != valueBuf) {
599                track.mainBuffer = valueBuf;
600                ALOGV("setParameter(TRACK, MAIN_BUFFER, %p)", valueBuf);
601                invalidateState(1 << name);
602            }
603            break;
604        case AUX_BUFFER:
605            if (track.auxBuffer != valueBuf) {
606                track.auxBuffer = valueBuf;
607                ALOGV("setParameter(TRACK, AUX_BUFFER, %p)", valueBuf);
608                invalidateState(1 << name);
609            }
610            break;
611        case FORMAT: {
612            audio_format_t format = static_cast<audio_format_t>(valueInt);
613            if (track.mFormat != format) {
614                ALOG_ASSERT(audio_is_linear_pcm(format), "Invalid format %#x", format);
615                track.mFormat = format;
616                ALOGV("setParameter(TRACK, FORMAT, %#x)", format);
617                //if (track.mFormat != track.mMixerInFormat)
618                {
619                    ALOGD("Reformatting!");
620                    prepareTrackForReformat(&track, name);
621                }
622                invalidateState(1 << name);
623            }
624            } break;
625        // FIXME do we want to support setting the downmix type from AudioFlinger?
626        //         for a specific track? or per mixer?
627        /* case DOWNMIX_TYPE:
628            break          */
629        case MIXER_FORMAT: {
630            audio_format_t format = static_cast<audio_format_t>(valueInt);
631            if (track.mMixerFormat != format) {
632                track.mMixerFormat = format;
633                ALOGV("setParameter(TRACK, MIXER_FORMAT, %#x)", format);
634            }
635            } break;
636        default:
637            LOG_ALWAYS_FATAL("setParameter track: bad param %d", param);
638        }
639        break;
640
641    case RESAMPLE:
642        switch (param) {
643        case SAMPLE_RATE:
644            ALOG_ASSERT(valueInt > 0, "bad sample rate %d", valueInt);
645            if (track.setResampler(uint32_t(valueInt), mSampleRate)) {
646                ALOGV("setParameter(RESAMPLE, SAMPLE_RATE, %u)",
647                        uint32_t(valueInt));
648                invalidateState(1 << name);
649            }
650            break;
651        case RESET:
652            track.resetResampler();
653            invalidateState(1 << name);
654            break;
655        case REMOVE:
656            delete track.resampler;
657            track.resampler = NULL;
658            track.sampleRate = mSampleRate;
659            invalidateState(1 << name);
660            break;
661        default:
662            LOG_ALWAYS_FATAL("setParameter resample: bad param %d", param);
663        }
664        break;
665
666    case RAMP_VOLUME:
667    case VOLUME:
668        switch (param) {
669        case VOLUME0:
670        case VOLUME1:
671            if (setVolumeRampVariables(valueInt,
672                    target == RAMP_VOLUME ? mState.frameCount : 0,
673                    track.volume[param - VOLUME0], track.prevVolume[param - VOLUME0],
674                    track.volumeInc[param - VOLUME0])) {
675                ALOGV("setParameter(%s, VOLUME%d: %04x)",
676                        target == VOLUME ? "VOLUME" : "RAMP_VOLUME", param - VOLUME0, valueInt);
677                invalidateState(1 << name);
678            }
679            break;
680        case AUXLEVEL:
681            //ALOG_ASSERT(0 <= valueInt && valueInt <= MAX_GAIN_INT, "bad aux level %d", valueInt);
682            if (setVolumeRampVariables(valueInt,
683                    target == RAMP_VOLUME ? mState.frameCount : 0,
684                    track.auxLevel, track.prevAuxLevel, track.auxInc)) {
685                ALOGV("setParameter(%s, AUXLEVEL: %04x)",
686                        target == VOLUME ? "VOLUME" : "RAMP_VOLUME", valueInt);
687                invalidateState(1 << name);
688            }
689            break;
690        default:
691            LOG_ALWAYS_FATAL("setParameter volume: bad param %d", param);
692        }
693        break;
694
695    default:
696        LOG_ALWAYS_FATAL("setParameter: bad target %d", target);
697    }
698}
699
700bool AudioMixer::track_t::setResampler(uint32_t value, uint32_t devSampleRate)
701{
702    if (value != devSampleRate || resampler != NULL) {
703        if (sampleRate != value) {
704            sampleRate = value;
705            if (resampler == NULL) {
706                ALOGV("creating resampler from track %d Hz to device %d Hz", value, devSampleRate);
707                AudioResampler::src_quality quality;
708                // force lowest quality level resampler if use case isn't music or video
709                // FIXME this is flawed for dynamic sample rates, as we choose the resampler
710                // quality level based on the initial ratio, but that could change later.
711                // Should have a way to distinguish tracks with static ratios vs. dynamic ratios.
712                if (!((value == 44100 && devSampleRate == 48000) ||
713                      (value == 48000 && devSampleRate == 44100))) {
714                    quality = AudioResampler::DYN_LOW_QUALITY;
715                } else {
716                    quality = AudioResampler::DEFAULT_QUALITY;
717                }
718                const int bits = mMixerInFormat == AUDIO_FORMAT_PCM_16_BIT ? 16 : /* FLOAT */ 32;
719                resampler = AudioResampler::create(
720                        bits,
721                        // the resampler sees the number of channels after the downmixer, if any
722                        (int) (downmixerBufferProvider != NULL ? MAX_NUM_CHANNELS : channelCount),
723                        devSampleRate, quality);
724                resampler->setLocalTimeFreq(sLocalTimeFreq);
725            }
726            return true;
727        }
728    }
729    return false;
730}
731
732inline
733void AudioMixer::track_t::adjustVolumeRamp(bool aux)
734{
735    for (uint32_t i=0 ; i<MAX_NUM_CHANNELS ; i++) {
736        if (((volumeInc[i]>0) && (((prevVolume[i]+volumeInc[i])>>16) >= volume[i])) ||
737            ((volumeInc[i]<0) && (((prevVolume[i]+volumeInc[i])>>16) <= volume[i]))) {
738            volumeInc[i] = 0;
739            prevVolume[i] = volume[i]<<16;
740        }
741    }
742    if (aux) {
743        if (((auxInc>0) && (((prevAuxLevel+auxInc)>>16) >= auxLevel)) ||
744            ((auxInc<0) && (((prevAuxLevel+auxInc)>>16) <= auxLevel))) {
745            auxInc = 0;
746            prevAuxLevel = auxLevel<<16;
747        }
748    }
749}
750
751size_t AudioMixer::getUnreleasedFrames(int name) const
752{
753    name -= TRACK0;
754    if (uint32_t(name) < MAX_NUM_TRACKS) {
755        return mState.tracks[name].getUnreleasedFrames();
756    }
757    return 0;
758}
759
760void AudioMixer::setBufferProvider(int name, AudioBufferProvider* bufferProvider)
761{
762    name -= TRACK0;
763    ALOG_ASSERT(uint32_t(name) < MAX_NUM_TRACKS, "bad track name %d", name);
764
765    if (mState.tracks[name].mInputBufferProvider == bufferProvider) {
766        return; // don't reset any buffer providers if identical.
767    }
768    if (mState.tracks[name].mReformatBufferProvider != NULL) {
769        mState.tracks[name].mReformatBufferProvider->reset();
770    } else if (mState.tracks[name].downmixerBufferProvider != NULL) {
771    }
772
773    mState.tracks[name].mInputBufferProvider = bufferProvider;
774    reconfigureBufferProviders(&mState.tracks[name]);
775}
776
777
778void AudioMixer::process(int64_t pts)
779{
780    mState.hook(&mState, pts);
781}
782
783
784void AudioMixer::process__validate(state_t* state, int64_t pts)
785{
786    ALOGW_IF(!state->needsChanged,
787        "in process__validate() but nothing's invalid");
788
789    uint32_t changed = state->needsChanged;
790    state->needsChanged = 0; // clear the validation flag
791
792    // recompute which tracks are enabled / disabled
793    uint32_t enabled = 0;
794    uint32_t disabled = 0;
795    while (changed) {
796        const int i = 31 - __builtin_clz(changed);
797        const uint32_t mask = 1<<i;
798        changed &= ~mask;
799        track_t& t = state->tracks[i];
800        (t.enabled ? enabled : disabled) |= mask;
801    }
802    state->enabledTracks &= ~disabled;
803    state->enabledTracks |=  enabled;
804
805    // compute everything we need...
806    int countActiveTracks = 0;
807    bool all16BitsStereoNoResample = true;
808    bool resampling = false;
809    bool volumeRamp = false;
810    uint32_t en = state->enabledTracks;
811    while (en) {
812        const int i = 31 - __builtin_clz(en);
813        en &= ~(1<<i);
814
815        countActiveTracks++;
816        track_t& t = state->tracks[i];
817        uint32_t n = 0;
818        // FIXME can overflow (mask is only 3 bits)
819        n |= NEEDS_CHANNEL_1 + t.channelCount - 1;
820        if (t.doesResample()) {
821            n |= NEEDS_RESAMPLE;
822        }
823        if (t.auxLevel != 0 && t.auxBuffer != NULL) {
824            n |= NEEDS_AUX;
825        }
826
827        if (t.volumeInc[0]|t.volumeInc[1]) {
828            volumeRamp = true;
829        } else if (!t.doesResample() && t.volumeRL == 0) {
830            n |= NEEDS_MUTE;
831        }
832        t.needs = n;
833
834        if (n & NEEDS_MUTE) {
835            t.hook = track__nop;
836        } else {
837            if (n & NEEDS_AUX) {
838                all16BitsStereoNoResample = false;
839            }
840            if (n & NEEDS_RESAMPLE) {
841                all16BitsStereoNoResample = false;
842                resampling = true;
843                t.hook = track__genericResample;
844                ALOGV_IF((n & NEEDS_CHANNEL_COUNT__MASK) > NEEDS_CHANNEL_2,
845                        "Track %d needs downmix + resample", i);
846            } else {
847                if ((n & NEEDS_CHANNEL_COUNT__MASK) == NEEDS_CHANNEL_1){
848                    t.hook = track__16BitsMono;
849                    all16BitsStereoNoResample = false;
850                }
851                if ((n & NEEDS_CHANNEL_COUNT__MASK) >= NEEDS_CHANNEL_2){
852                    t.hook = track__16BitsStereo;
853                    ALOGV_IF((n & NEEDS_CHANNEL_COUNT__MASK) > NEEDS_CHANNEL_2,
854                            "Track %d needs downmix", i);
855                }
856            }
857        }
858    }
859
860    // select the processing hooks
861    state->hook = process__nop;
862    if (countActiveTracks > 0) {
863        if (resampling) {
864            if (!state->outputTemp) {
865                state->outputTemp = new int32_t[MAX_NUM_CHANNELS * state->frameCount];
866            }
867            if (!state->resampleTemp) {
868                state->resampleTemp = new int32_t[MAX_NUM_CHANNELS * state->frameCount];
869            }
870            state->hook = process__genericResampling;
871        } else {
872            if (state->outputTemp) {
873                delete [] state->outputTemp;
874                state->outputTemp = NULL;
875            }
876            if (state->resampleTemp) {
877                delete [] state->resampleTemp;
878                state->resampleTemp = NULL;
879            }
880            state->hook = process__genericNoResampling;
881            if (all16BitsStereoNoResample && !volumeRamp) {
882                if (countActiveTracks == 1) {
883                    state->hook = process__OneTrack16BitsStereoNoResampling;
884                }
885            }
886        }
887    }
888
889    ALOGV("mixer configuration change: %d activeTracks (%08x) "
890        "all16BitsStereoNoResample=%d, resampling=%d, volumeRamp=%d",
891        countActiveTracks, state->enabledTracks,
892        all16BitsStereoNoResample, resampling, volumeRamp);
893
894   state->hook(state, pts);
895
896    // Now that the volume ramp has been done, set optimal state and
897    // track hooks for subsequent mixer process
898    if (countActiveTracks > 0) {
899        bool allMuted = true;
900        uint32_t en = state->enabledTracks;
901        while (en) {
902            const int i = 31 - __builtin_clz(en);
903            en &= ~(1<<i);
904            track_t& t = state->tracks[i];
905            if (!t.doesResample() && t.volumeRL == 0) {
906                t.needs |= NEEDS_MUTE;
907                t.hook = track__nop;
908            } else {
909                allMuted = false;
910            }
911        }
912        if (allMuted) {
913            state->hook = process__nop;
914        } else if (all16BitsStereoNoResample) {
915            if (countActiveTracks == 1) {
916                state->hook = process__OneTrack16BitsStereoNoResampling;
917            }
918        }
919    }
920}
921
922
923void AudioMixer::track__genericResample(track_t* t, int32_t* out, size_t outFrameCount,
924        int32_t* temp, int32_t* aux)
925{
926    t->resampler->setSampleRate(t->sampleRate);
927
928    // ramp gain - resample to temp buffer and scale/mix in 2nd step
929    if (aux != NULL) {
930        // always resample with unity gain when sending to auxiliary buffer to be able
931        // to apply send level after resampling
932        // TODO: modify each resampler to support aux channel?
933        t->resampler->setVolume(UNITY_GAIN, UNITY_GAIN);
934        memset(temp, 0, outFrameCount * MAX_NUM_CHANNELS * sizeof(int32_t));
935        t->resampler->resample(temp, outFrameCount, t->bufferProvider);
936        if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc)) {
937            volumeRampStereo(t, out, outFrameCount, temp, aux);
938        } else {
939            volumeStereo(t, out, outFrameCount, temp, aux);
940        }
941    } else {
942        if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1])) {
943            t->resampler->setVolume(UNITY_GAIN, UNITY_GAIN);
944            memset(temp, 0, outFrameCount * MAX_NUM_CHANNELS * sizeof(int32_t));
945            t->resampler->resample(temp, outFrameCount, t->bufferProvider);
946            volumeRampStereo(t, out, outFrameCount, temp, aux);
947        }
948
949        // constant gain
950        else {
951            t->resampler->setVolume(t->volume[0], t->volume[1]);
952            t->resampler->resample(out, outFrameCount, t->bufferProvider);
953        }
954    }
955}
956
957void AudioMixer::track__nop(track_t* t __unused, int32_t* out __unused,
958        size_t outFrameCount __unused, int32_t* temp __unused, int32_t* aux __unused)
959{
960}
961
962void AudioMixer::volumeRampStereo(track_t* t, int32_t* out, size_t frameCount, int32_t* temp,
963        int32_t* aux)
964{
965    int32_t vl = t->prevVolume[0];
966    int32_t vr = t->prevVolume[1];
967    const int32_t vlInc = t->volumeInc[0];
968    const int32_t vrInc = t->volumeInc[1];
969
970    //ALOGD("[0] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
971    //        t, vlInc/65536.0f, vl/65536.0f, t->volume[0],
972    //       (vl + vlInc*frameCount)/65536.0f, frameCount);
973
974    // ramp volume
975    if (CC_UNLIKELY(aux != NULL)) {
976        int32_t va = t->prevAuxLevel;
977        const int32_t vaInc = t->auxInc;
978        int32_t l;
979        int32_t r;
980
981        do {
982            l = (*temp++ >> 12);
983            r = (*temp++ >> 12);
984            *out++ += (vl >> 16) * l;
985            *out++ += (vr >> 16) * r;
986            *aux++ += (va >> 17) * (l + r);
987            vl += vlInc;
988            vr += vrInc;
989            va += vaInc;
990        } while (--frameCount);
991        t->prevAuxLevel = va;
992    } else {
993        do {
994            *out++ += (vl >> 16) * (*temp++ >> 12);
995            *out++ += (vr >> 16) * (*temp++ >> 12);
996            vl += vlInc;
997            vr += vrInc;
998        } while (--frameCount);
999    }
1000    t->prevVolume[0] = vl;
1001    t->prevVolume[1] = vr;
1002    t->adjustVolumeRamp(aux != NULL);
1003}
1004
1005void AudioMixer::volumeStereo(track_t* t, int32_t* out, size_t frameCount, int32_t* temp,
1006        int32_t* aux)
1007{
1008    const int16_t vl = t->volume[0];
1009    const int16_t vr = t->volume[1];
1010
1011    if (CC_UNLIKELY(aux != NULL)) {
1012        const int16_t va = t->auxLevel;
1013        do {
1014            int16_t l = (int16_t)(*temp++ >> 12);
1015            int16_t r = (int16_t)(*temp++ >> 12);
1016            out[0] = mulAdd(l, vl, out[0]);
1017            int16_t a = (int16_t)(((int32_t)l + r) >> 1);
1018            out[1] = mulAdd(r, vr, out[1]);
1019            out += 2;
1020            aux[0] = mulAdd(a, va, aux[0]);
1021            aux++;
1022        } while (--frameCount);
1023    } else {
1024        do {
1025            int16_t l = (int16_t)(*temp++ >> 12);
1026            int16_t r = (int16_t)(*temp++ >> 12);
1027            out[0] = mulAdd(l, vl, out[0]);
1028            out[1] = mulAdd(r, vr, out[1]);
1029            out += 2;
1030        } while (--frameCount);
1031    }
1032}
1033
1034void AudioMixer::track__16BitsStereo(track_t* t, int32_t* out, size_t frameCount,
1035        int32_t* temp __unused, int32_t* aux)
1036{
1037    const int16_t *in = static_cast<const int16_t *>(t->in);
1038
1039    if (CC_UNLIKELY(aux != NULL)) {
1040        int32_t l;
1041        int32_t r;
1042        // ramp gain
1043        if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc)) {
1044            int32_t vl = t->prevVolume[0];
1045            int32_t vr = t->prevVolume[1];
1046            int32_t va = t->prevAuxLevel;
1047            const int32_t vlInc = t->volumeInc[0];
1048            const int32_t vrInc = t->volumeInc[1];
1049            const int32_t vaInc = t->auxInc;
1050            // ALOGD("[1] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
1051            //        t, vlInc/65536.0f, vl/65536.0f, t->volume[0],
1052            //        (vl + vlInc*frameCount)/65536.0f, frameCount);
1053
1054            do {
1055                l = (int32_t)*in++;
1056                r = (int32_t)*in++;
1057                *out++ += (vl >> 16) * l;
1058                *out++ += (vr >> 16) * r;
1059                *aux++ += (va >> 17) * (l + r);
1060                vl += vlInc;
1061                vr += vrInc;
1062                va += vaInc;
1063            } while (--frameCount);
1064
1065            t->prevVolume[0] = vl;
1066            t->prevVolume[1] = vr;
1067            t->prevAuxLevel = va;
1068            t->adjustVolumeRamp(true);
1069        }
1070
1071        // constant gain
1072        else {
1073            const uint32_t vrl = t->volumeRL;
1074            const int16_t va = (int16_t)t->auxLevel;
1075            do {
1076                uint32_t rl = *reinterpret_cast<const uint32_t *>(in);
1077                int16_t a = (int16_t)(((int32_t)in[0] + in[1]) >> 1);
1078                in += 2;
1079                out[0] = mulAddRL(1, rl, vrl, out[0]);
1080                out[1] = mulAddRL(0, rl, vrl, out[1]);
1081                out += 2;
1082                aux[0] = mulAdd(a, va, aux[0]);
1083                aux++;
1084            } while (--frameCount);
1085        }
1086    } else {
1087        // ramp gain
1088        if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1])) {
1089            int32_t vl = t->prevVolume[0];
1090            int32_t vr = t->prevVolume[1];
1091            const int32_t vlInc = t->volumeInc[0];
1092            const int32_t vrInc = t->volumeInc[1];
1093
1094            // ALOGD("[1] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
1095            //        t, vlInc/65536.0f, vl/65536.0f, t->volume[0],
1096            //        (vl + vlInc*frameCount)/65536.0f, frameCount);
1097
1098            do {
1099                *out++ += (vl >> 16) * (int32_t) *in++;
1100                *out++ += (vr >> 16) * (int32_t) *in++;
1101                vl += vlInc;
1102                vr += vrInc;
1103            } while (--frameCount);
1104
1105            t->prevVolume[0] = vl;
1106            t->prevVolume[1] = vr;
1107            t->adjustVolumeRamp(false);
1108        }
1109
1110        // constant gain
1111        else {
1112            const uint32_t vrl = t->volumeRL;
1113            do {
1114                uint32_t rl = *reinterpret_cast<const uint32_t *>(in);
1115                in += 2;
1116                out[0] = mulAddRL(1, rl, vrl, out[0]);
1117                out[1] = mulAddRL(0, rl, vrl, out[1]);
1118                out += 2;
1119            } while (--frameCount);
1120        }
1121    }
1122    t->in = in;
1123}
1124
1125void AudioMixer::track__16BitsMono(track_t* t, int32_t* out, size_t frameCount,
1126        int32_t* temp __unused, int32_t* aux)
1127{
1128    const int16_t *in = static_cast<int16_t const *>(t->in);
1129
1130    if (CC_UNLIKELY(aux != NULL)) {
1131        // ramp gain
1132        if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1]|t->auxInc)) {
1133            int32_t vl = t->prevVolume[0];
1134            int32_t vr = t->prevVolume[1];
1135            int32_t va = t->prevAuxLevel;
1136            const int32_t vlInc = t->volumeInc[0];
1137            const int32_t vrInc = t->volumeInc[1];
1138            const int32_t vaInc = t->auxInc;
1139
1140            // ALOGD("[2] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
1141            //         t, vlInc/65536.0f, vl/65536.0f, t->volume[0],
1142            //         (vl + vlInc*frameCount)/65536.0f, frameCount);
1143
1144            do {
1145                int32_t l = *in++;
1146                *out++ += (vl >> 16) * l;
1147                *out++ += (vr >> 16) * l;
1148                *aux++ += (va >> 16) * l;
1149                vl += vlInc;
1150                vr += vrInc;
1151                va += vaInc;
1152            } while (--frameCount);
1153
1154            t->prevVolume[0] = vl;
1155            t->prevVolume[1] = vr;
1156            t->prevAuxLevel = va;
1157            t->adjustVolumeRamp(true);
1158        }
1159        // constant gain
1160        else {
1161            const int16_t vl = t->volume[0];
1162            const int16_t vr = t->volume[1];
1163            const int16_t va = (int16_t)t->auxLevel;
1164            do {
1165                int16_t l = *in++;
1166                out[0] = mulAdd(l, vl, out[0]);
1167                out[1] = mulAdd(l, vr, out[1]);
1168                out += 2;
1169                aux[0] = mulAdd(l, va, aux[0]);
1170                aux++;
1171            } while (--frameCount);
1172        }
1173    } else {
1174        // ramp gain
1175        if (CC_UNLIKELY(t->volumeInc[0]|t->volumeInc[1])) {
1176            int32_t vl = t->prevVolume[0];
1177            int32_t vr = t->prevVolume[1];
1178            const int32_t vlInc = t->volumeInc[0];
1179            const int32_t vrInc = t->volumeInc[1];
1180
1181            // ALOGD("[2] %p: inc=%f, v0=%f, v1=%d, final=%f, count=%d",
1182            //         t, vlInc/65536.0f, vl/65536.0f, t->volume[0],
1183            //         (vl + vlInc*frameCount)/65536.0f, frameCount);
1184
1185            do {
1186                int32_t l = *in++;
1187                *out++ += (vl >> 16) * l;
1188                *out++ += (vr >> 16) * l;
1189                vl += vlInc;
1190                vr += vrInc;
1191            } while (--frameCount);
1192
1193            t->prevVolume[0] = vl;
1194            t->prevVolume[1] = vr;
1195            t->adjustVolumeRamp(false);
1196        }
1197        // constant gain
1198        else {
1199            const int16_t vl = t->volume[0];
1200            const int16_t vr = t->volume[1];
1201            do {
1202                int16_t l = *in++;
1203                out[0] = mulAdd(l, vl, out[0]);
1204                out[1] = mulAdd(l, vr, out[1]);
1205                out += 2;
1206            } while (--frameCount);
1207        }
1208    }
1209    t->in = in;
1210}
1211
1212// no-op case
1213void AudioMixer::process__nop(state_t* state, int64_t pts)
1214{
1215    uint32_t e0 = state->enabledTracks;
1216    size_t sampleCount = state->frameCount * MAX_NUM_CHANNELS;
1217    while (e0) {
1218        // process by group of tracks with same output buffer to
1219        // avoid multiple memset() on same buffer
1220        uint32_t e1 = e0, e2 = e0;
1221        int i = 31 - __builtin_clz(e1);
1222        {
1223            track_t& t1 = state->tracks[i];
1224            e2 &= ~(1<<i);
1225            while (e2) {
1226                i = 31 - __builtin_clz(e2);
1227                e2 &= ~(1<<i);
1228                track_t& t2 = state->tracks[i];
1229                if (CC_UNLIKELY(t2.mainBuffer != t1.mainBuffer)) {
1230                    e1 &= ~(1<<i);
1231                }
1232            }
1233            e0 &= ~(e1);
1234
1235            memset(t1.mainBuffer, 0, sampleCount
1236                    * audio_bytes_per_sample(t1.mMixerFormat));
1237        }
1238
1239        while (e1) {
1240            i = 31 - __builtin_clz(e1);
1241            e1 &= ~(1<<i);
1242            {
1243                track_t& t3 = state->tracks[i];
1244                size_t outFrames = state->frameCount;
1245                while (outFrames) {
1246                    t3.buffer.frameCount = outFrames;
1247                    int64_t outputPTS = calculateOutputPTS(
1248                        t3, pts, state->frameCount - outFrames);
1249                    t3.bufferProvider->getNextBuffer(&t3.buffer, outputPTS);
1250                    if (t3.buffer.raw == NULL) break;
1251                    outFrames -= t3.buffer.frameCount;
1252                    t3.bufferProvider->releaseBuffer(&t3.buffer);
1253                }
1254            }
1255        }
1256    }
1257}
1258
1259// generic code without resampling
1260void AudioMixer::process__genericNoResampling(state_t* state, int64_t pts)
1261{
1262    int32_t outTemp[BLOCKSIZE * MAX_NUM_CHANNELS] __attribute__((aligned(32)));
1263
1264    // acquire each track's buffer
1265    uint32_t enabledTracks = state->enabledTracks;
1266    uint32_t e0 = enabledTracks;
1267    while (e0) {
1268        const int i = 31 - __builtin_clz(e0);
1269        e0 &= ~(1<<i);
1270        track_t& t = state->tracks[i];
1271        t.buffer.frameCount = state->frameCount;
1272        t.bufferProvider->getNextBuffer(&t.buffer, pts);
1273        t.frameCount = t.buffer.frameCount;
1274        t.in = t.buffer.raw;
1275    }
1276
1277    e0 = enabledTracks;
1278    while (e0) {
1279        // process by group of tracks with same output buffer to
1280        // optimize cache use
1281        uint32_t e1 = e0, e2 = e0;
1282        int j = 31 - __builtin_clz(e1);
1283        track_t& t1 = state->tracks[j];
1284        e2 &= ~(1<<j);
1285        while (e2) {
1286            j = 31 - __builtin_clz(e2);
1287            e2 &= ~(1<<j);
1288            track_t& t2 = state->tracks[j];
1289            if (CC_UNLIKELY(t2.mainBuffer != t1.mainBuffer)) {
1290                e1 &= ~(1<<j);
1291            }
1292        }
1293        e0 &= ~(e1);
1294        // this assumes output 16 bits stereo, no resampling
1295        int32_t *out = t1.mainBuffer;
1296        size_t numFrames = 0;
1297        do {
1298            memset(outTemp, 0, sizeof(outTemp));
1299            e2 = e1;
1300            while (e2) {
1301                const int i = 31 - __builtin_clz(e2);
1302                e2 &= ~(1<<i);
1303                track_t& t = state->tracks[i];
1304                size_t outFrames = BLOCKSIZE;
1305                int32_t *aux = NULL;
1306                if (CC_UNLIKELY(t.needs & NEEDS_AUX)) {
1307                    aux = t.auxBuffer + numFrames;
1308                }
1309                while (outFrames) {
1310                    // t.in == NULL can happen if the track was flushed just after having
1311                    // been enabled for mixing.
1312                   if (t.in == NULL) {
1313                        enabledTracks &= ~(1<<i);
1314                        e1 &= ~(1<<i);
1315                        break;
1316                    }
1317                    size_t inFrames = (t.frameCount > outFrames)?outFrames:t.frameCount;
1318                    if (inFrames > 0) {
1319                        t.hook(&t, outTemp + (BLOCKSIZE-outFrames)*MAX_NUM_CHANNELS, inFrames,
1320                                state->resampleTemp, aux);
1321                        t.frameCount -= inFrames;
1322                        outFrames -= inFrames;
1323                        if (CC_UNLIKELY(aux != NULL)) {
1324                            aux += inFrames;
1325                        }
1326                    }
1327                    if (t.frameCount == 0 && outFrames) {
1328                        t.bufferProvider->releaseBuffer(&t.buffer);
1329                        t.buffer.frameCount = (state->frameCount - numFrames) -
1330                                (BLOCKSIZE - outFrames);
1331                        int64_t outputPTS = calculateOutputPTS(
1332                            t, pts, numFrames + (BLOCKSIZE - outFrames));
1333                        t.bufferProvider->getNextBuffer(&t.buffer, outputPTS);
1334                        t.in = t.buffer.raw;
1335                        if (t.in == NULL) {
1336                            enabledTracks &= ~(1<<i);
1337                            e1 &= ~(1<<i);
1338                            break;
1339                        }
1340                        t.frameCount = t.buffer.frameCount;
1341                    }
1342                }
1343            }
1344            switch (t1.mMixerFormat) {
1345            case AUDIO_FORMAT_PCM_FLOAT:
1346                memcpy_to_float_from_q4_27(reinterpret_cast<float *>(out), outTemp, BLOCKSIZE * 2);
1347                out += BLOCKSIZE * 2; // output is 2 floats/frame.
1348                break;
1349            case AUDIO_FORMAT_PCM_16_BIT:
1350                ditherAndClamp(out, outTemp, BLOCKSIZE);
1351                out += BLOCKSIZE; // output is 1 int32_t (2 int16_t samples)/frame
1352                break;
1353            default:
1354                LOG_ALWAYS_FATAL("bad mixer format: %d", t1.mMixerFormat);
1355            }
1356            numFrames += BLOCKSIZE;
1357        } while (numFrames < state->frameCount);
1358    }
1359
1360    // release each track's buffer
1361    e0 = enabledTracks;
1362    while (e0) {
1363        const int i = 31 - __builtin_clz(e0);
1364        e0 &= ~(1<<i);
1365        track_t& t = state->tracks[i];
1366        t.bufferProvider->releaseBuffer(&t.buffer);
1367    }
1368}
1369
1370
1371// generic code with resampling
1372void AudioMixer::process__genericResampling(state_t* state, int64_t pts)
1373{
1374    // this const just means that local variable outTemp doesn't change
1375    int32_t* const outTemp = state->outputTemp;
1376    const size_t size = sizeof(int32_t) * MAX_NUM_CHANNELS * state->frameCount;
1377
1378    size_t numFrames = state->frameCount;
1379
1380    uint32_t e0 = state->enabledTracks;
1381    while (e0) {
1382        // process by group of tracks with same output buffer
1383        // to optimize cache use
1384        uint32_t e1 = e0, e2 = e0;
1385        int j = 31 - __builtin_clz(e1);
1386        track_t& t1 = state->tracks[j];
1387        e2 &= ~(1<<j);
1388        while (e2) {
1389            j = 31 - __builtin_clz(e2);
1390            e2 &= ~(1<<j);
1391            track_t& t2 = state->tracks[j];
1392            if (CC_UNLIKELY(t2.mainBuffer != t1.mainBuffer)) {
1393                e1 &= ~(1<<j);
1394            }
1395        }
1396        e0 &= ~(e1);
1397        int32_t *out = t1.mainBuffer;
1398        memset(outTemp, 0, size);
1399        while (e1) {
1400            const int i = 31 - __builtin_clz(e1);
1401            e1 &= ~(1<<i);
1402            track_t& t = state->tracks[i];
1403            int32_t *aux = NULL;
1404            if (CC_UNLIKELY(t.needs & NEEDS_AUX)) {
1405                aux = t.auxBuffer;
1406            }
1407
1408            // this is a little goofy, on the resampling case we don't
1409            // acquire/release the buffers because it's done by
1410            // the resampler.
1411            if (t.needs & NEEDS_RESAMPLE) {
1412                t.resampler->setPTS(pts);
1413                t.hook(&t, outTemp, numFrames, state->resampleTemp, aux);
1414            } else {
1415
1416                size_t outFrames = 0;
1417
1418                while (outFrames < numFrames) {
1419                    t.buffer.frameCount = numFrames - outFrames;
1420                    int64_t outputPTS = calculateOutputPTS(t, pts, outFrames);
1421                    t.bufferProvider->getNextBuffer(&t.buffer, outputPTS);
1422                    t.in = t.buffer.raw;
1423                    // t.in == NULL can happen if the track was flushed just after having
1424                    // been enabled for mixing.
1425                    if (t.in == NULL) break;
1426
1427                    if (CC_UNLIKELY(aux != NULL)) {
1428                        aux += outFrames;
1429                    }
1430                    t.hook(&t, outTemp + outFrames*MAX_NUM_CHANNELS, t.buffer.frameCount,
1431                            state->resampleTemp, aux);
1432                    outFrames += t.buffer.frameCount;
1433                    t.bufferProvider->releaseBuffer(&t.buffer);
1434                }
1435            }
1436        }
1437        switch (t1.mMixerFormat) {
1438        case AUDIO_FORMAT_PCM_FLOAT:
1439            memcpy_to_float_from_q4_27(reinterpret_cast<float*>(out), outTemp, numFrames*2);
1440            break;
1441        case AUDIO_FORMAT_PCM_16_BIT:
1442            ditherAndClamp(out, outTemp, numFrames);
1443            break;
1444        default:
1445            LOG_ALWAYS_FATAL("bad mixer format: %d", t1.mMixerFormat);
1446        }
1447    }
1448}
1449
1450// one track, 16 bits stereo without resampling is the most common case
1451void AudioMixer::process__OneTrack16BitsStereoNoResampling(state_t* state,
1452                                                           int64_t pts)
1453{
1454    // This method is only called when state->enabledTracks has exactly
1455    // one bit set.  The asserts below would verify this, but are commented out
1456    // since the whole point of this method is to optimize performance.
1457    //ALOG_ASSERT(0 != state->enabledTracks, "no tracks enabled");
1458    const int i = 31 - __builtin_clz(state->enabledTracks);
1459    //ALOG_ASSERT((1 << i) == state->enabledTracks, "more than 1 track enabled");
1460    const track_t& t = state->tracks[i];
1461
1462    AudioBufferProvider::Buffer& b(t.buffer);
1463
1464    int32_t* out = t.mainBuffer;
1465    float *fout = reinterpret_cast<float*>(out);
1466    size_t numFrames = state->frameCount;
1467
1468    const int16_t vl = t.volume[0];
1469    const int16_t vr = t.volume[1];
1470    const uint32_t vrl = t.volumeRL;
1471    while (numFrames) {
1472        b.frameCount = numFrames;
1473        int64_t outputPTS = calculateOutputPTS(t, pts, out - t.mainBuffer);
1474        t.bufferProvider->getNextBuffer(&b, outputPTS);
1475        const int16_t *in = b.i16;
1476
1477        // in == NULL can happen if the track was flushed just after having
1478        // been enabled for mixing.
1479        if (in == NULL || (((uintptr_t)in) & 3)) {
1480            memset(out, 0, numFrames
1481                    * MAX_NUM_CHANNELS * audio_bytes_per_sample(t.mMixerFormat));
1482            ALOGE_IF((((uintptr_t)in) & 3), "process stereo track: input buffer alignment pb: "
1483                                              "buffer %p track %d, channels %d, needs %08x",
1484                    in, i, t.channelCount, t.needs);
1485            return;
1486        }
1487        size_t outFrames = b.frameCount;
1488
1489        switch (t.mMixerFormat) {
1490        case AUDIO_FORMAT_PCM_FLOAT:
1491            do {
1492                uint32_t rl = *reinterpret_cast<const uint32_t *>(in);
1493                in += 2;
1494                int32_t l = mulRL(1, rl, vrl);
1495                int32_t r = mulRL(0, rl, vrl);
1496                *fout++ = float_from_q4_27(l);
1497                *fout++ = float_from_q4_27(r);
1498                // Note: In case of later int16_t sink output,
1499                // conversion and clamping is done by memcpy_to_i16_from_float().
1500            } while (--outFrames);
1501            break;
1502        case AUDIO_FORMAT_PCM_16_BIT:
1503            if (CC_UNLIKELY(uint32_t(vl) > UNITY_GAIN || uint32_t(vr) > UNITY_GAIN)) {
1504                // volume is boosted, so we might need to clamp even though
1505                // we process only one track.
1506                do {
1507                    uint32_t rl = *reinterpret_cast<const uint32_t *>(in);
1508                    in += 2;
1509                    int32_t l = mulRL(1, rl, vrl) >> 12;
1510                    int32_t r = mulRL(0, rl, vrl) >> 12;
1511                    // clamping...
1512                    l = clamp16(l);
1513                    r = clamp16(r);
1514                    *out++ = (r<<16) | (l & 0xFFFF);
1515                } while (--outFrames);
1516            } else {
1517                do {
1518                    uint32_t rl = *reinterpret_cast<const uint32_t *>(in);
1519                    in += 2;
1520                    int32_t l = mulRL(1, rl, vrl) >> 12;
1521                    int32_t r = mulRL(0, rl, vrl) >> 12;
1522                    *out++ = (r<<16) | (l & 0xFFFF);
1523                } while (--outFrames);
1524            }
1525            break;
1526        default:
1527            LOG_ALWAYS_FATAL("bad mixer format: %d", t.mMixerFormat);
1528        }
1529        numFrames -= b.frameCount;
1530        t.bufferProvider->releaseBuffer(&b);
1531    }
1532}
1533
1534#if 0
1535// 2 tracks is also a common case
1536// NEVER used in current implementation of process__validate()
1537// only use if the 2 tracks have the same output buffer
1538void AudioMixer::process__TwoTracks16BitsStereoNoResampling(state_t* state,
1539                                                            int64_t pts)
1540{
1541    int i;
1542    uint32_t en = state->enabledTracks;
1543
1544    i = 31 - __builtin_clz(en);
1545    const track_t& t0 = state->tracks[i];
1546    AudioBufferProvider::Buffer& b0(t0.buffer);
1547
1548    en &= ~(1<<i);
1549    i = 31 - __builtin_clz(en);
1550    const track_t& t1 = state->tracks[i];
1551    AudioBufferProvider::Buffer& b1(t1.buffer);
1552
1553    const int16_t *in0;
1554    const int16_t vl0 = t0.volume[0];
1555    const int16_t vr0 = t0.volume[1];
1556    size_t frameCount0 = 0;
1557
1558    const int16_t *in1;
1559    const int16_t vl1 = t1.volume[0];
1560    const int16_t vr1 = t1.volume[1];
1561    size_t frameCount1 = 0;
1562
1563    //FIXME: only works if two tracks use same buffer
1564    int32_t* out = t0.mainBuffer;
1565    size_t numFrames = state->frameCount;
1566    const int16_t *buff = NULL;
1567
1568
1569    while (numFrames) {
1570
1571        if (frameCount0 == 0) {
1572            b0.frameCount = numFrames;
1573            int64_t outputPTS = calculateOutputPTS(t0, pts,
1574                                                   out - t0.mainBuffer);
1575            t0.bufferProvider->getNextBuffer(&b0, outputPTS);
1576            if (b0.i16 == NULL) {
1577                if (buff == NULL) {
1578                    buff = new int16_t[MAX_NUM_CHANNELS * state->frameCount];
1579                }
1580                in0 = buff;
1581                b0.frameCount = numFrames;
1582            } else {
1583                in0 = b0.i16;
1584            }
1585            frameCount0 = b0.frameCount;
1586        }
1587        if (frameCount1 == 0) {
1588            b1.frameCount = numFrames;
1589            int64_t outputPTS = calculateOutputPTS(t1, pts,
1590                                                   out - t0.mainBuffer);
1591            t1.bufferProvider->getNextBuffer(&b1, outputPTS);
1592            if (b1.i16 == NULL) {
1593                if (buff == NULL) {
1594                    buff = new int16_t[MAX_NUM_CHANNELS * state->frameCount];
1595                }
1596                in1 = buff;
1597                b1.frameCount = numFrames;
1598            } else {
1599                in1 = b1.i16;
1600            }
1601            frameCount1 = b1.frameCount;
1602        }
1603
1604        size_t outFrames = frameCount0 < frameCount1?frameCount0:frameCount1;
1605
1606        numFrames -= outFrames;
1607        frameCount0 -= outFrames;
1608        frameCount1 -= outFrames;
1609
1610        do {
1611            int32_t l0 = *in0++;
1612            int32_t r0 = *in0++;
1613            l0 = mul(l0, vl0);
1614            r0 = mul(r0, vr0);
1615            int32_t l = *in1++;
1616            int32_t r = *in1++;
1617            l = mulAdd(l, vl1, l0) >> 12;
1618            r = mulAdd(r, vr1, r0) >> 12;
1619            // clamping...
1620            l = clamp16(l);
1621            r = clamp16(r);
1622            *out++ = (r<<16) | (l & 0xFFFF);
1623        } while (--outFrames);
1624
1625        if (frameCount0 == 0) {
1626            t0.bufferProvider->releaseBuffer(&b0);
1627        }
1628        if (frameCount1 == 0) {
1629            t1.bufferProvider->releaseBuffer(&b1);
1630        }
1631    }
1632
1633    delete [] buff;
1634}
1635#endif
1636
1637int64_t AudioMixer::calculateOutputPTS(const track_t& t, int64_t basePTS,
1638                                       int outputFrameIndex)
1639{
1640    if (AudioBufferProvider::kInvalidPTS == basePTS) {
1641        return AudioBufferProvider::kInvalidPTS;
1642    }
1643
1644    return basePTS + ((outputFrameIndex * sLocalTimeFreq) / t.sampleRate);
1645}
1646
1647/*static*/ uint64_t AudioMixer::sLocalTimeFreq;
1648/*static*/ pthread_once_t AudioMixer::sOnceControl = PTHREAD_ONCE_INIT;
1649
1650/*static*/ void AudioMixer::sInitRoutine()
1651{
1652    LocalClock lc;
1653    sLocalTimeFreq = lc.getLocalFreq();
1654
1655    // find multichannel downmix effect if we have to play multichannel content
1656    uint32_t numEffects = 0;
1657    int ret = EffectQueryNumberEffects(&numEffects);
1658    if (ret != 0) {
1659        ALOGE("AudioMixer() error %d querying number of effects", ret);
1660        return;
1661    }
1662    ALOGV("EffectQueryNumberEffects() numEffects=%d", numEffects);
1663
1664    for (uint32_t i = 0 ; i < numEffects ; i++) {
1665        if (EffectQueryEffect(i, &sDwnmFxDesc) == 0) {
1666            ALOGV("effect %d is called %s", i, sDwnmFxDesc.name);
1667            if (memcmp(&sDwnmFxDesc.type, EFFECT_UIID_DOWNMIX, sizeof(effect_uuid_t)) == 0) {
1668                ALOGI("found effect \"%s\" from %s",
1669                        sDwnmFxDesc.name, sDwnmFxDesc.implementor);
1670                sIsMultichannelCapable = true;
1671                break;
1672            }
1673        }
1674    }
1675    ALOGW_IF(!sIsMultichannelCapable, "unable to find downmix effect");
1676}
1677
1678// ----------------------------------------------------------------------------
1679}; // namespace android
1680