diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 088b3b6d29498..a384befacc546 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -432,6 +432,7 @@ public class Tuner implements AutoCloseable { mFrontend = tuner.mFrontend; mIsSharedFrontend = true; } + nativeShareFrontend(mFrontend.mId); } /** @@ -551,6 +552,7 @@ public class Tuner implements AutoCloseable { * Native method to open frontend of the given ID. */ private native Frontend nativeOpenFrontendByHandle(int handle); + private native int nativeShareFrontend(int id); @Result private native int nativeTune(int type, FrontendSettings settings); private native int nativeStopTune(); diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 3cf9b03708235..e4f3f33964071 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -1173,6 +1173,8 @@ JTuner::JTuner(JNIEnv *env, jobject thiz) if (mTunerClient == NULL) { mTunerClient = new TunerClient(); } + + mSharedFeId = (int) Constant::INVALID_FRONTEND_ID; } JTuner::~JTuner() { @@ -1253,6 +1255,17 @@ jobject JTuner::openFrontendByHandle(int feHandle) { (jint) mFeId); } +int JTuner::shareFrontend(int feId) { + if (mFeClient != NULL) { + ALOGE("Cannot share frontend:%d because this session is already holding %d", + feId, mFeClient->getId()); + return (int)Result::INVALID_STATE; + } + + mSharedFeId = feId; + return (int)Result::SUCCESS; +} + jobject JTuner::getAnalogFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) { jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AnalogFrontendCapabilities"); jmethodID capsInit = env->GetMethodID(clazz, "", "(II)V"); @@ -1605,7 +1618,9 @@ Result JTuner::openDemux(int handle) { return Result::UNKNOWN_ERROR; } if (mFeClient != NULL) { - mDemuxClient->setFrontendDataSource(mFeClient); + return mDemuxClient->setFrontendDataSource(mFeClient); + } else if (mSharedFeId != (int) Constant::INVALID_FRONTEND_ID) { + return mDemuxClient->setFrontendDataSourceById(mSharedFeId); } } @@ -1629,6 +1644,8 @@ jint JTuner::close() { } mDemuxClient = NULL; } + + mSharedFeId = (int) Constant::INVALID_FRONTEND_ID; return (jint) res; } @@ -3229,6 +3246,12 @@ static jobject android_media_tv_Tuner_open_frontend_by_handle( return tuner->openFrontendByHandle(handle); } +static int android_media_tv_Tuner_share_frontend( + JNIEnv *env, jobject thiz, jint id) { + sp tuner = getTuner(env, thiz); + return tuner->shareFrontend(id); +} + static int android_media_tv_Tuner_tune(JNIEnv *env, jobject thiz, jint type, jobject settings) { sp tuner = getTuner(env, thiz); FrontendSettings setting = getFrontendSettings(env, type, settings); @@ -4307,6 +4330,8 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_get_frontend_ids }, { "nativeOpenFrontendByHandle", "(I)Landroid/media/tv/tuner/Tuner$Frontend;", (void *)android_media_tv_Tuner_open_frontend_by_handle }, + { "nativeShareFrontend", "(I)I", + (void *)android_media_tv_Tuner_share_frontend }, { "nativeTune", "(ILandroid/media/tv/tuner/frontend/FrontendSettings;)I", (void *)android_media_tv_Tuner_tune }, { "nativeStopTune", "()I", (void *)android_media_tv_Tuner_stop_tune }, diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index 2a933b207902a..5d3b0a33dc9bf 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -179,6 +179,7 @@ struct JTuner : public RefBase { int unlinkCiCam(jint id); jobject getFrontendIds(); jobject openFrontendByHandle(int feHandle); + int shareFrontend(int feId); jint closeFrontendById(int id); jobject getFrontendInfo(int id); int tune(const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1); @@ -210,6 +211,7 @@ private: static sp mTunerClient; sp mFeClient; int mFeId; + int mSharedFeId; sp mLnbClient; sp mDemuxClient; static jobject getAnalogFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps); diff --git a/media/jni/tuner/DemuxClient.cpp b/media/jni/tuner/DemuxClient.cpp index 78cb5b003a382..6c4295b12e7a8 100644 --- a/media/jni/tuner/DemuxClient.cpp +++ b/media/jni/tuner/DemuxClient.cpp @@ -60,6 +60,15 @@ Result DemuxClient::setFrontendDataSource(sp frontendClient) { return Result::INVALID_STATE; } +Result DemuxClient::setFrontendDataSourceById(int frontendId) { + if (mTunerDemux != NULL) { + Status s = mTunerDemux->setFrontendDataSourceById(frontendId); + return ClientHelper::getServiceSpecificErrorCode(s); + } + + return Result::INVALID_STATE; +} + sp DemuxClient::openFilter(DemuxFilterType type, int bufferSize, sp cb) { if (mTunerDemux != NULL) { diff --git a/media/jni/tuner/DemuxClient.h b/media/jni/tuner/DemuxClient.h index c38a8fa346905..46b0a3d4c9b80 100644 --- a/media/jni/tuner/DemuxClient.h +++ b/media/jni/tuner/DemuxClient.h @@ -60,6 +60,11 @@ public: */ Result setFrontendDataSource(sp frontendClient); + /** + * Set a frontend resource by handle as data input of the demux. + */ + Result setFrontendDataSourceById(int frontendId); + /** * Open a new filter client. */