summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcodeworkx <daniel.hillenbrand@codeworkx.de>2012-07-08 12:16:31 +0200
committercodeworkx <daniel.hillenbrand@codeworkx.de>2012-07-09 17:58:40 +0200
commite4343f96a08bc47aad7e82dcfb835043e6e36c84 (patch)
tree5cd5fa0c664d7cfd7ac56e59b4d5c37e43c8dfca
parenta4905d0e32d65bee0adb455b32ecbb49b5491257 (diff)
downloadframeworks_base-e4343f96a08bc47aad7e82dcfb835043e6e36c84.zip
frameworks_base-e4343f96a08bc47aad7e82dcfb835043e6e36c84.tar.gz
frameworks_base-e4343f96a08bc47aad7e82dcfb835043e6e36c84.tar.bz2
audioflinger: workaround for samsungs volume bug
play music via headset -> notification comes in -> music volume gets set to 0 -> notification gets played -> music resumes with wrong (much lower) volume Change-Id: I3961ed48d0687bacb60ee8d4ddc82575f06c908e
-rw-r--r--services/audioflinger/Android.mk4
-rw-r--r--services/audioflinger/AudioFlinger.cpp38
2 files changed, 42 insertions, 0 deletions
diff --git a/services/audioflinger/Android.mk b/services/audioflinger/Android.mk
index e5c39b1..83d18ac 100644
--- a/services/audioflinger/Android.mk
+++ b/services/audioflinger/Android.mk
@@ -34,6 +34,10 @@ ifeq ($(BOARD_USE_MOTO_DOCK_HACK),true)
LOCAL_CFLAGS += -DMOTO_DOCK_HACK
endif
+ifeq ($(BOARD_HAS_SAMSUNG_VOLUME_BUG),true)
+ LOCAL_CFLAGS += -DHAS_SAMSUNG_VOLUME_BUG
+endif
+
ifeq ($(ARCH_ARM_HAVE_NEON),true)
LOCAL_CFLAGS += -D__ARM_HAVE_NEON
endif
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 0faf367..803a2bf 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -95,6 +95,11 @@ static const uint32_t kMinThreadSleepTimeUs = 5000;
// maximum divider applied to the active sleep time in the mixer thread loop
static const uint32_t kMaxThreadSleepTimeShift = 2;
+#ifdef HAS_SAMSUNG_VOLUME_BUG
+float gPrevMusicStreamVolume = 0;
+bool gMusicStreamIsMuted = false;
+bool gMusicStreamNeedsPrevVolume = false;
+#endif
// ----------------------------------------------------------------------------
@@ -2527,9 +2532,42 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
track->setPaused();
}
} else {
+#ifdef HAS_SAMSUNG_VOLUME_BUG
+ if (track->type() == AUDIO_STREAM_MUSIC && !track->isMuted() && !track->isPausing()) {
+ if(mStreamTypes[AUDIO_STREAM_MUSIC].volume > 0 && !gMusicStreamNeedsPrevVolume) {
+ gPrevMusicStreamVolume = mStreamTypes[AUDIO_STREAM_MUSIC].volume;
+ LOGD("Stored volume = %f", gPrevMusicStreamVolume);
+ } else {
+ gMusicStreamIsMuted = true;
+ }
+ } else if (track->type() == AUDIO_STREAM_MUSIC && (track->isMuted() || track->isPausing())) {
+ gMusicStreamIsMuted = true;
+ }
+ if (track->type() == AUDIO_STREAM_NOTIFICATION && gMusicStreamIsMuted) {
+ LOGD("Music stream needs volume restore!");
+ LOGD("gPrevMusicStreamVolume = %f", gPrevMusicStreamVolume);
+ gMusicStreamNeedsPrevVolume = true;
+ }
+#endif
// read original volumes with volume control
float typeVolume = mStreamTypes[track->type()].volume;
+
+#ifdef HAS_SAMSUNG_VOLUME_BUG
+ if (track->type() == AUDIO_STREAM_MUSIC && typeVolume > 0 && !track->isMuted() &&
+ !track->isPausing() && gMusicStreamNeedsPrevVolume) {
+ LOGI("Restoring last known good volume value on music stream!");
+ LOGI("gPrevMusicStreamVolume = %f", gPrevMusicStreamVolume);
+ mStreamTypes[AUDIO_STREAM_MUSIC].volume = gPrevMusicStreamVolume;
+ typeVolume = gPrevMusicStreamVolume;
+ gMusicStreamIsMuted = false;
+ gMusicStreamNeedsPrevVolume = false;
+ } else if (track->type() == AUDIO_STREAM_MUSIC && typeVolume > 0
+ && !track->isMuted() && !track->isPausing()) {
+ gMusicStreamIsMuted = false;
+ }
+#endif
+
float v = masterVolume * typeVolume;
vl = (uint32_t)(v * cblk->volume[0]) << 12;
vr = (uint32_t)(v * cblk->volume[1]) << 12;