Skip to content

Commit

Permalink
audio/msm8660: Squashed set of updates
Browse files Browse the repository at this point in the history
* Updates cherry-picked from msm7x30's jb_2.5.3 branch.

msm7630 : Send proper channleMask for getInputProfile()

-Unable to perform Voice call recording.
-Unable to find profile for the device.
-Update proper channelMask for getInputProfile().

Change-Id: Ic67a1d59c4ea54ecccab2958e3c94672282f710f

audio/msm7630: Add usb audio hal profile.

remove USB ACCESSORY support from STRATEGY_PHONE to force speaker

Change-Id: I080d1e547310d48b43bdf9bae8ee789887766b3c

audio/msm7630: Fix the issue of voice call when HDMI connected

- Voice call is not working when HDMI cable is connected.
- When HDMI is connected getDeviceForStrategy is picking
  up HDMI rx as active device, because of this voice call
  is not working.
- Avoid updating the HDMI as active output device, when
  strategy is STRATGY_PHONE.

(cherry picked from commit 93bc81a7cd494373c19e5611fed060732a14b31b)

Change-Id: I74be601f771883d9dfecc751994a4068acaf2d03

audio/msm7630: Fix to enable TTY device

-Connecting TTY device is not showing proper RX and TX values.
-Mismatch in Key values of TTY modes in HAL.
-Change TTY mode string values as per the values in PhoneGlobals.java.

CRs-Fixed: 449513
Change-Id: I53e52b057bb535647731bdd7b99cb065b2e50940

audio/msm7630: Fix for back to back VOIP calls failure

- Back to back VOIP calls fail.
- MVS driver is not closed in HAL at the end of VOIP call
  due to wrong book keeping of VOIP in and out streams.
  This prevents back to back VOIP calls.
- Enhance bookkeeping code and close driver at end of VOIP call

(cherry picked from commit 2884ae26b9b65f49acee44a49efbc6196ab6d15f)

Patchset 2: fix unneeded bool usage (isDriverClosed)

Change-Id: Ia99149fca9c47846bc7c5a71bc23e1cbc30a16fa
  • Loading branch information
arco authored and Giulio Cervera committed Apr 21, 2013
1 parent 672734e commit 73554f0
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 68 deletions.
106 changes: 74 additions & 32 deletions msm8660/AudioHardware.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -681,7 +681,7 @@ AudioHardware::AudioHardware() :
mCurSndDevice(-1),
mTtyMode(TTY_OFF), mFmFd(-1), mNumPcmRec(0)
#ifdef QCOM_VOIP_ENABLED
, mVoipFd(-1), mNumVoipStreams(0), mDirectOutput(0)
, mVoipFd(-1), mVoipInActive(false), mVoipOutActive(false), mDirectOutput(0)
#endif
#ifdef HTC_ACOUSTIC_AUDIO
, mRecordState(false), mEffectEnabled(false)
Expand Down Expand Up @@ -1404,11 +1404,11 @@ status_t AudioHardware::setParameters(const String8& keyValuePairs)

