Loading services/audioflinger/AudioFlinger.cpp +9 −13 Original line number Original line Diff line number Diff line Loading @@ -2295,7 +2295,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac uint16_t sendLevel = cblk->getSendLevel_U4_12(); uint16_t sendLevel = cblk->getSendLevel_U4_12(); // send level comes from shared memory and so may be corrupt // send level comes from shared memory and so may be corrupt if (sendLevel >= MAX_GAIN_INT) { if (sendLevel > MAX_GAIN_INT) { ALOGV("Track send level out of range: %04X", sendLevel); ALOGV("Track send level out of range: %04X", sendLevel); sendLevel = MAX_GAIN_INT; sendLevel = MAX_GAIN_INT; } } Loading @@ -2316,25 +2316,21 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac } } // Convert volumes from 8.24 to 4.12 format // Convert volumes from 8.24 to 4.12 format int16_t left, right, aux; // This additional clamping is needed in case chain->setVolume_l() overshot // This additional clamping is needed in case chain->setVolume_l() overshot uint32_t v_clamped = (vl + (1 << 11)) >> 12; vl = (vl + (1 << 11)) >> 12; if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT; if (vl > MAX_GAIN_INT) vl = MAX_GAIN_INT; left = int16_t(v_clamped); vr = (vr + (1 << 11)) >> 12; v_clamped = (vr + (1 << 11)) >> 12; if (vr > MAX_GAIN_INT) vr = MAX_GAIN_INT; if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT; right = int16_t(v_clamped); if (va > MAX_GAIN_INT) va = MAX_GAIN_INT; if (va > MAX_GAIN_INT) va = MAX_GAIN_INT; // va is uint32_t, so no need to check for - aux = int16_t(va); // XXX: these things DON'T need to be done each time // XXX: these things DON'T need to be done each time mAudioMixer->setBufferProvider(name, track); mAudioMixer->setBufferProvider(name, track); mAudioMixer->enable(name); mAudioMixer->enable(name); mAudioMixer->setParameter(name, param, AudioMixer::VOLUME0, (void *)left); mAudioMixer->setParameter(name, param, AudioMixer::VOLUME0, (void *)vl); mAudioMixer->setParameter(name, param, AudioMixer::VOLUME1, (void *)right); mAudioMixer->setParameter(name, param, AudioMixer::VOLUME1, (void *)vr); mAudioMixer->setParameter(name, param, AudioMixer::AUXLEVEL, (void *)aux); mAudioMixer->setParameter(name, param, AudioMixer::AUXLEVEL, (void *)va); mAudioMixer->setParameter( mAudioMixer->setParameter( name, name, AudioMixer::TRACK, AudioMixer::TRACK, Loading services/audioflinger/AudioMixer.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -257,6 +257,7 @@ void AudioMixer::setParameter(int name, int target, int param, void *value) } } break; break; case AUXLEVEL: case AUXLEVEL: //assert(0 <= valueInt && valueInt <= MAX_GAIN_INT); if (track.auxLevel != valueInt) { if (track.auxLevel != valueInt) { ALOGV("setParameter(VOLUME, AUXLEVEL: %04x)", valueInt); ALOGV("setParameter(VOLUME, AUXLEVEL: %04x)", valueInt); track.prevAuxLevel = track.auxLevel << 16; track.prevAuxLevel = track.auxLevel << 16; Loading Loading @@ -565,7 +566,7 @@ void AudioMixer::volumeStereo(track_t* t, int32_t* out, size_t frameCount, int32 const int16_t vr = t->volume[1]; const int16_t vr = t->volume[1]; if (CC_UNLIKELY(aux != NULL)) { if (CC_UNLIKELY(aux != NULL)) { const int16_t va = (int16_t)t->auxLevel; const int16_t va = t->auxLevel; do { do { int16_t l = (int16_t)(*temp++ >> 12); int16_t l = (int16_t)(*temp++ >> 12); int16_t r = (int16_t)(*temp++ >> 12); int16_t r = (int16_t)(*temp++ >> 12); Loading services/audioflinger/AudioMixer.h +21 −7 Original line number Original line Diff line number Diff line Loading @@ -127,32 +127,46 @@ private: int32_t prevVolume[MAX_NUM_CHANNELS]; int32_t prevVolume[MAX_NUM_CHANNELS]; // 16-byte boundary int32_t volumeInc[MAX_NUM_CHANNELS]; int32_t volumeInc[MAX_NUM_CHANNELS]; int32_t auxLevel; int32_t auxInc; int32_t auxInc; int32_t prevAuxLevel; int32_t prevAuxLevel; // 16-byte boundary int16_t auxLevel; // 0 <= auxLevel <= MAX_GAIN_INT, but signed for mul performance uint16_t frameCount; uint16_t frameCount; uint8_t channelCount : 4; uint8_t channelCount; // 1 or 2, redundant with (needs & NEEDS_CHANNEL_COUNT__MASK) uint8_t enabled : 1; uint8_t format; // always 16 uint8_t reserved0 : 3; uint16_t enabled; // actually bool uint8_t format; uint32_t channelMask; // currently under-used uint32_t channelMask; AudioBufferProvider* bufferProvider; AudioBufferProvider* bufferProvider; mutable AudioBufferProvider::Buffer buffer; // 16-byte boundary mutable AudioBufferProvider::Buffer buffer; // 8 bytes hook_t hook; hook_t hook; const void* in; // current location in buffer const void* in; // current location in buffer // 16-byte boundary AudioResampler* resampler; AudioResampler* resampler; uint32_t sampleRate; uint32_t sampleRate; int32_t* mainBuffer; int32_t* mainBuffer; int32_t* auxBuffer; int32_t* auxBuffer; // 16-byte boundary uint64_t localTimeFreq; uint64_t localTimeFreq; int64_t padding; // 16-byte boundary bool setResampler(uint32_t sampleRate, uint32_t devSampleRate); bool setResampler(uint32_t sampleRate, uint32_t devSampleRate); bool doesResample() const { return resampler != NULL; } bool doesResample() const { return resampler != NULL; } void resetResampler() { if (resampler != NULL) resampler->reset(); } void resetResampler() { if (resampler != NULL) resampler->reset(); } Loading Loading
services/audioflinger/AudioFlinger.cpp +9 −13 Original line number Original line Diff line number Diff line Loading @@ -2295,7 +2295,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac uint16_t sendLevel = cblk->getSendLevel_U4_12(); uint16_t sendLevel = cblk->getSendLevel_U4_12(); // send level comes from shared memory and so may be corrupt // send level comes from shared memory and so may be corrupt if (sendLevel >= MAX_GAIN_INT) { if (sendLevel > MAX_GAIN_INT) { ALOGV("Track send level out of range: %04X", sendLevel); ALOGV("Track send level out of range: %04X", sendLevel); sendLevel = MAX_GAIN_INT; sendLevel = MAX_GAIN_INT; } } Loading @@ -2316,25 +2316,21 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac } } // Convert volumes from 8.24 to 4.12 format // Convert volumes from 8.24 to 4.12 format int16_t left, right, aux; // This additional clamping is needed in case chain->setVolume_l() overshot // This additional clamping is needed in case chain->setVolume_l() overshot uint32_t v_clamped = (vl + (1 << 11)) >> 12; vl = (vl + (1 << 11)) >> 12; if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT; if (vl > MAX_GAIN_INT) vl = MAX_GAIN_INT; left = int16_t(v_clamped); vr = (vr + (1 << 11)) >> 12; v_clamped = (vr + (1 << 11)) >> 12; if (vr > MAX_GAIN_INT) vr = MAX_GAIN_INT; if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT; right = int16_t(v_clamped); if (va > MAX_GAIN_INT) va = MAX_GAIN_INT; if (va > MAX_GAIN_INT) va = MAX_GAIN_INT; // va is uint32_t, so no need to check for - aux = int16_t(va); // XXX: these things DON'T need to be done each time // XXX: these things DON'T need to be done each time mAudioMixer->setBufferProvider(name, track); mAudioMixer->setBufferProvider(name, track); mAudioMixer->enable(name); mAudioMixer->enable(name); mAudioMixer->setParameter(name, param, AudioMixer::VOLUME0, (void *)left); mAudioMixer->setParameter(name, param, AudioMixer::VOLUME0, (void *)vl); mAudioMixer->setParameter(name, param, AudioMixer::VOLUME1, (void *)right); mAudioMixer->setParameter(name, param, AudioMixer::VOLUME1, (void *)vr); mAudioMixer->setParameter(name, param, AudioMixer::AUXLEVEL, (void *)aux); mAudioMixer->setParameter(name, param, AudioMixer::AUXLEVEL, (void *)va); mAudioMixer->setParameter( mAudioMixer->setParameter( name, name, AudioMixer::TRACK, AudioMixer::TRACK, Loading
services/audioflinger/AudioMixer.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -257,6 +257,7 @@ void AudioMixer::setParameter(int name, int target, int param, void *value) } } break; break; case AUXLEVEL: case AUXLEVEL: //assert(0 <= valueInt && valueInt <= MAX_GAIN_INT); if (track.auxLevel != valueInt) { if (track.auxLevel != valueInt) { ALOGV("setParameter(VOLUME, AUXLEVEL: %04x)", valueInt); ALOGV("setParameter(VOLUME, AUXLEVEL: %04x)", valueInt); track.prevAuxLevel = track.auxLevel << 16; track.prevAuxLevel = track.auxLevel << 16; Loading Loading @@ -565,7 +566,7 @@ void AudioMixer::volumeStereo(track_t* t, int32_t* out, size_t frameCount, int32 const int16_t vr = t->volume[1]; const int16_t vr = t->volume[1]; if (CC_UNLIKELY(aux != NULL)) { if (CC_UNLIKELY(aux != NULL)) { const int16_t va = (int16_t)t->auxLevel; const int16_t va = t->auxLevel; do { do { int16_t l = (int16_t)(*temp++ >> 12); int16_t l = (int16_t)(*temp++ >> 12); int16_t r = (int16_t)(*temp++ >> 12); int16_t r = (int16_t)(*temp++ >> 12); Loading
services/audioflinger/AudioMixer.h +21 −7 Original line number Original line Diff line number Diff line Loading @@ -127,32 +127,46 @@ private: int32_t prevVolume[MAX_NUM_CHANNELS]; int32_t prevVolume[MAX_NUM_CHANNELS]; // 16-byte boundary int32_t volumeInc[MAX_NUM_CHANNELS]; int32_t volumeInc[MAX_NUM_CHANNELS]; int32_t auxLevel; int32_t auxInc; int32_t auxInc; int32_t prevAuxLevel; int32_t prevAuxLevel; // 16-byte boundary int16_t auxLevel; // 0 <= auxLevel <= MAX_GAIN_INT, but signed for mul performance uint16_t frameCount; uint16_t frameCount; uint8_t channelCount : 4; uint8_t channelCount; // 1 or 2, redundant with (needs & NEEDS_CHANNEL_COUNT__MASK) uint8_t enabled : 1; uint8_t format; // always 16 uint8_t reserved0 : 3; uint16_t enabled; // actually bool uint8_t format; uint32_t channelMask; // currently under-used uint32_t channelMask; AudioBufferProvider* bufferProvider; AudioBufferProvider* bufferProvider; mutable AudioBufferProvider::Buffer buffer; // 16-byte boundary mutable AudioBufferProvider::Buffer buffer; // 8 bytes hook_t hook; hook_t hook; const void* in; // current location in buffer const void* in; // current location in buffer // 16-byte boundary AudioResampler* resampler; AudioResampler* resampler; uint32_t sampleRate; uint32_t sampleRate; int32_t* mainBuffer; int32_t* mainBuffer; int32_t* auxBuffer; int32_t* auxBuffer; // 16-byte boundary uint64_t localTimeFreq; uint64_t localTimeFreq; int64_t padding; // 16-byte boundary bool setResampler(uint32_t sampleRate, uint32_t devSampleRate); bool setResampler(uint32_t sampleRate, uint32_t devSampleRate); bool doesResample() const { return resampler != NULL; } bool doesResample() const { return resampler != NULL; } void resetResampler() { if (resampler != NULL) resampler->reset(); } void resetResampler() { if (resampler != NULL) resampler->reset(); } Loading