diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2015-08-03 01:18:33 -0600 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2015-08-03 01:18:33 -0600 |
commit | 85e38e35c241e91383dc3a5ebe57068fbea859d0 (patch) | |
tree | 05a745d039e9c4cbd48fdf0f428b3fb2c3f7714b /post_proc | |
parent | 26e1f44399b4a5621e4d4dc61f3873000b89a658 (diff) | |
parent | 27d5ebe71fbc0c6414de98909c298d71c4dcfb37 (diff) | |
download | android_hardware_qcom_audio-85e38e35c241e91383dc3a5ebe57068fbea859d0.tar.gz android_hardware_qcom_audio-85e38e35c241e91383dc3a5ebe57068fbea859d0.tar.bz2 android_hardware_qcom_audio-85e38e35c241e91383dc3a5ebe57068fbea859d0.zip |
Merge 27d5ebe71fbc0c6414de98909c298d71c4dcfb37 on remote branch
Change-Id: Ifd0322e2c9ad14df614a990e725141c88fbd6e3e
Diffstat (limited to 'post_proc')
-rw-r--r-- | post_proc/EffectsHwAcc.cpp | 26 | ||||
-rw-r--r-- | post_proc/EffectsHwAcc.h | 8 | ||||
-rw-r--r-- | post_proc/reverb.c | 26 | ||||
-rw-r--r-- | post_proc/reverb.h | 1 | ||||
-rw-r--r-- | post_proc/virtualizer.c | 9 |
5 files changed, 49 insertions, 21 deletions
diff --git a/post_proc/EffectsHwAcc.cpp b/post_proc/EffectsHwAcc.cpp index 0e4c55a7..e11cfc78 100644 --- a/post_proc/EffectsHwAcc.cpp +++ b/post_proc/EffectsHwAcc.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-15, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -72,7 +72,7 @@ status_t EffectsHwAcc::EffectsBufferProvider::getNextBuffer( size_t reqOutputFrameCount = pBuffer->frameCount; int ret = 0; - if (mTrackBufferProvider != NULL) { + if (mTrackInputBufferProvider != NULL) { while (1) { reqInputFrameCount = ((reqOutputFrameCount * mEffectsConfig.inputCfg.samplingRate)/ @@ -89,7 +89,7 @@ status_t EffectsHwAcc::EffectsBufferProvider::getNextBuffer( popcount(mEffectsConfig.inputCfg.channels); while (frameCount) { pBuffer->frameCount = frameCount; - ret = mTrackBufferProvider->getNextBuffer(pBuffer, pts); + ret = mTrackInputBufferProvider->getNextBuffer(pBuffer, pts); if (ret == OK) { int bytesInBuffer = pBuffer->frameCount * FRAME_SIZE(mEffectsConfig.inputCfg.format) * @@ -98,7 +98,7 @@ status_t EffectsHwAcc::EffectsBufferProvider::getNextBuffer( frameCount -= pBuffer->frameCount; mInputBufferFrameCountOffset += pBuffer->frameCount; offset += bytesInBuffer; - mTrackBufferProvider->releaseBuffer(pBuffer); + mTrackInputBufferProvider->releaseBuffer(pBuffer); } else break; } @@ -133,7 +133,7 @@ void EffectsHwAcc::EffectsBufferProvider::releaseBuffer( AudioBufferProvider::Buffer *pBuffer) { ALOGV("EffBufferProvider::releaseBuffer()"); - if (this->mTrackBufferProvider != NULL) { + if (this->mTrackInputBufferProvider != NULL) { pBuffer->frameCount = 0; pBuffer->raw = NULL; } else { @@ -189,7 +189,8 @@ void EffectsHwAcc::unprepareEffects(AudioBufferProvider **bufferProvider) mEnabled = false; } -status_t EffectsHwAcc::prepareEffects(AudioBufferProvider **bufferProvider, +status_t EffectsHwAcc::prepareEffects(AudioBufferProvider **inputBufferProvider, + AudioBufferProvider **bufferProvider, int sessionId, audio_channel_mask_t channelMask, int frameCount) @@ -316,10 +317,11 @@ status_t EffectsHwAcc::prepareEffects(AudioBufferProvider **bufferProvider, goto noEffectsForActiveTrack; } // initialization successful: - // - keep track of the real buffer provider in case it was set before + // - keep backup of track's buffer provider pHwAccbp->mTrackBufferProvider = *bufferProvider; - // - we'll use the hw acc effect integrated inside this - // track's buffer provider, and we'll use it as the track's buffer provider + pHwAccbp->mTrackInputBufferProvider = *inputBufferProvider; + // - we'll use the hw acc effect integrated inside this track's buffer provider, + // and we'll use it as the track's buffer provider mBufferProvider = pHwAccbp; *bufferProvider = pHwAccbp; @@ -332,14 +334,14 @@ noEffectsForActiveTrack: return NO_INIT; } -void EffectsHwAcc::setBufferProvider(AudioBufferProvider **bufferProvider, +void EffectsHwAcc::setBufferProvider(AudioBufferProvider **trackInputBufferProvider, AudioBufferProvider **trackBufferProvider) { ALOGV("setBufferProvider"); if (mBufferProvider && - (mBufferProvider->mTrackBufferProvider != *bufferProvider)) { + (mBufferProvider->mTrackInputBufferProvider != *trackInputBufferProvider)) { *trackBufferProvider = mBufferProvider; - mBufferProvider->mTrackBufferProvider = *bufferProvider; + mBufferProvider->mTrackInputBufferProvider = *trackInputBufferProvider; } } diff --git a/post_proc/EffectsHwAcc.h b/post_proc/EffectsHwAcc.h index 6420a9bf..0452f577 100644 --- a/post_proc/EffectsHwAcc.h +++ b/post_proc/EffectsHwAcc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-15, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -43,10 +43,11 @@ public: virtual void setSampleRate(uint32_t inpSR, uint32_t outSR); virtual void unprepareEffects(AudioBufferProvider **trackBufferProvider); - virtual status_t prepareEffects(AudioBufferProvider **trackBufferProvider, + virtual status_t prepareEffects(AudioBufferProvider **trackInputBufferProvider, + AudioBufferProvider **trackBufferProvider, int sessionId, audio_channel_mask_t channelMask, int frameCount); - virtual void setBufferProvider(AudioBufferProvider **bufferProvider, + virtual void setBufferProvider(AudioBufferProvider **trackInputbufferProvider, AudioBufferProvider **trackBufferProvider); #ifdef HW_ACC_HPX virtual void updateHPXState(uint32_t state); @@ -62,6 +63,7 @@ public: virtual status_t getNextBuffer(Buffer* buffer, int64_t pts); virtual void releaseBuffer(Buffer* buffer); + AudioBufferProvider* mTrackInputBufferProvider; AudioBufferProvider* mTrackBufferProvider; effect_handle_t mEffectsHandle; effect_config_t mEffectsConfig; diff --git a/post_proc/reverb.c b/post_proc/reverb.c index b256e538..450ce819 100644 --- a/post_proc/reverb.c +++ b/post_proc/reverb.c @@ -281,17 +281,19 @@ void reverb_set_preset(reverb_context_t *context, int16_t preset) context->next_preset = preset; offload_reverb_set_preset(&(context->offload_reverb), preset); - enable = (preset == REVERB_PRESET_NONE) ? false: true; - offload_reverb_set_enable_flag(&(context->offload_reverb), enable); + if (context->enabled_by_client) { + enable = (preset == REVERB_PRESET_NONE) ? false: true; + offload_reverb_set_enable_flag(&(context->offload_reverb), enable); - if (context->ctl) - offload_reverb_send_params(context->ctl, &context->offload_reverb, + if (context->ctl) + offload_reverb_send_params(context->ctl, &context->offload_reverb, OFFLOAD_SEND_REVERB_ENABLE_FLAG | OFFLOAD_SEND_REVERB_PRESET); - if (context->hw_acc_fd > 0) - hw_acc_reverb_send_params(context->hw_acc_fd, &context->offload_reverb, + if (context->hw_acc_fd > 0) + hw_acc_reverb_send_params(context->hw_acc_fd, &context->offload_reverb, OFFLOAD_SEND_REVERB_ENABLE_FLAG | OFFLOAD_SEND_REVERB_PRESET); + } } void reverb_set_all_properties(reverb_context_t *context, @@ -600,6 +602,7 @@ int reverb_init(effect_context_t *context) set_config(context, &context->config); reverb_ctxt->hw_acc_fd = -1; + reverb_ctxt->enabled_by_client = false; memset(&(reverb_ctxt->reverb_settings), 0, sizeof(reverb_settings_t)); memset(&(reverb_ctxt->offload_reverb), 0, sizeof(struct reverb_params)); @@ -615,6 +618,16 @@ int reverb_enable(effect_context_t *context) reverb_context_t *reverb_ctxt = (reverb_context_t *)context; ALOGV("%s: ctxt %p", __func__, reverb_ctxt); + reverb_ctxt->enabled_by_client = true; + + /* REVERB_PRESET_NONE is equivalent to disabled state, + * But support for this state is not provided in DSP. + * Hence, do not set enable flag, if in peset mode with preset "NONE". + * Effect would be enabled when valid preset is set. + */ + if ((reverb_ctxt->preset == true) && + (reverb_ctxt->next_preset == REVERB_PRESET_NONE)) + return 0; if (!offload_reverb_get_enable_flag(&(reverb_ctxt->offload_reverb))) offload_reverb_set_enable_flag(&(reverb_ctxt->offload_reverb), true); @@ -626,6 +639,7 @@ int reverb_disable(effect_context_t *context) reverb_context_t *reverb_ctxt = (reverb_context_t *)context; ALOGV("%s: ctxt %p", __func__, reverb_ctxt); + reverb_ctxt->enabled_by_client = false; if (offload_reverb_get_enable_flag(&(reverb_ctxt->offload_reverb))) { offload_reverb_set_enable_flag(&(reverb_ctxt->offload_reverb), false); if (reverb_ctxt->ctl) diff --git a/post_proc/reverb.h b/post_proc/reverb.h index 991151e5..1a5ca0de 100644 --- a/post_proc/reverb.h +++ b/post_proc/reverb.h @@ -48,6 +48,7 @@ typedef struct reverb_context_s { // Offload vars struct mixer_ctl *ctl; int hw_acc_fd; + bool enabled_by_client; bool auxiliary; bool preset; uint16_t cur_preset; diff --git a/post_proc/virtualizer.c b/post_proc/virtualizer.c index 27485684..3874f0b4 100644 --- a/post_proc/virtualizer.c +++ b/post_proc/virtualizer.c @@ -56,6 +56,15 @@ int virtualizer_set_strength(virtualizer_context_t *context, uint32_t strength) ALOGV("%s: ctxt %p, strength: %d", __func__, context, strength); context->strength = strength; + /* + * Zero strength is not equivalent to disable state as down mix + * is still happening for multichannel inputs. + * For better user experience, explicitly disable virtualizer module + * when strength is 0. + */ + offload_virtualizer_set_enable_flag(&(context->offload_virt), + ((strength > 0) && !(context->temp_disabled)) ? + true : false); offload_virtualizer_set_strength(&(context->offload_virt), strength); if (context->ctl) offload_virtualizer_send_params(context->ctl, &context->offload_virt, |