diff --git a/broadcastradio/aidl/default/BroadcastRadio.cpp b/broadcastradio/aidl/default/BroadcastRadio.cpp index f82e767a77..3af560f62c 100644 --- a/broadcastradio/aidl/default/BroadcastRadio.cpp +++ b/broadcastradio/aidl/default/BroadcastRadio.cpp @@ -245,7 +245,10 @@ ProgramInfo BroadcastRadio::tuneInternalLocked(const ProgramSelector& sel) { } programInfo = makeSampleProgramInfo(sel); } - mIsTuneCompleted = true; + programInfo.infoFlags |= ProgramInfo::FLAG_SIGNAL_ACQUISITION; + if (programInfo.selector.primaryId.type != IdentifierType::HD_STATION_ID_EXT) { + mIsTuneCompleted = true; + } if (adjustAmFmRangeLocked()) { startProgramListUpdatesLocked({}); } @@ -276,6 +279,32 @@ ScopedAStatus BroadcastRadio::unsetTunerCallback() { return ScopedAStatus::ok(); } +void BroadcastRadio::handleProgramInfoUpdateRadioCallback( + ProgramInfo programInfo, const std::shared_ptr& callback) { + callback->onCurrentProgramInfoChanged(programInfo); + if (programInfo.selector.primaryId.type != IdentifierType::HD_STATION_ID_EXT) { + return; + } + ProgramSelector sel = programInfo.selector; + auto cancelTask = [sel, callback]() { callback->onTuneFailed(Result::CANCELED, sel); }; + programInfo.infoFlags |= ProgramInfo::FLAG_HD_SIS_ACQUISITION; + auto sisAcquiredTask = [this, callback, programInfo, cancelTask]() { + callback->onCurrentProgramInfoChanged(programInfo); + auto audioAcquiredTask = [this, callback, programInfo]() { + ProgramInfo hdProgramInfoWithAudio = programInfo; + hdProgramInfoWithAudio.infoFlags |= ProgramInfo::FLAG_HD_AUDIO_ACQUISITION; + callback->onCurrentProgramInfoChanged(hdProgramInfoWithAudio); + lock_guard lk(mMutex); + mIsTuneCompleted = true; + }; + lock_guard lk(mMutex); + mTuningThread->schedule(audioAcquiredTask, cancelTask, kTuneDelayTimeMs); + }; + + lock_guard lk(mMutex); + mTuningThread->schedule(sisAcquiredTask, cancelTask, kTuneDelayTimeMs); +} + ScopedAStatus BroadcastRadio::tune(const ProgramSelector& program) { LOG(DEBUG) << __func__ << ": tune to " << program.toString() << "..."; @@ -308,7 +337,7 @@ ScopedAStatus BroadcastRadio::tune(const ProgramSelector& program) { lock_guard lk(mMutex); programInfo = tuneInternalLocked(program); } - callback->onCurrentProgramInfoChanged(programInfo); + handleProgramInfoUpdateRadioCallback(programInfo, callback); }; auto cancelTask = [program, callback]() { callback->onTuneFailed(Result::CANCELED, program); }; mTuningThread->schedule(task, cancelTask, kTuneDelayTimeMs); @@ -456,7 +485,7 @@ ScopedAStatus BroadcastRadio::seek(bool directionUp, bool skipSubChannel) { lock_guard lk(mMutex); programInfo = tuneInternalLocked(nextProgram.selector); } - callback->onCurrentProgramInfoChanged(programInfo); + handleProgramInfoUpdateRadioCallback(programInfo, callback); }; mTuningThread->schedule(task, cancelTask, kSeekDelayTimeMs); @@ -512,7 +541,7 @@ ScopedAStatus BroadcastRadio::step(bool directionUp) { lock_guard lk(mMutex); programInfo = tuneInternalLocked(utils::makeSelectorAmfm(stepTo)); } - callback->onCurrentProgramInfoChanged(programInfo); + handleProgramInfoUpdateRadioCallback(programInfo, callback); }; auto cancelTask = [callback]() { callback->onTuneFailed(Result::CANCELED, {}); }; mTuningThread->schedule(task, cancelTask, kStepDelayTimeMs); diff --git a/broadcastradio/aidl/default/BroadcastRadio.h b/broadcastradio/aidl/default/BroadcastRadio.h index e43d7c5673..60ea90743a 100644 --- a/broadcastradio/aidl/default/BroadcastRadio.h +++ b/broadcastradio/aidl/default/BroadcastRadio.h @@ -91,6 +91,9 @@ class BroadcastRadio final : public BnBroadcastRadio { ProgramInfo tuneInternalLocked(const ProgramSelector& sel) REQUIRES(mMutex); void startProgramListUpdatesLocked(const ProgramFilter& filter) REQUIRES(mMutex); void cancelProgramListUpdateLocked() REQUIRES(mMutex); + void handleProgramInfoUpdateRadioCallback(ProgramInfo programInfo, + const std::shared_ptr& callback) + EXCLUDES(mMutex); bool findNextLocked(const ProgramSelector& current, bool directionUp, bool skipSubChannel, VirtualProgram* nextProgram) const REQUIRES(mMutex); void jumpToFirstSubChannelLocked(std::vector::const_iterator& it) const