status_t AudioResourceManager::TurnonAudioDeviceIncall(unsigned int mDlOutputDevice) { ALOGD("TurnonAudioDeviceIncall mDlOutputDevice = 0x%x", mDlOutputDevice); SetMicInvserse(mMicInverseSetting); if (mDlOutputDevice & AUDIO_DEVICE_OUT_EARPIECE) { mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_EARPIECER , AudioAnalogType::MUX_VOICE); mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_EARPIECER , AudioAnalogType::MUX_VOICE); mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_EARPIECER, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if (mDlOutputDevice & AUDIO_DEVICE_OUT_SPEAKER) { mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_SPEAKERR , AudioAnalogType::MUX_AUDIO); mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_SPEAKERL , AudioAnalogType::MUX_AUDIO); mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_SPEAKERR, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if ((mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADSET) || (mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADPHONE)) { mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETR , AudioAnalogType::MUX_AUDIO); mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETL , AudioAnalogType::MUX_AUDIO); mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if (mDlOutputDevice & AUDIO_DEVICE_OUT_FM_TX) { // do nothing } if (mDlOutputDevice & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET) { // fix me , may not use HeadSetDetect mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETR , AudioAnalogType::MUX_AUDIO); mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETL , AudioAnalogType::MUX_AUDIO); mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if (mDlOutputDevice & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) { // do nothing } if (mDlOutputDevice & AUDIO_DEVICE_OUT_AUX_DIGITAL) { //todo :: if htere is analog block need to turn onAsBinde } // do set analog gain control if (IsModeIncall() == false) { mAudioVolumeInstance->setMasterVolume(mAudioVolumeInstance->getMasterVolume(), mAudioMode, mDlOutputDevice); } else { // check TTY status to avoid override mic gain if (SpeechPhoneCallController::GetInstance()->CheckTtyNeedOn() == false){ mAudioVolumeInstance->ApplyMicGain(GetIncallMicDevice(mDlOutputDevice), mAudioMode); // set incall mic gain } mAudioVolumeInstance->setVoiceVolume(mAudioVolumeInstance->getVoiceVolume(), mAudioMode, mDlOutputDevice);// set DL volume } return NO_ERROR; }
status_t AudioResourceManager::TurnonAudioDevice(unsigned int mDlOutputDevice) { uint32 DeviceCount = PopCount(mDlOutputDevice); ALOGD("TurnonAudioDevice = 0x%x DeviceCount = %d", mDlOutputDevice, DeviceCount); if (DeviceCount == 1) { if (mDlOutputDevice & AUDIO_DEVICE_OUT_EARPIECE) { mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_EARPIECER, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if (mDlOutputDevice & AUDIO_DEVICE_OUT_SPEAKER) { mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_SPEAKERR, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if ((mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADSET) || (mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADPHONE)) { if (mAudioAnalogInstance->GetAnalogState(AudioAnalogType::DEVICE_IN_LINEINR) || mAudioAnalogInstance->GetAnalogState(AudioAnalogType::DEVICE_IN_LINEINL)) { ALOGD("SetHeadsetPinmux as MUX_LINEIN_AUDIO_MONO "); mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::MUX_LINEIN_AUDIO_MONO); mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETL, AudioAnalogType::MUX_LINEIN_AUDIO_MONO); } mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if (mDlOutputDevice & AUDIO_DEVICE_OUT_FM_TX) { // do nothing } if (mDlOutputDevice & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET) { // fix me , may not use headset mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if (mDlOutputDevice & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) { // do nothing } if (mDlOutputDevice & AUDIO_DEVICE_OUT_AUX_DIGITAL) { EnableAudioClock(AudioResourceManagerInterface::CLOCK_AUD_HDMI,true); //todo :: if htere is analog block need to turn on } } else { // open for dual mode if (mDlOutputDevice & AUDIO_DEVICE_OUT_SPEAKER) mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_R, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } // do set analog gain control if (IsModeIncall() == false) { mAudioVolumeInstance->setMasterVolume(mAudioVolumeInstance->getMasterVolume(), mAudioMode, mDlOutputDevice); } else { mAudioVolumeInstance->ApplyMicGain(GetIncallMicDevice(mDlOutputDevice), mAudioMode); // set incall mic gain mAudioVolumeInstance->setVoiceVolume(mAudioVolumeInstance->getVoiceVolume(), mAudioMode, mDlOutputDevice);// set DL volume } return NO_ERROR; }
status_t AudioResourceManager::TurnonAudioDevice(unsigned int mDlOutputDevice) { uint32 DeviceCount = PopCount(mDlOutputDevice); ALOGD("TurnonAudioDevice = 0x%x DeviceCount = %d", mDlOutputDevice, DeviceCount); #ifdef EXTMD_LOOPBACK_TEST //BTSCO UL sound out from headset&Speaker if (mDlOutputDevice & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) { ALOGD("EXTMD_LOOPBACK_TEST TurnonAudioDevice() AnalogClose() DEVICE_OUT_HEADSETR (to reset DL sampling frequency)"); mAudioAnalogInstance->AnalogClose(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE); mDlOutputDevice = AUDIO_DEVICE_OUT_WIRED_HEADSET; ALOGD("EXTMD_LOOPBACK_TEST TurnonAudioDevice() mDlOutputDevice=0x%x", mDlOutputDevice); } #endif if (DeviceCount == 1) { if (mDlOutputDevice & AUDIO_DEVICE_OUT_EARPIECE) { mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_EARPIECER, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if (mDlOutputDevice & AUDIO_DEVICE_OUT_SPEAKER) { mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_SPEAKERR, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if ((mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADSET) || (mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADPHONE)) { mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if (mDlOutputDevice & AUDIO_DEVICE_OUT_FM_TX) { // do nothing } if (mDlOutputDevice & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET) { // fix me , may not use headset mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } if (mDlOutputDevice & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) { // do nothing } if (mDlOutputDevice & AUDIO_DEVICE_OUT_AUX_DIGITAL) { EnableAudioClock(AudioResourceManagerInterface::CLOCK_AUD_HDMI, true); //todo :: if htere is analog block need to turn on } } else // open for dual mode { if (mDlOutputDevice & AUDIO_DEVICE_OUT_SPEAKER) { mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_R, AudioAnalogType::DEVICE_PLATFORM_MACHINE); } } // do set analog gain control if (IsModeIncall() == false) { mAudioVolumeInstance->setMasterVolume(mAudioVolumeInstance->getMasterVolume(), mAudioMode, mDlOutputDevice); } else { mAudioVolumeInstance->ApplyMicGain(GetIncallMicDevice(mDlOutputDevice), mAudioMode); // set incall mic gain mAudioVolumeInstance->setVoiceVolume(mAudioVolumeInstance->getVoiceVolume(), mAudioMode, mDlOutputDevice);// set DL volume } return NO_ERROR; }
status_t SpeechPhoneCallController::OpenModemSpeechControlFlow(const audio_mode_t audio_mode) { Mutex::Autolock _l(mLock); ALOGD("+%s(), audio_mode = %d", __FUNCTION__, audio_mode); if (IsModeIncall(audio_mode) == false) { ALOGE("-%s() new_mode(%d) != MODE_IN_CALL / MODE_IN_CALL_2", __FUNCTION__, audio_mode); return INVALID_OPERATION; } // get speech driver instance mSpeechDriverFactory->SetActiveModemIndexByAudioMode(audio_mode); const modem_index_t modem_index = mSpeechDriverFactory->GetActiveModemIndex(); SpeechDriverInterface *pSpeechDriver = mSpeechDriverFactory->GetSpeechDriver(); // check BT device const bool bt_device_on = android_audio_legacy::AudioSystem::isBluetoothScoDevice((android_audio_legacy::AudioSystem::audio_devices)mAudioResourceManager->getDlOutputDevice()); #if 1 int sample_rate; if (bt_device_on == true) { if (mBTMode == 0) //NB BTSCO { sample_rate = 8000; } else { sample_rate = 16000; } } else { sample_rate = 16000; } ALOGD("+%s(), bt_device_on = %d, sample_rate = %d", __FUNCTION__, bt_device_on, sample_rate); #else const int sample_rate = (bt_device_on == true) ? 8000 : 16000; // TODO: MT6628 BT only use NB #endif // enable clock SetAfeAnalogClock(true); // set sampling rate mAudioAnalogInstance->SetFrequency(AudioAnalogType::DEVICE_OUT_DAC, sample_rate); mAudioAnalogInstance->SetFrequency(AudioAnalogType::DEVICE_IN_ADC, sample_rate); // set device if (CheckTtyNeedOn() == true) { SetTtyInOutDevice(GetRoutingForTty(), mTty_Ctm, audio_mode); } else { // Note: set output device in phone call will also assign input device mAudioResourceManager->setDlOutputDevice(mAudioResourceManager->getDlOutputDevice()); } // get device const audio_devices_t output_device = (audio_devices_t)mAudioResourceManager->getDlOutputDevice(); const audio_devices_t input_device = (audio_devices_t)mAudioResourceManager->getUlInputDevice(); ALOGD("%s(), output_device = 0x%x, input_device = 0x%x", __FUNCTION__, output_device, input_device); // Open ADC/DAC I2S, or DAIBT OpenModemSpeechDigitalPart(modem_index, output_device); // AFE_ON mAudioDigitalInstance->SetAfeEnable(true); // Clean Side Tone Filter gain pSpeechDriver->SetSidetoneGain(0); // Set PMIC digital/analog part - uplink has pop, open first mAudioResourceManager->StartInputDevice(); if (bt_device_on == false) { usleep(kDelayForUplinkPulseMs * 1000); } // PMIC HW pulse // set MODEM_PCM - open modem pcm here s.t. modem/DSP can learn the uplink background noise, but not zero SetModemPcmAttribute(modem_index, sample_rate); mAudioDigitalInstance->SetModemPcmEnable(modem_index, true); // Set MD side sampling rate pSpeechDriver->SetModemSideSamplingRate(sample_rate); // Set speech mode pSpeechDriver->SetSpeechMode(input_device, output_device); // Speech/VT on if (mVtNeedOn == true) { pSpeechDriver->VideoTelephonyOn(); // trun on P2W for Video Telephony bool wideband_on = false; // VT default use Narrow Band (8k), modem side will SRC to 16K pSpeechDriver->PCM2WayOn(wideband_on); } else { pSpeechDriver->SpeechOn(); // turn on TTY if (CheckTtyNeedOn() == true) { pSpeechDriver->TtyCtmOn(BAUDOT_MODE); } } // Set PMIC digital/analog part - DL need trim code. mAudioResourceManager->StartOutputDevice(); // start Side Tone Filter if (CheckSideToneFilterNeedOn(output_device) == true) { mAudioDigitalInstance->EnableSideToneFilter(true); } // check VM need open SpeechVMRecorder *pSpeechVMRecorder = SpeechVMRecorder::GetInstance(); if (pSpeechVMRecorder->GetVMRecordCapability() == true) { ALOGD("%s(), Open VM/EPL record", __FUNCTION__); pSpeechVMRecorder->Open(); } ALOGD("-%s(), audio_mode = %d", __FUNCTION__, audio_mode); return NO_ERROR; }