summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2010-09-13 09:14:39 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-09-13 09:14:39 -0700
commitbd2e9ec64d9a292a1309504c6c5fe33e1bc2333a (patch)
tree70e0ad992eb5ba43fc322b3d0066354fc7da076e /services
parent3d7606aa607b24817e37c264f2141ed7b2d50be0 (diff)
parent27a2fdfb8ad1606bdb686c35e30ae894dd037588 (diff)
downloadframeworks_base-bd2e9ec64d9a292a1309504c6c5fe33e1bc2333a.zip
frameworks_base-bd2e9ec64d9a292a1309504c6c5fe33e1bc2333a.tar.gz
frameworks_base-bd2e9ec64d9a292a1309504c6c5fe33e1bc2333a.tar.bz2
Merge "Fix volume problems with insert revert" into gingerbread
Diffstat (limited to 'services')
-rw-r--r--services/audioflinger/AudioFlinger.cpp60
1 files changed, 31 insertions, 29 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 3770b55..886c25b 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -1752,14 +1752,15 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
}
// compute volume for this track
- int16_t left, right, aux;
+ uint32_t vl, vr, va;
if (track->isMuted() || track->isPausing() ||
mStreamTypes[track->type()].mute) {
- left = right = aux = 0;
+ vl = vr = va = 0;
if (track->isPausing()) {
track->setPaused();
}
} else {
+
// read original volumes with volume control
float typeVolume = mStreamTypes[track->type()].volume;
#ifdef LVMX
@@ -1774,36 +1775,37 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
}
#endif
float v = masterVolume * typeVolume;
- uint32_t vl = (uint32_t)(v * cblk->volume[0]) << 12;
- uint32_t vr = (uint32_t)(v * cblk->volume[1]) << 12;
+ vl = (uint32_t)(v * cblk->volume[0]) << 12;
+ vr = (uint32_t)(v * cblk->volume[1]) << 12;
- // Delegate volume control to effect in track effect chain if needed
- if (chain != 0 && chain->setVolume_l(&vl, &vr)) {
- // Do not ramp volume is volume is controlled by effect
+ va = (uint32_t)(v * cblk->sendLevel);
+ }
+ // Delegate volume control to effect in track effect chain if needed
+ if (chain != 0 && chain->setVolume_l(&vl, &vr)) {
+ // Do not ramp volume if volume is controlled by effect
+ param = AudioMixer::VOLUME;
+ track->mHasVolumeController = true;
+ } else {
+ // force no volume ramp when volume controller was just disabled or removed
+ // from effect chain to avoid volume spike
+ if (track->mHasVolumeController) {
param = AudioMixer::VOLUME;
- track->mHasVolumeController = true;
- } else {
- // force no volume ramp when volume controller was just disabled or removed
- // from effect chain to avoid volume spike
- if (track->mHasVolumeController) {
- param = AudioMixer::VOLUME;
- }
- track->mHasVolumeController = false;
}
-
- // Convert volumes from 8.24 to 4.12 format
- uint32_t v_clamped = (vl + (1 << 11)) >> 12;
- if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT;
- left = int16_t(v_clamped);
- v_clamped = (vr + (1 << 11)) >> 12;
- if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT;
- right = int16_t(v_clamped);
-
- v_clamped = (uint32_t)(v * cblk->sendLevel);
- if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT;
- aux = int16_t(v_clamped);
+ track->mHasVolumeController = false;
}
+ // Convert volumes from 8.24 to 4.12 format
+ int16_t left, right, aux;
+ uint32_t v_clamped = (vl + (1 << 11)) >> 12;
+ if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT;
+ left = int16_t(v_clamped);
+ v_clamped = (vr + (1 << 11)) >> 12;
+ 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;
+ aux = int16_t(va);
+
#ifdef LVMX
if ( tracksConnectedChanged || stateChanged )
{
@@ -2283,7 +2285,7 @@ bool AudioFlinger::DirectOutputThread::threadLoop()
// only one effect chain can be present on DirectOutputThread, so if
// there is one, the track is connected to it
if (!effectChains.isEmpty()) {
- // Do not ramp volume is volume is controlled by effect
+ // Do not ramp volume if volume is controlled by effect
if(effectChains[0]->setVolume_l(&vl, &vr)) {
rampVolume = false;
}
@@ -4728,7 +4730,7 @@ sp<IEffect> AudioFlinger::createEffect(pid_t pid,
// Session AudioSystem::SESSION_OUTPUT_STAGE is reserved for output stage effects
// that can only be created by audio policy manager (running in same process)
if (sessionId == AudioSystem::SESSION_OUTPUT_STAGE &&
- getpid() != IPCThreadState::self()->getCallingPid()) {
+ getpid() != pid) {
lStatus = INVALID_OPERATION;
goto Exit;
}