key = String8(TTY_MODE_KEY);
if (param.get(key, value) == NO_ERROR) {
if (value == "full") {
if (value == "full" || value == "tty_full") {
mTtyMode = TTY_FULL;
} else if (value == "hco") {
} else if (value == "hco" || value == "tty_hco") {
mTtyMode = TTY_HCO;
} else if (value == "vco") {
} else if (value == "vco" || value == "tty_vco") {
mTtyMode = TTY_VCO;
} else {
mTtyMode = TTY_OFF;
Expand Down Expand Up @@ -3188,7 +3188,7 @@ status_t AudioHardware::AudioStreamOutDirect::set(
uint32_t lChannels = pChannels ? *pChannels : 0;
uint32_t lRate = pRate ? *pRate : 0;

ALOGV("set1 lFormat = %d lChannels= %u lRate = %u\n", lFormat, lChannels, lRate );
ALOGV("AudioStreamOutDirect::set lFormat = %d lChannels= %u lRate = %u\n", lFormat, lChannels, lRate );
mHardware = hw;

// fix up defaults
Expand Down Expand Up @@ -3216,16 +3216,20 @@ status_t AudioHardware::AudioStreamOutDirect::set(
voip_session_id = msm_get_voc_session(VOIP_SESSION_NAME);
}
#endif
mHardware->mNumVoipStreams++;

mHardware->mVoipOutActive = true;

if (mHardware->mVoipInActive)
mHardware->setupDeviceforVoipCall(true);

return NO_ERROR;
}

AudioHardware::AudioStreamOutDirect::~AudioStreamOutDirect()
{
ALOGV("AudioStreamOutDirect destructor");
mHardware->mVoipOutActive = false;
standby();
if (mHardware->mNumVoipStreams)
mHardware->mNumVoipStreams--;
}

ssize_t AudioHardware::AudioStreamOutDirect::write(const void* buffer, size_t bytes)
Expand All @@ -3234,12 +3238,18 @@ ssize_t AudioHardware::AudioStreamOutDirect::write(const void* buffer, size_t by
size_t count = bytes;
const uint8_t* p = static_cast<const uint8_t*>(buffer);
unsigned short dec_id = INVALID_DEVICE;
ALOGV("AudioStreamOutDirect::write(%p, %ld)", buffer, bytes);

if (mStandby) {
if(mHardware->mVoipFd >= 0) {
mFd = mHardware->mVoipFd;
}
else {

mHardware->mVoipOutActive = true;
if (mHardware->mVoipInActive)
mHardware->setupDeviceforVoipCall(true);

mStandby = false;
} else {
// open driver
ALOGV("open mvs driver");
status = ::open(MVS_DEVICE, /*O_WRONLY*/ O_RDWR);
Expand Down Expand Up @@ -3281,6 +3291,10 @@ ssize_t AudioHardware::AudioStreamOutDirect::write(const void* buffer, size_t by
goto Error;
}

mHardware->mVoipOutActive = true;
if (mHardware->mVoipInActive)
mHardware->setupDeviceforVoipCall(true);

// fill 2 buffers before AUDIO_START
mStartCount = AUDIO_HW_NUM_OUT_BUF;
mStandby = false;
Expand Down Expand Up @@ -3375,11 +3389,13 @@ status_t AudioHardware::AudioStreamOutDirect::standby()
{
Routing_table* temp = NULL;
ALOGD("AudioStreamOutDirect::standby()");
Mutex::Autolock lock(mHardware->mVoipLock);
status_t status = NO_ERROR;
int ret = 0;

ALOGV(" AudioStreamOutDirect::standby mHardware->mNumVoipStreams = %d mFd = %d\n", mHardware->mNumVoipStreams, mFd);
if (mFd >= 0 && (mHardware->mNumVoipStreams == 1)) {
ALOGD("Voipin %d driver fd %d", mHardware->mVoipInActive, mHardware->mVoipFd);
mHardware->mVoipOutActive = false;
if (mHardware->mVoipFd >= 0 && !mHardware->mVoipInActive) {
#ifdef LEGACY_QCOM_VOICE
msm_end_voice();
#else
Expand All @@ -3400,16 +3416,19 @@ status_t AudioHardware::AudioStreamOutDirect::standby()
enableDevice(temp->dev_id_tx,0);
}
deleteFromTable(VOIP_CALL);
if (mFd >= 0) {
ret = ioctl(mFd, AUDIO_STOP, NULL);
ALOGE("MVS stop returned %d \n", ret);
if (mHardware->mVoipFd >= 0) {
ret = ioctl(mHardware->mVoipFd, AUDIO_STOP, NULL);
ALOGD("MVS stop returned %d %d %d\n", ret, __LINE__, mHardware->mVoipFd);
::close(mFd);
mFd = mHardware->mVoipFd = -1;
ALOGV("driver closed");
mHardware->setupDeviceforVoipCall(false);
ALOGD("MVS driver closed %d mFd %d", __LINE__, mHardware->mVoipFd);
voip_session_id = 0;
voip_session_mute = 0;
}
}
else
ALOGE("Not closing MVS driver");
mStandby = true;
return status;
}
Expand Down Expand Up @@ -4290,6 +4309,25 @@ status_t AudioHardware::AudioSessionOutLPA::getRenderPosition(uint32_t *dspFrame
return INVALID_OPERATION;
}

status_t AudioHardware::setupDeviceforVoipCall(bool value)
{

int mode = (value ? AudioSystem::MODE_IN_COMMUNICATION : AudioSystem::MODE_NORMAL);
if (setMode(mode) != NO_ERROR) {
ALOGV("setMode fails");
return UNKNOWN_ERROR;
}

if (setMicMute(!value) != NO_ERROR) {
ALOGV("MicMute fails");
return UNKNOWN_ERROR;
}

ALOGD("Device setup sucess for VOIP call");

return NO_ERROR;
}


status_t AudioHardware::AudioSessionOutLPA::getBufferInfo(buf_info **buf) {

Expand Down Expand Up @@ -4965,9 +5003,6 @@ status_t AudioHardware::AudioStreamInVoip::set(
ALOGV("Check if driver is open");
if(mHardware->mVoipFd >= 0) {
mFd = mHardware->mVoipFd;
// Increment voip stream count
mHardware->mNumVoipStreams++;
ALOGV("MVS driver is already opened, mHardware->mNumVoipStreams = %d \n", mHardware->mNumVoipStreams);
}
else {
ALOGE("open mvs driver");
Expand All @@ -4978,10 +5013,6 @@ status_t AudioHardware::AudioStreamInVoip::set(
}
mFd = status;
ALOGE("VOPIstreamin : Save the fd \n");
mHardware->mVoipFd = mFd;
// Increment voip stream count
mHardware->mNumVoipStreams++;
ALOGV(" input stream set mHardware->mNumVoipStreams = %d \n", mHardware->mNumVoipStreams);

// configuration
ALOGV("get mvs config");
Expand Down Expand Up @@ -5077,6 +5108,13 @@ status_t AudioHardware::AudioStreamInVoip::set(
ALOGV(" Set state AUDIO_INPUT_OPENED\n");
mState = AUDIO_INPUT_OPENED;

ALOGV(" Set mVoipFd now\n");
mHardware->mVoipFd = mFd;
mHardware->mVoipInActive = true;

if (mHardware->mVoipOutActive)
mHardware->setupDeviceforVoipCall(true);

if (!acoustic)
return NO_ERROR;

Expand All @@ -5095,9 +5133,8 @@ status_t AudioHardware::AudioStreamInVoip::set(
AudioHardware::AudioStreamInVoip::~AudioStreamInVoip()
{
ALOGV("AudioStreamInVoip destructor");
mHardware->mVoipInActive = false;
standby();
if (mHardware->mNumVoipStreams)
mHardware->mNumVoipStreams--;
}

ssize_t AudioHardware::AudioStreamInVoip::read( void* buffer, ssize_t bytes)
Expand Down Expand Up @@ -5166,11 +5203,13 @@ ssize_t AudioHardware::AudioStreamInVoip::read( void* buffer, ssize_t bytes)

status_t AudioHardware::AudioStreamInVoip::standby()
{
bool isDriverClosed = false;
Routing_table* temp = NULL;
ALOGD("AudioStreamInVoip::standby");
Mutex::Autolock lock(mHardware->mVoipLock);
if (!mHardware) return -1;
ALOGV(" AudioStreamInVoip::standby = %d \n", mHardware->mNumVoipStreams);
if (mState > AUDIO_INPUT_CLOSED && (mHardware->mNumVoipStreams == 1)) {
ALOGE("VoipOut %d driver fd %d", mHardware->mVoipOutActive, mHardware->mVoipFd);
mHardware->mVoipInActive = false;
if (mState > AUDIO_INPUT_CLOSED && !mHardware->mVoipOutActive) {
ALOGE(" closing mvs driver\n");
//Mute and disable the device.
int ret = 0;
Expand Down Expand Up @@ -5213,18 +5252,21 @@ status_t AudioHardware::AudioStreamInVoip::standby()
}
}
deleteFromTable(VOIP_CALL);
if (mFd >= 0) {
ret = ioctl(mFd, AUDIO_STOP, NULL);
if (mHardware->mVoipFd >= 0) {
ret = ioctl(mHardware->mVoipFd, AUDIO_STOP, NULL);
ALOGE("MVS stop returned %d \n", ret);
::close(mFd);
mFd = mHardware->mVoipFd = -1;
ALOGV("driver closed");
isDriverClosed = true;
mHardware->setupDeviceforVoipCall(false);
ALOGD("MVS driver closed %d mFd %d", __LINE__, mHardware->mVoipFd);
voip_session_id = 0;
voip_session_mute = 0;
}
mState = AUDIO_INPUT_CLOSED;
}
else
ALOGE("Not closing MVS driver");

return NO_ERROR;
}

Expand Down
5 changes: 4 additions & 1 deletion msm8660/AudioHardware.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ class AudioHardware : public AudioHardwareBase

protected:
virtual status_t dump(int fd, const Vector<String16>& args);
status_t setupDeviceforVoipCall(bool value);

private:

Expand Down Expand Up @@ -559,7 +560,9 @@ class AudioSessionOutLPA : public AudioStreamOut
Mutex mLock;
#ifdef QCOM_VOIP_ENABLED
int mVoipFd;
int mNumVoipStreams;
bool mVoipInActive;
bool mVoipOutActive;
Mutex mVoipLock;
#endif
#ifdef HTC_ACOUSTIC_AUDIO
int mNoiseSuppressionState;
Expand Down
23 changes: 5 additions & 18 deletions msm8660/AudioPolicyManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,14 +111,10 @@ audio_devices_t AudioPolicyManager::getDeviceForStrategy(routing_strategy strate
if (device) break;
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_WIRED_HEADSET;
if (device) break;
device = mAvailableOutputDevices & AUDIO_DEVICE_OUT_USB_ACCESSORY;
if (device) break;
device = mAvailableOutputDevices & AUDIO_DEVICE_OUT_USB_DEVICE;
if (device) break;
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_DGTL_DOCK_HEADSET;
if (device) break;
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_AUX_DIGITAL;
if (device) break;
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_ANLG_DOCK_HEADSET;
if (device) break;
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_EARPIECE;
Expand All @@ -138,14 +134,10 @@ audio_devices_t AudioPolicyManager::getDeviceForStrategy(routing_strategy strate
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER;
if (device) break;
}
device = mAvailableOutputDevices & AUDIO_DEVICE_OUT_USB_ACCESSORY;
if (device) break;
device = mAvailableOutputDevices & AUDIO_DEVICE_OUT_USB_DEVICE;
if (device) break;
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_DGTL_DOCK_HEADSET;
if (device) break;
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_AUX_DIGITAL;
if (device) break;
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_ANLG_DOCK_HEADSET;
if (device) break;
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_SPEAKER;
Expand Down Expand Up @@ -606,10 +598,6 @@ AudioPolicyManagerBase::IOProfile *AudioPolicyManager::getProfileForDirectOutput
uint32_t channelMask,
audio_output_flags_t flags)
{
if( !((flags & AUDIO_OUTPUT_FLAG_LPA) ||
(flags & AUDIO_OUTPUT_FLAG_TUNNEL)||
(flags & AUDIO_OUTPUT_FLAG_VOIP_RX)) )
flags = AUDIO_OUTPUT_FLAG_DIRECT;

for (size_t i = 0; i < mHwModules.size(); i++) {
if (mHwModules[i]->mHandle == 0) {
Expand All @@ -619,7 +607,7 @@ AudioPolicyManagerBase::IOProfile *AudioPolicyManager::getProfileForDirectOutput
AudioPolicyManagerBase::IOProfile *profile = mHwModules[i]->mOutputProfiles[j];
if (isCompatibleProfile(profile, device, samplingRate, format,
channelMask,
flags)) {
(audio_output_flags_t)(flags|AUDIO_OUTPUT_FLAG_DIRECT))) {
if (mAvailableOutputDevices & profile->mSupportedDevices) {
return mHwModules[i]->mOutputProfiles[j];
}
Expand Down Expand Up @@ -1158,13 +1146,13 @@ audio_io_handle_t AudioPolicyManager::getInput(int inputSource,
// adapt channel selection to input source
switch(inputSource) {
case AUDIO_SOURCE_VOICE_UPLINK:
channelMask = AudioSystem::CHANNEL_IN_VOICE_UPLINK;
channelMask |= AudioSystem::CHANNEL_IN_VOICE_UPLINK;
break;
case AUDIO_SOURCE_VOICE_DOWNLINK:
channelMask = AudioSystem::CHANNEL_IN_VOICE_DNLINK;
channelMask |= AudioSystem::CHANNEL_IN_VOICE_DNLINK;
break;
case AUDIO_SOURCE_VOICE_CALL:
channelMask = (AudioSystem::CHANNEL_IN_VOICE_UPLINK | AudioSystem::CHANNEL_IN_VOICE_DNLINK);
channelMask |= (AudioSystem::CHANNEL_IN_VOICE_UPLINK | AudioSystem::CHANNEL_IN_VOICE_DNLINK);
break;
default:
break;
Expand Down Expand Up @@ -1235,7 +1223,7 @@ audio_devices_t AudioPolicyManager::getDeviceForInputSource(int inputSource)
}
break;
case AUDIO_SOURCE_VOICE_COMMUNICATION:
device = AudioSystem::DEVICE_IN_COMMUNICATION;
device = AUDIO_DEVICE_IN_COMMUNICATION;
break;

case AUDIO_SOURCE_CAMCORDER:
Expand Down Expand Up @@ -1320,5 +1308,4 @@ void AudioPolicyManager::handleNotificationRoutingForStream(AudioSystem::stream_
}
}


}; // namespace android_audio_legacy
Empty file modified msm8660/AudioPolicyManager.h
100755 → 100644
Empty file.
Loading

0 comments on commit 73554f0

Please sign in to comment.