summaryrefslogtreecommitdiffstats
path: root/libaudio/AudioHardwareALSA.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libaudio/AudioHardwareALSA.cpp')
-rwxr-xr-xlibaudio/AudioHardwareALSA.cpp91
1 files changed, 71 insertions, 20 deletions
diff --git a/libaudio/AudioHardwareALSA.cpp b/libaudio/AudioHardwareALSA.cpp
index 4df3c42..db2a767 100755
--- a/libaudio/AudioHardwareALSA.cpp
+++ b/libaudio/AudioHardwareALSA.cpp
@@ -210,7 +210,8 @@ AudioHardwareALSA::AudioHardwareALSA() :
mSecRilLibHandle(NULL),
mRilClient(0),
mVrModeEnabled(false),
- mActivatedCP(false)
+ mActivatedCP(false),
+ mBluetoothECOff(false)
{
snd_lib_error_set_handler(&ALSAErrorHandler);
mMixer = new ALSAMixer;
@@ -539,8 +540,11 @@ status_t AudioHardwareALSA::doRouting_l(uint32_t device, bool force)
case AudioSystem::ROUTE_BLUETOOTH_SCO:
case AudioSystem::ROUTE_BLUETOOTH_SCO_HEADSET:
case AudioSystem::ROUTE_BLUETOOTH_SCO_CARKIT:
- LOGI("### incall mode bluetooth route");
- setCallAudioPath(mRilClient, SOUND_AUDIO_PATH_BLUETOOTH);
+ LOGI("### incall mode bluetooth route %s NR", mBluetoothECOff ? "NO" : "");
+ if (mBluetoothECOff)
+ setCallAudioPath(mRilClient, SOUND_AUDIO_PATH_BLUETOOTH_NO_NR);
+ else
+ setCallAudioPath(mRilClient, SOUND_AUDIO_PATH_BLUETOOTH);
break;
case AudioSystem::ROUTE_HEADSET :
@@ -562,21 +566,6 @@ status_t AudioHardwareALSA::doRouting_l(uint32_t device, bool force)
ret = mOutput->setDevice(mode, device, PLAYBACK, force);
- if (mSecRilLibHandle && (connectRILDIfRequired() == OK) ) {
- if (AudioSystem::MODE_IN_CALL == mode) {
- if (!mActivatedCP) {
- setCallClockSync(mRilClient, SOUND_CLOCK_START);
- mActivatedCP = true;
- }
- }
-
- if (AudioSystem::MODE_NORMAL == mode) {
- if(mActivatedCP)
- mActivatedCP = false;
- }
- }
-
-
return ret;
}
@@ -665,6 +654,14 @@ status_t AudioHardwareALSA::setMode(int mode)
status_t status = AudioHardwareBase::setMode(mode);
LOGV("setMode() : new %d, old %d", mMode, prevMode);
if (status == NO_ERROR) {
+ if ( (mMode == AudioSystem::MODE_RINGTONE) || (mMode == AudioSystem::MODE_IN_CALL) )
+ {
+ if ( (!mActivatedCP) && (mSecRilLibHandle) && (connectRILDIfRequired() == OK) ) {
+ setCallClockSync(mRilClient, SOUND_CLOCK_START);
+ mActivatedCP = true;
+ }
+ }
+
// make sure that doAudioRouteOrMute() is called by doRouting()
// when entering or exiting in call mode even if the new device
// selected is the same as current one.
@@ -680,6 +677,11 @@ status_t AudioHardwareALSA::setMode(int mode)
mOutput->close();
}
}
+
+ if (mMode == AudioSystem::MODE_NORMAL) {
+ if(mActivatedCP)
+ mActivatedCP = false;
+ }
}
return status;
@@ -705,6 +707,54 @@ int AudioHardwareALSA::setVoiceRecordGain_l(bool enable)
return NO_ERROR;
}
+status_t AudioHardwareALSA::setParameters(const String8& keyValuePairs)
+{
+ AudioParameter param = AudioParameter(keyValuePairs);
+ String8 bt_nrec_key = String8("bt_headset_nrec");
+ String8 value;
+
+ LOGV("setParameters(%s)", keyValuePairs.string());
+
+ if (param.get(bt_nrec_key, value) == NO_ERROR) {
+ setBluetoothNrEcOnOff((value == "on") ? false : true);
+ }
+
+ return NO_ERROR;
+}
+
+void AudioHardwareALSA::setBluetoothNrEcOnOff(bool disable)
+{
+ LOGV("setBluetoothNrEcOnOff(%s)", disable ? "true" : "false");
+
+ if (disable != mBluetoothECOff)
+ {
+ mBluetoothECOff = disable;
+
+ if ( (mOutput) && (AudioSystem::MODE_IN_CALL == mMode) &&
+ (mSecRilLibHandle) && (connectRILDIfRequired() == OK)) {
+
+ uint32_t device = mOutput->device();
+
+ switch (device) {
+ case AudioSystem::ROUTE_BLUETOOTH_SCO:
+ case AudioSystem::ROUTE_BLUETOOTH_SCO_HEADSET:
+ case AudioSystem::ROUTE_BLUETOOTH_SCO_CARKIT:
+ LOGV("### incall mode bluetooth EC %s route", mBluetoothECOff ? "OFF" : "ON");
+ if (mBluetoothECOff)
+ setCallAudioPath(mRilClient, SOUND_AUDIO_PATH_BLUETOOTH_NO_NR);
+ else
+ setCallAudioPath(mRilClient, SOUND_AUDIO_PATH_BLUETOOTH);
+ break;
+
+ default :
+ LOGE("Bluetooth path is not activated!!");
+ break;
+ }
+ }
+ }
+}
+
+
// ----------------------------------------------------------------------------
ALSAStreamOps::ALSAStreamOps() :
@@ -1627,6 +1677,7 @@ ssize_t AudioStreamInALSA::read(void *buffer, ssize_t bytes)
} else {
n = status;
}
+ frames = snd_pcm_bytes_to_frames(mHandle, bytes);
} else {
n = frames;
}
@@ -1736,7 +1787,7 @@ status_t AudioStreamInALSA::getNextBuffer(ALSABufferProvider::Buffer* buffer)
(uint8_t *)mPcmIn +
(mInPcmInBuf * mDefaults->channelCount * sizeof(int16_t)),
PERIOD_SZ_CAPTURE - mInPcmInBuf);
- if (mReadStatus <= 0) {
+ if (mReadStatus < 0) {
buffer->raw = NULL;
buffer->frameCount = 0;
LOGV("resampler read error %d", mReadStatus);
@@ -2452,7 +2503,7 @@ int ALSADownsampler::resample(int16_t* out, size_t *outFrameCount)
}
if (out == NULL || outFrameCount == NULL) {
- return mStatus;
+ return BAD_VALUE;
}
int16_t *outLeft = mTmp2Left;