static int mtk_voice_bt1_prepare(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtimeStream = substream->runtime; pr_debug("mtk_alsa_prepare rate = %d channels = %d period_size = %lu\n", runtimeStream->rate, runtimeStream->channels, runtimeStream->period_size); if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { pr_err("%s with SNDRV_PCM_STREAM_CAPTURE\n", __func__); return 0; } AudDrv_ANA_Clk_On(); AudDrv_Clk_On(); /* here start digital part */ SetConnection(Soc_Aud_InterCon_Connection, Soc_Aud_InterConnectionInput_I02, Soc_Aud_InterConnectionOutput_O17); SetConnection(Soc_Aud_InterCon_Connection, Soc_Aud_InterConnectionInput_I02, Soc_Aud_InterConnectionOutput_O18); SetConnection(Soc_Aud_InterCon_Connection, Soc_Aud_InterConnectionInput_I14, Soc_Aud_InterConnectionOutput_O02); SetConnection(Soc_Aud_InterCon_Connection, Soc_Aud_InterConnectionInput_I21, Soc_Aud_InterConnectionOutput_O08); if (GetMemoryPathEnable(Soc_Aud_Digital_Block_DAI_BT) == false) { /* set merge interface */ SetMemoryPathEnable(Soc_Aud_Digital_Block_DAI_BT, true); } else SetMemoryPathEnable(Soc_Aud_Digital_Block_DAI_BT, true); /* now use samplerate 8000 */ SetModemSpeechDAIBTAttribute(runtimeStream->rate); SetDaiBtEnable(true); voice_bt1Pcm.mPcmModeWidebandSel = (runtimeStream->rate == 8000) ? Soc_Aud_PCM_MODE_PCM_MODE_8K : Soc_Aud_PCM_MODE_PCM_MODE_16K; voice_bt1Pcm.mAsyncFifoSel = Soc_Aud_BYPASS_SRC_SLAVE_USE_ASYNC_FIFO; SetModemPcmConfig(MODEM_1, voice_bt1Pcm); SetModemPcmEnable(MODEM_1, true); EnableAfe(true); voice_bt_Status = true; return 0; }
status_t SpeechPhoneCallController::OpenModemSpeechDigitalPart(const modem_index_t modem_index, const audio_devices_t output_device) { const bool bt_device_on = android_audio_legacy::AudioSystem::isBluetoothScoDevice((android_audio_legacy::AudioSystem::audio_devices)output_device); int sample_rate; if (bt_device_on == true) { if (mBTMode == 0) //NB BTSCO { sample_rate = 8000; } else { sample_rate = 16000; } } else { sample_rate = 16000; } if (bt_device_on) // DAIBT { SetModemSpeechInterConnection(AudioDigitalType::DAI_BT, modem_index, AudioDigitalType::Connection); SetModemSpeechDAIBTAttribute(sample_rate); mAudioDigitalInstance->SetDAIBTEnable(true); #ifdef DAIBT_NO_INTERCONNECTION_TO_MODEM_PCM // DAIBT <-> HW_GAIN2 <-> MODEM_PCM AudioMEMIFAttribute::SAMPLINGRATE mem_sample_rate = (sample_rate == 8000) ? AudioMEMIFAttribute::AFE_8000HZ : AudioMEMIFAttribute::AFE_16000HZ; // SET HW_GAIN2 mAudioDigitalInstance->SetHwDigitalGainMode(AudioDigitalType::HW_DIGITAL_GAIN2, mem_sample_rate, 0xC8); mAudioDigitalInstance->SetHwDigitalGain(0x80000, AudioDigitalType::HW_DIGITAL_GAIN2); mAudioDigitalInstance->SetHwDigitalCurrentGain(0x80000, AudioDigitalType::HW_DIGITAL_GAIN2); mAudioDigitalInstance->SetHwDigitalGainEnable(AudioDigitalType::HW_DIGITAL_GAIN2, true); // USE HW_GAIN2 MUST TURN ON "MASTER/SLAVE" I2S IN/OUT AudioDigtalI2S master_2nd_i2s_out_attribute; memset((void *)&master_2nd_i2s_out_attribute, 0, sizeof(master_2nd_i2s_out_attribute)); master_2nd_i2s_out_attribute.mI2S_SAMPLERATE = sample_rate; master_2nd_i2s_out_attribute.mINV_LRCK = AudioDigtalI2S::NO_INVERSE; master_2nd_i2s_out_attribute.mI2S_FMT = AudioDigtalI2S::I2S; master_2nd_i2s_out_attribute.mI2S_WLEN = AudioDigtalI2S::WLEN_16BITS; mAudioDigitalInstance->Set2ndI2SOut(&master_2nd_i2s_out_attribute); mAudioDigitalInstance->Set2ndI2SEnable(true); #endif } else // ADC/DAC I2S { SetModemSpeechInterConnection(AudioDigitalType::I2S_IN_ADC, modem_index, AudioDigitalType::Connection); SetModemSpeechInterConnection(AudioDigitalType::I2S_OUT_DAC, modem_index, AudioDigitalType::Connection); SetModemSpeechADCI2sInAttribute(sample_rate); SetModemSpeechDACI2sOutAttribute(sample_rate); mAudioDigitalInstance->SetI2SAdcEnable(true); mAudioDigitalInstance->SetI2SDacEnable(true); } return NO_ERROR; }