status_t AudioALSAStreamIn::open() { // call open() only when mLock is locked. ASSERT(mLock.tryLock() != 0); ALOGD("%s()", __FUNCTION__); status_t status = NO_ERROR; if (mStandby == true) { mStandby = false; // create capture handler ASSERT(mCaptureHandler == NULL); mCaptureHandler = mStreamManager->createCaptureHandler(&mStreamAttributeTarget); // open audio hardware status = mCaptureHandler->open(); ASSERT(status == NO_ERROR); OpenPCMDump(); } return status; }
status_t AudioALSAStreamOut::open() { // call open() only when mLock is locked. ASSERT(mLock.tryLock() != 0); ALOGD("%s()", __FUNCTION__); status_t status = NO_ERROR; if (mStandby == true) { mStandby = false; // HDMI stereo + HDMI multi-channel => disable HDMI stereo if (mStreamOutType == STREAM_OUT_HDMI_MULTI_CHANNEL) { ALOGD("Force disable mStreamOutHDMIStereo"); AudioALSAStreamOut::setSuspendStreamOutHDMIStereo(true); if (mStreamOutHDMIStereo != NULL) { mStreamOutHDMIStereo->standby(); } } // create playback handler ASSERT(mPlaybackHandler == NULL); AudioALSASampleRateController::getInstance()->setScenarioStatus(PLAYBACK_SCENARIO_STREAM_OUT); mPlaybackHandler = mStreamManager->createPlaybackHandler(&mStreamAttributeSource); // open audio hardware status = mPlaybackHandler->open(); ASSERT(status == NO_ERROR); OpenPCMDump(LOG_TAG); } return status; }
status_t AudioALSAPlaybackHandlerBTSCO::open() { ALOGD("+%s(), mDevice = 0x%x", __FUNCTION__, mStreamAttributeSource->output_devices); // debug pcm dump OpenPCMDump(LOG_TAG); int pcmindex = AudioALSADeviceParser::getInstance()->GetPcmIndexByString(keypcmVOIPCallBTPlayback); int cardindex = AudioALSADeviceParser::getInstance()->GetCardIndexByString(keypcmVOIPCallBTPlayback); struct pcm_params *params; params = pcm_params_get(cardindex, pcmindex, PCM_OUT); if (params == NULL) { ALOGD("Device does not exist.\n"); } mStreamAttributeTarget.buffer_size = pcm_params_get_max(params, PCM_PARAM_BUFFER_BYTES); ALOGD("buffersizemax = %d", mStreamAttributeTarget.buffer_size); pcm_params_free(params); // HW attribute config // TODO(Harvey): query this #ifdef PLAYBACK_USE_24BITS_ONLY mStreamAttributeTarget.audio_format = AUDIO_FORMAT_PCM_8_24_BIT; #else mStreamAttributeTarget.audio_format = AUDIO_FORMAT_PCM_16_BIT; #endif mStreamAttributeTarget.audio_channel_mask = AUDIO_CHANNEL_IN_STEREO; mStreamAttributeTarget.num_channels = android_audio_legacy::AudioSystem::popCount(mStreamAttributeTarget.audio_channel_mask); mStreamAttributeTarget.sample_rate = mWCNChipController->GetBTCurrentSamplingRateNumber(); // HW pcm config mConfig.channels = mStreamAttributeTarget.num_channels; mConfig.rate = mStreamAttributeTarget.sample_rate; mConfig.period_count = 2; mConfig.period_size = (mStreamAttributeTarget.buffer_size / (mConfig.channels * mConfig.period_count)) / ((mStreamAttributeTarget.audio_format == AUDIO_FORMAT_PCM_16_BIT) ? 2 : 4); mConfig.format = transferAudioFormatToPcmFormat(mStreamAttributeTarget.audio_format); mConfig.start_threshold = 0; mConfig.stop_threshold = 0; mConfig.silence_threshold = 0; ALOGD("%s(), mConfig: channels = %d, rate = %d, period_size = %d, period_count = %d, format = %d", __FUNCTION__, mConfig.channels, mConfig.rate, mConfig.period_size, mConfig.period_count, mConfig.format); // SRC initBliSrc(); // bit conversion initBitConverter(); // open pcm driver openPcmDriver(pcmindex); ALOGD("-%s()", __FUNCTION__); return NO_ERROR; }
status_t AudioALSACaptureDataProviderBTSCO::open() { ALOGD("%s()", __FUNCTION__); ASSERT(mClientLock.tryLock() != 0); // lock by base class attach AudioAutoTimeoutLock _l(mEnableLock); ASSERT(mEnable == false); // config attribute (will used in client SRC/Enh/... later) // TODO(Harvey): query this mStreamAttributeSource.audio_format = AUDIO_FORMAT_PCM_16_BIT; mStreamAttributeSource.audio_channel_mask = AUDIO_CHANNEL_IN_MONO; mStreamAttributeSource.num_channels = android_audio_legacy::AudioSystem::popCount(mStreamAttributeSource.audio_channel_mask); mStreamAttributeSource.sample_rate = mWCNChipController->GetBTCurrentSamplingRateNumber(); // pcm config mConfig.channels = mStreamAttributeSource.num_channels; mConfig.rate = mStreamAttributeSource.sample_rate; // Buffer size: 2048(period_size) * 1(ch) * 2(byte) * 4(period_count) = 16 kb mConfig.period_size = 2048; mConfig.period_count = 4; mConfig.format = PCM_FORMAT_S16_LE; mConfig.start_threshold = 0; mConfig.stop_threshold = 0; mConfig.silence_threshold = 0; ALOGD("%s(), audio_format = %d, audio_channel_mask=%x, num_channels=%d, sample_rate=%d", __FUNCTION__, mStreamAttributeSource.audio_format, mStreamAttributeSource.audio_channel_mask, mStreamAttributeSource.num_channels, mStreamAttributeSource.sample_rate); ALOGD("%s(), format = %d, channels=%d, rate=%d", __FUNCTION__, mConfig.format, mConfig.channels, mConfig.rate); OpenPCMDump(LOG_TAG); // enable pcm ASSERT(mPcm == NULL); mPcm = pcm_open(0, 12, PCM_IN | PCM_MONOTONIC, &mConfig); ASSERT(mPcm != NULL && pcm_is_ready(mPcm) == true); ALOGV("%s(), mPcm = %p", __FUNCTION__, mPcm); pcm_start(mPcm); // create reading thread mEnable = true; int ret = pthread_create(&hReadThread, NULL, AudioALSACaptureDataProviderBTSCO::readThread, (void *)this); if (ret != 0) { ALOGE("%s() create thread fail!!", __FUNCTION__); return UNKNOWN_ERROR; } return NO_ERROR; }
status_t AudioALSACaptureDataProviderVoiceDL::open() { ALOGD("%s()", __FUNCTION__); ASSERT(mClientLock.tryLock() != 0); // lock by base class attach AudioAutoTimeoutLock _l(mEnableLock); ASSERT(mEnable == false); SpeechDataProcessingHandler::getInstance()->getStreamAttributeSource(&mStreamAttributeSource); ALOGD("%s(), mStreamAttributeSource: audio_format = %d, num_channels = %d, audio_channel_mask = %x, sample_rate = %d\n", __FUNCTION__, mStreamAttributeSource.audio_format, mStreamAttributeSource.num_channels, mStreamAttributeSource.audio_channel_mask, mStreamAttributeSource.sample_rate); mEnable = true; OpenPCMDump(LOG_TAG); return SpeechDataProcessingHandler::getInstance()->recordOn(RECORD_TYPE_DL); }
status_t AudioALSACaptureDataProviderBTCVSD::open() { ALOGD("%s()", __FUNCTION__); ASSERT(mClientLock.tryLock() != 0); // lock by base class attach AudioAutoTimeoutLock _l(mEnableLock); ASSERT(mEnable == false); // config attribute (will used in client SRC/Enh/... later) mStreamAttributeSource.audio_format = AUDIO_FORMAT_PCM_16_BIT; mStreamAttributeSource.audio_channel_mask = AUDIO_CHANNEL_IN_MONO; mStreamAttributeSource.num_channels = android_audio_legacy::AudioSystem::popCount(mStreamAttributeSource.audio_channel_mask); mStreamAttributeSource.sample_rate = mWCNChipController->GetBTCurrentSamplingRateNumber(); if (mAudioBTCVSDControl->BT_SCO_isWideBand() == true) { mReadBufferSize = MSBC_PCM_FRAME_BYTE * 6 * 2; // 16k mono->48k stereo } else { mReadBufferSize = SCO_RX_PCM8K_BUF_SIZE * 12 * 2; // 8k mono->48k stereo } ALOGD("%s(), audio_format = %d, audio_channel_mask=%x, num_channels=%d, sample_rate=%d", __FUNCTION__, mStreamAttributeSource.audio_format, mStreamAttributeSource.audio_channel_mask, mStreamAttributeSource.num_channels, mStreamAttributeSource.sample_rate); OpenPCMDump(LOG_TAG); // enable bt cvsd driver mAudioBTCVSDControl->BT_SCO_RX_Begin(mFd2); // create reading thread mEnable = true; int ret = pthread_create(&hReadThread, NULL, AudioALSACaptureDataProviderBTCVSD::readThread, (void *)this); if (ret != 0) { ALOGE("%s() create thread fail!!", __FUNCTION__); return UNKNOWN_ERROR; } return NO_ERROR; }
status_t AudioALSACaptureDataProviderVoice::open() { ALOGD("%s()", __FUNCTION__); ASSERT(mClientLock.tryLock() != 0); // lock by base class attach AudioAutoTimeoutLock _l(mEnableLock); ASSERT(mEnable == false); // config attribute (will used in client SRC/Enh/... later) SpeechDriverInterface *pSpeechDriver = SpeechDriverFactory::GetInstance()->GetSpeechDriver(); mStreamAttributeSource.audio_format = AUDIO_FORMAT_PCM_16_BIT; mStreamAttributeSource.num_channels = pSpeechDriver->GetRecordChannelNumber(); mStreamAttributeSource.audio_channel_mask = (mStreamAttributeSource.num_channels == 1) ? AUDIO_CHANNEL_IN_MONO : AUDIO_CHANNEL_IN_STEREO; mStreamAttributeSource.sample_rate = pSpeechDriver->GetRecordSampleRate(); mEnable = true; OpenPCMDump(LOG_TAG); return SpeechDriverFactory::GetInstance()->GetSpeechDriver()->RecordOn(); }
status_t AudioALSACaptureDataProviderTDM::open() { ALOGD("%s()", __FUNCTION__); ASSERT(mClientLock.tryLock() != 0); // lock by base class attach AudioAutoTimeoutLock _l(mEnableLock); AudioAutoTimeoutLock _l2(*AudioALSADriverUtility::getInstance()->getStreamSramDramLock()); ASSERT(mEnable == false); // config attribute (will used in client SRC/Enh/... later) // TODO(Harvey): query this mStreamAttributeSource.audio_format = AUDIO_FORMAT_PCM_16_BIT; mStreamAttributeSource.audio_channel_mask = AUDIO_CHANNEL_IN_STEREO; mStreamAttributeSource.num_channels = android_audio_legacy::AudioSystem::popCount(mStreamAttributeSource.audio_channel_mask); mStreamAttributeSource.sample_rate = 44100; OpenPCMDump(LOG_TAG); // enable pcm ASSERT(mPcm == NULL); mPcm = pcm_open(0, 13, PCM_IN, &mConfig); // mPcm = pcm_open(0, 1, PCM_IN, &mConfig); ASSERT(mPcm != NULL && pcm_is_ready(mPcm) == true); ALOGV("%s(), mPcm = %p", __FUNCTION__, mPcm); pcm_start(mPcm); // create reading thread mEnable = true; int ret = pthread_create(&hReadThread, NULL, AudioALSACaptureDataProviderTDM::readThread, (void *)this); if (ret != 0) { ALOGE("%s() create thread fail!!", __FUNCTION__); return UNKNOWN_ERROR; } return NO_ERROR; }
status_t AudioALSAPlaybackHandlerNormal::open() { ALOGD("+%s(), mDevice = 0x%x", __FUNCTION__, mStreamAttributeSource->output_devices); AudioAutoTimeoutLock _l(*AudioALSADriverUtility::getInstance()->getStreamSramDramLock()); // debug pcm dump OpenPCMDump(LOG_TAG); // acquire pmic clk mHardwareResourceManager->EnableAudBufClk(true); HpImpeDanceDetect(); int pcmindex = AudioALSADeviceParser::getInstance()->GetPcmIndexByString(keypcmI2S0Dl1Playback); int cardindex = AudioALSADeviceParser::getInstance()->GetCardIndexByString(keypcmI2S0Dl1Playback); ALOGD("AudioALSAPlaybackHandlerNormal::open() pcmindex = %d", pcmindex); ListPcmDriver(cardindex, pcmindex); struct pcm_params *params; params = pcm_params_get(cardindex, pcmindex, PCM_OUT); if (params == NULL) { ALOGD("Device does not exist.\n"); } mStreamAttributeTarget.buffer_size = pcm_params_get_max(params, PCM_PARAM_BUFFER_BYTES); pcm_params_free(params); // HW attribute config // TODO(Harvey): query this #ifdef PLAYBACK_USE_24BITS_ONLY mStreamAttributeTarget.audio_format = AUDIO_FORMAT_PCM_8_24_BIT; #else mStreamAttributeTarget.audio_format = (mStreamAttributeSource->audio_format == AUDIO_FORMAT_PCM_32_BIT) ? AUDIO_FORMAT_PCM_8_24_BIT : AUDIO_FORMAT_PCM_16_BIT; #endif mStreamAttributeTarget.audio_channel_mask = AUDIO_CHANNEL_IN_STEREO; mStreamAttributeTarget.num_channels = android_audio_legacy::AudioSystem::popCount(mStreamAttributeTarget.audio_channel_mask); mStreamAttributeTarget.sample_rate = ChooseTargetSampleRate(mStreamAttributeSource->sample_rate,mStreamAttributeSource->output_devices); // HW pcm config mConfig.channels = mStreamAttributeTarget.num_channels; mConfig.rate = mStreamAttributeTarget.sample_rate; // Buffer size: 1536(period_size) * 2(ch) * 4(byte) * 2(period_count) = 24 kb mConfig.period_count = 2; mConfig.period_size = (mStreamAttributeTarget.buffer_size / (mConfig.channels * mConfig.period_count)) / ((mStreamAttributeTarget.audio_format == AUDIO_FORMAT_PCM_16_BIT) ? 2 : 4); mConfig.format = transferAudioFormatToPcmFormat(mStreamAttributeTarget.audio_format); mConfig.start_threshold = 0; mConfig.stop_threshold = 0; mConfig.silence_threshold = 0; ALOGD("%s(), mConfig: channels = %d, rate = %d, period_size = %d, period_count = %d, format = %d", __FUNCTION__, mConfig.channels, mConfig.rate, mConfig.period_size, mConfig.period_count, mConfig.format); // post processing initPostProcessing(); #if defined(MTK_SPEAKER_MONITOR_SUPPORT) unsigned int fc, bw; int th; if (mAudioFilterManagerHandler) { AudioALSASpeakerMonitor::getInstance()->GetFilterParam(&fc, &bw, &th); ALOGD("%s(), fc %d bw %d, th %d", __FUNCTION__, fc, bw, th); mAudioFilterManagerHandler->setSpkFilterParam(fc, bw, th); } #endif // SRC initBliSrc(); // bit conversion initBitConverter(); initDataPending(); // disable lowjitter mode SetLowJitterMode(true, mStreamAttributeTarget.sample_rate); // open pcm driver openPcmDriver(pcmindex); // open codec driver mHardwareResourceManager->startOutputDevice(mStreamAttributeSource->output_devices, mStreamAttributeTarget.sample_rate); //============Voice UI&Unlock REFERECE============= AudioVUnlockDL *VUnlockhdl = AudioVUnlockDL::getInstance(); if (VUnlockhdl != NULL) { VUnlockhdl->SetInputStandBy(false); VUnlockhdl-> GetSRCInputParameter(mStreamAttributeTarget.sample_rate, mStreamAttributeTarget.num_channels, mStreamAttributeTarget.audio_format); VUnlockhdl->GetFirstDLTime(); } //=========================================== ALOGD("-%s()", __FUNCTION__); return NO_ERROR; }
status_t AudioALSACaptureDataProviderEchoRefExt::open() { ALOGD("%s()", __FUNCTION__); ASSERT(mClientLock.tryLock() != 0); // lock by base class attach AudioAutoTimeoutLock _l(mEnableLock); AudioAutoTimeoutLock _l2(*AudioALSADriverUtility::getInstance()->getStreamSramDramLock()); ASSERT(mEnable == false); AudioALSASampleRateController *pAudioALSASampleRateController = AudioALSASampleRateController::getInstance(); pAudioALSASampleRateController->setScenarioStatus(PLAYBACK_SCENARIO_ECHO_REF_EXT); // config attribute (will used in client SRC/Enh/... later) // TODO(Sam): query the mConfig? mStreamAttributeSource.audio_format = AUDIO_FORMAT_PCM_16_BIT; mStreamAttributeSource.audio_channel_mask = AUDIO_CHANNEL_IN_STEREO; mStreamAttributeSource.num_channels = android_audio_legacy::AudioSystem::popCount(mStreamAttributeSource.audio_channel_mask); mStreamAttributeSource.sample_rate = AudioALSASampleRateController::getInstance()->getPrimaryStreamOutSampleRate(); mConfig.channels = mStreamAttributeSource.num_channels; mConfig.rate = mStreamAttributeSource.sample_rate; // Buffer size: 2048(period_size) * 2(ch) * 2(byte) * 8(period_count) = 64 kb mConfig.period_size = 2048; mConfig.period_count = 8; mConfig.format = PCM_FORMAT_S16_LE; mConfig.start_threshold = 0; mConfig.stop_threshold = 0; mConfig.silence_threshold = 0; #if 0 //latency time, set as DataProvider buffer size mStreamAttributeSource.latency = (kReadBufferSize * 1000) / (mStreamAttributeSource.num_channels * mStreamAttributeSource.sample_rate * (mStreamAttributeSource.audio_format == AUDIO_FORMAT_PCM_8_BIT ? 1 : //8 1byte/frame (mStreamAttributeSource.audio_format == AUDIO_FORMAT_PCM_32_BIT ? 4 : //24bit 3bytes/frame 2))); //default 2bytes/sample #else //latency time, set as hardware buffer size mStreamAttributeSource.latency = (mConfig.period_size * mConfig.period_count * 1000) / mConfig.rate; #endif ALOGD("%s(), audio_format = %d, audio_channel_mask=%x, num_channels=%d, sample_rate=%d, latency=%dms", __FUNCTION__, mStreamAttributeSource.audio_format, mStreamAttributeSource.audio_channel_mask, mStreamAttributeSource.num_channels, mStreamAttributeSource.sample_rate, mStreamAttributeSource.latency); ALOGD("%s(), format = %d, channels=%d, rate=%d", __FUNCTION__, mConfig.format, mConfig.channels, mConfig.rate); #ifdef NXP_SMARTPA_SUPPORT MTK_Tfa98xx_EchoReferenceConfigure(1); #endif OpenPCMDump(LOG_TAG); // enable pcm ASSERT(mPcm == NULL); mPcm = pcm_open(0, 16, PCM_IN | PCM_MONOTONIC, &mConfig); ASSERT(mPcm != NULL && pcm_is_ready(mPcm) == true); pcm_start(mPcm); // create reading thread mEnable = true; int ret = pthread_create(&hReadThread, NULL, AudioALSACaptureDataProviderEchoRefExt::readThread, (void *)this); if (ret != 0) { ALOGE("%s() create thread fail!!", __FUNCTION__); return UNKNOWN_ERROR; } return NO_ERROR; }
status_t AudioALSAPlaybackHandlerSphDL::open() { ALOGD("+%s(), mDevice = 0x%x", __FUNCTION__, mStreamAttributeSource->output_devices); // debug pcm dump OpenPCMDump(LOG_TAG); int pcmindex = AudioALSADeviceParser::getInstance()->GetPcmIndexByString(keypcmI2S0Dl1Playback); int cardindex = AudioALSADeviceParser::getInstance()->GetCardIndexByString(keypcmI2S0Dl1Playback); ALOGD("AudioALSAPlaybackHandlerSphDL::open() pcmindex = %d", pcmindex); ListPcmDriver(cardindex, pcmindex); struct pcm_params *params; params = pcm_params_get(cardindex, pcmindex, PCM_OUT); if (params == NULL) { ALOGD("Device does not exist.\n"); } mStreamAttributeTarget.buffer_size = pcm_params_get_max(params, PCM_PARAM_BUFFER_BYTES); ALOGD("buffersizemax = %d", mStreamAttributeTarget.buffer_size); pcm_params_free(params); // HW attribute config // TODO(Harvey): query this mStreamAttributeTarget.audio_format = AUDIO_FORMAT_PCM_16_BIT; mStreamAttributeTarget.audio_channel_mask = AUDIO_CHANNEL_IN_MONO; mStreamAttributeTarget.num_channels = android_audio_legacy::AudioSystem::popCount(mStreamAttributeTarget.audio_channel_mask); mStreamAttributeTarget.sample_rate = mStreamAttributeSource->sample_rate; // same as source stream // HW pcm config mConfig.channels = mStreamAttributeTarget.num_channels; mConfig.rate = mStreamAttributeTarget.sample_rate; // Buffer size: 1536(period_size) * 2(ch) * 4(byte) * 2(period_count) = 24 kb mConfig.period_count = 4; //mConfig.period_size = (0x4000/(mConfig.channels*mConfig.period_count))/((mStreamAttributeTarget.audio_format == AUDIO_FORMAT_PCM_16_BIT) ? 2 : 4); mConfig.period_size = 512; mConfig.format = transferAudioFormatToPcmFormat(mStreamAttributeTarget.audio_format); mConfig.start_threshold = 0; mConfig.stop_threshold = 0; mConfig.silence_threshold = 0; ALOGD("%s(), mConfig: channels = %d, rate = %d, period_size = %d, period_count = %d, format = %d", __FUNCTION__, mConfig.channels, mConfig.rate, mConfig.period_size, mConfig.period_count, mConfig.format); // post processing initPostProcessing(); #if defined(MTK_SPEAKER_MONITOR_SUPPORT) unsigned int fc, bw; int th; if (mAudioFilterManagerHandler) { AudioALSASpeakerMonitor::getInstance()->GetFilterParam(&fc, &bw, &th); ALOGD("%s(), fc %d bw %d, th %d", __FUNCTION__, fc, bw, th); mAudioFilterManagerHandler->setSpkFilterParam(fc, bw, th); } #endif // SRC initBliSrc(); // bit conversion initBitConverter(); // open pcm driver openPcmDriver(pcmindex); //Echo reference path if (mixer_ctl_set_enum_by_string(mixer_get_ctl_by_name(mMixer, "Audio_Dl1_MD_Echo_Ref_Switch"), "On")) { ALOGE("Error: Audio_Dl1_MD_Echo_Ref_Switch invalid value"); } // open codec driver // Don't startoutputDevice here, let speech driver to open. mHardwareResourceManager->startOutputDevice(mStreamAttributeSource->output_devices, mStreamAttributeTarget.sample_rate); ALOGD("-%s()", __FUNCTION__); return NO_ERROR; }
status_t AudioALSAPlaybackHandlerOffload::open() { ALOGD("+%s(), mDevice = 0x%x", __FUNCTION__, mStreamAttributeSource->output_devices); ALOGD("%s(), mStreamAttributeSource: format = %d",__FUNCTION__, mStreamAttributeSource->audio_format); AudioAutoTimeoutLock _l(*AudioALSADriverUtility::getInstance()->getStreamSramDramLock()); // debug pcm dump OpenPCMDump(LOG_TAG); // acquire pmic clk mHardwareResourceManager->EnableAudBufClk(true); //doug to check //HpImpeDanceDetect(); //doug to check #if 1 int pcmindex = AudioALSADeviceParser::getInstance()->GetPcmIndexByString(keypcmDl1Meida); int cardindex = AudioALSADeviceParser::getInstance()->GetCardIndexByString(keypcmDl1Meida); ALOGD("AudioALSAPlaybackHandlerOffload::open() pcmindex = %d", pcmindex); ListPcmDriver(cardindex, pcmindex); struct pcm_params *params; params = pcm_params_get(cardindex, pcmindex, PCM_OUT); if (params == NULL) { ALOGD("Device does not exist.\n"); } mStreamAttributeTarget.buffer_size = pcm_params_get_max(params, PCM_PARAM_BUFFER_BYTES); ALOGD("%s buffersizemax = %d", __FUNCTION__, mStreamAttributeTarget.buffer_size); pcm_params_free(params); #endif //mStreamAttributeTarget.buffer_size = 32768; //#ifdef PLAYBACK_USE_24BITS_ONLY //mStreamAttributeTarget.audio_format = AUDIO_FORMAT_PCM_32_BIT; mStreamAttributeTarget.audio_format = AUDIO_FORMAT_PCM_8_24_BIT; //mStreamAttributeTarget.audio_format = AUDIO_FORMAT_PCM_16_BIT; //#else // mStreamAttributeTarget.audio_format = (mStreamAttributeSource->audio_format == AUDIO_FORMAT_PCM_32_BIT) ? AUDIO_FORMAT_PCM_8_24_BIT : AUDIO_FORMAT_PCM_16_BIT; //#endif mStreamAttributeTarget.audio_channel_mask = AUDIO_CHANNEL_IN_STEREO; mStreamAttributeTarget.num_channels = android_audio_legacy::AudioSystem::popCount(mStreamAttributeTarget.audio_channel_mask); mStreamAttributeTarget.sample_rate = ChooseTargetSampleRate(mStreamAttributeSource->sample_rate); // HW pcm config mConfig.channels = mStreamAttributeTarget.num_channels; mConfig.rate = mStreamAttributeTarget.sample_rate; // Buffer size: 1536(period_size) * 2(ch) * 4(byte) * 2(period_count) = 24 kb mConfig.period_count = 2; mConfig.period_size = (mStreamAttributeTarget.buffer_size / (mConfig.channels * mConfig.period_count)) / ((mStreamAttributeTarget.audio_format == AUDIO_FORMAT_PCM_16_BIT) ? 2 : 4); mConfig.format = transferAudioFormatToPcmFormat(mStreamAttributeTarget.audio_format); mConfig.start_threshold = 0; mConfig.stop_threshold = 0; mConfig.silence_threshold = 0; ALOGD("%s(), mConfig: channels = %d, rate = %d, period_size = %d, period_count = %d, format = %d", __FUNCTION__, mConfig.channels, mConfig.rate, mConfig.period_size, mConfig.period_count, mConfig.format); mComprConfig.codec = (struct snd_codec*)malloc(sizeof(struct snd_codec)); if(mComprConfig.codec == NULL) ALOGE("%s(), allocate mComprConfig.codec fail"); mComprConfig.fragments = 1024; mComprConfig.fragment_size = 8192; //mComprConfig.fragment_size = mStreamAttributeTarget.buffer_size; mComprConfig.codec->sample_rate = mStreamAttributeTarget.sample_rate; mComprConfig.codec->reserved[0] = mConfig.period_size; mComprConfig.codec->reserved[1] = mComprConfig.fragments*mComprConfig.fragment_size; if(mConfig.format == PCM_FORMAT_S16_LE) mComprConfig.codec->format = SNDRV_PCM_FORMAT_S16_LE; else mComprConfig.codec->format = SNDRV_PCM_FORMAT_S32_LE; mComprConfig.codec->id = SND_AUDIOCODEC_MP3; mComprConfig.codec->ch_in = 2; mComprConfig.codec->ch_out = 2; //init decoder mDecHandler = AudioDecHandlerCreate(); if(mDecHandler == NULL) { ALOGE("+%s(), DecHandler create fail", __FUNCTION__); ASSERT(false); return -ENOSYS; } if(!mDecHandler->InitAudioDecoder()) { ALOGE("+%s(), Decoder IP init fail", __FUNCTION__); ASSERT(false); return -ENOSYS; } // post processing initPostProcessing(); // SRC initBliSrc(); // bit conversion initBitConverter(); initDataPending(); // disable lowjitter mode //doug to check SetLowJitterMode(true, mStreamAttributeTarget.sample_rate); openComprDriver(23); if( compress_set_gapless_metadata(mComprStream, &offload_stream.offload_mdata) != 0) ALOGE("%s(), compress_set_gapless_metadata() error= %s", __FUNCTION__, compress_get_error(mComprStream)); mHardwareResourceManager->startOutputDevice(mStreamAttributeSource->output_devices, mStreamAttributeTarget.sample_rate); offload_stream.tmpBuffer = (void*)malloc(mComprConfig.fragment_size); mWritebytes = mComprConfig.fragment_size; list_init(&offload_stream.offload_cmd_list); int ret = pthread_mutex_init(&offload_stream.offload_mutex, NULL); if (ret != 0) { ALOGE("%s, Failed to initialize Mutex!", __FUNCTION__); ASSERT(false); return -ENOSYS; } ret = pthread_cond_init(&offload_stream.offload_cond, NULL); if (ret != 0) { ALOGE("%s, Failed to initialize Cond!", __FUNCTION__); ASSERT(false); return -ENOSYS; } threadExit = false; ret = pthread_create(&offload_stream.offload_pthread, NULL, &offload_threadloop, this); if (ret != 0) { ALOGE("%s() create thread OffloadWrite fail!!", __FUNCTION__); ASSERT(false); return -ENOSYS; } usleep(1 * 1000); ALOGD("-%s()", __FUNCTION__); return NO_ERROR; }