Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38904f8b authored by Hongguang's avatar Hongguang Committed by Hongguang Chen
Browse files

Add new features to tuner.

*) Support scan unlock event
*) Support get frontend hardware info.
*) Add scIndexMask to MediaEvent.
*) Support more AAC formats.
*) Move Lna to ITuner.

Bug: 203389496
Bug: 184017033
Bug: 202978951
Bug: 205265630
Bug: 203623028
Test: atest android.media.tv.tuner.cts on AIDL and HILD HALs.
Change-Id: Id1bf4f13e7afb5f4264bfc67ca7d822848c6e803
parent 772f18a1
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -6382,6 +6382,7 @@ package android.media.tv.tuner {
    method public int getAvSyncHwId(@NonNull android.media.tv.tuner.filter.Filter);
    method public long getAvSyncTime(int);
    method @Nullable public java.util.List<android.media.tv.tuner.frontend.FrontendInfo> getAvailableFrontendInfos();
    method @Nullable public String getCurrentFrontendHardwardInfo();
    method @Nullable public android.media.tv.tuner.DemuxCapabilities getDemuxCapabilities();
    method @Nullable public android.media.tv.tuner.frontend.FrontendInfo getFrontendInfo();
    method @Nullable public android.media.tv.tuner.frontend.FrontendStatus getFrontendStatus(@NonNull int[]);
@@ -6546,6 +6547,10 @@ package android.media.tv.tuner.filter {
    method public boolean isPassthrough();
    method public boolean useSecureMemory();
    field public static final int AUDIO_STREAM_TYPE_AAC = 6; // 0x6
    field public static final int AUDIO_STREAM_TYPE_AAC_ADTS = 16; // 0x10
    field public static final int AUDIO_STREAM_TYPE_AAC_HE_ADTS = 18; // 0x12
    field public static final int AUDIO_STREAM_TYPE_AAC_HE_LATM = 19; // 0x13
    field public static final int AUDIO_STREAM_TYPE_AAC_LATM = 17; // 0x11
    field public static final int AUDIO_STREAM_TYPE_AC3 = 7; // 0x7
    field public static final int AUDIO_STREAM_TYPE_AC4 = 9; // 0x9
    field public static final int AUDIO_STREAM_TYPE_DRA = 15; // 0xf
@@ -6707,6 +6712,7 @@ package android.media.tv.tuner.filter {
    method @IntRange(from=0) public int getMpuSequenceNumber();
    method public long getOffset();
    method public long getPts();
    method public int getScIndexMask();
    method public int getStreamId();
    method public boolean isDtsPresent();
    method public boolean isPrivateData();
@@ -7819,6 +7825,7 @@ package android.media.tv.tuner.frontend {
    method public void onScanStopped();
    method public void onSignalTypeReported(int);
    method public void onSymbolRatesReported(@NonNull int[]);
    method public default void onUnLocked();
  }
}
+47 −0
Original line number Diff line number Diff line
@@ -687,6 +687,7 @@ public class Tuner implements AutoCloseable {
    private native FrontendInfo nativeGetFrontendInfo(int id);
    private native Filter nativeOpenFilter(int type, int subType, long bufferSize);
    private native TimeFilter nativeOpenTimeFilter();
    private native String nativeGetFrontendHardwareInfo();

    private native Lnb nativeOpenLnbByHandle(int handle);
    private native Lnb nativeOpenLnbByName(String name);
@@ -1278,6 +1279,34 @@ public class Tuner implements AutoCloseable {
        return Arrays.asList(feInfoList);
    }

    /**
     * Gets the currently initialized and activated frontend hardware information. The return values
     * would differ per device makers. E.g. RF chip version, Demod chip version, detailed status of
     * dvbs blind scan, etc
     *
     * <p>This API is only supported by Tuner HAL 2.0 or higher. Unsupported version would return
     * {@code null}. Use {@link TunerVersionChecker#getTunerVersion()} to check the version.
     *
     * @return The active frontend hardware information. {@code null} if the operation failed.
     * @throws IllegalStateException if there is no active frontend currently.
     */
    @Nullable
    public String getCurrentFrontendHardwardInfo() {
        mFrontendLock.lock();
        try {
            if (!TunerVersionChecker.checkHigherOrEqualVersionTo(
                        TunerVersionChecker.TUNER_VERSION_2_0, "Get Frontend hardware info")) {
                return null;
            }
            if (mFrontend == null) {
                throw new IllegalStateException("frontend is not initialized");
            }
            return nativeGetFrontendHardwareInfo();
        } finally {
            mFrontendLock.unlock();
        }
    }

    /** @hide */
    public FrontendInfo getFrontendInfoById(int id) {
        mFrontendLock.lock();
@@ -1353,6 +1382,24 @@ public class Tuner implements AutoCloseable {
        }
    }

    private void onUnLocked() {
        Log.d(TAG, "Wrote Stats Log for unlocked event from scanning.");
        FrameworkStatsLog.write(FrameworkStatsLog.TV_TUNER_STATE_CHANGED, mUserId,
                FrameworkStatsLog.TV_TUNER_STATE_CHANGED__STATE__LOCKED);

        synchronized (mScanCallbackLock) {
            if (mScanCallbackExecutor != null && mScanCallback != null) {
                mScanCallbackExecutor.execute(() -> {
                    synchronized (mScanCallbackLock) {
                        if (mScanCallback != null) {
                            mScanCallback.onUnLocked();
                        }
                    }
                });
            }
        }
    }

    private void onScanStopped() {
        synchronized (mScanCallbackLock) {
            if (mScanCallbackExecutor != null && mScanCallback != null) {
+37 −1
Original line number Diff line number Diff line
@@ -107,7 +107,8 @@ public class AvSettings extends Settings {
                    AUDIO_STREAM_TYPE_AAC, AUDIO_STREAM_TYPE_AC3, AUDIO_STREAM_TYPE_EAC3,
                    AUDIO_STREAM_TYPE_AC4, AUDIO_STREAM_TYPE_DTS, AUDIO_STREAM_TYPE_DTS_HD,
                    AUDIO_STREAM_TYPE_WMA, AUDIO_STREAM_TYPE_OPUS, AUDIO_STREAM_TYPE_VORBIS,
                    AUDIO_STREAM_TYPE_DRA})
                    AUDIO_STREAM_TYPE_DRA, AUDIO_STREAM_TYPE_AAC_ADTS, AUDIO_STREAM_TYPE_AAC_LATM,
                    AUDIO_STREAM_TYPE_AAC_HE_ADTS, AUDIO_STREAM_TYPE_AAC_HE_LATM})
    @Retention(RetentionPolicy.SOURCE)
    public @interface AudioStreamType {}

@@ -182,6 +183,41 @@ public class AvSettings extends Settings {
     */
    public static final int AUDIO_STREAM_TYPE_DRA = android.hardware.tv.tuner.AudioStreamType.DRA;

    /*
     * AAC with ADTS (Audio Data Transport Format).
     *
     * This API is only supported by Tuner HAL 2.0 or higher. Use
     * {@link TunerVersionChecker#getTunerVersion()} to check the version.
     */
    public static final int AUDIO_STREAM_TYPE_AAC_ADTS =
            android.hardware.tv.tuner.AudioStreamType.AAC_ADTS;

    /*
     * AAC with ADTS with LATM (Low-overhead MPEG-4 Audio Transport Multiplex).
     *
     * This API is only supported by Tuner HAL 2.0 or higher. Use
     * {@link TunerVersionChecker#getTunerVersion()} to check the version.
     */
    public static final int AUDIO_STREAM_TYPE_AAC_LATM =
            android.hardware.tv.tuner.AudioStreamType.AAC_LATM;

    /*
     * High-Efficiency AAC (HE-AAC) with ADTS (Audio Data Transport Format).
     *
     * This API is only supported by Tuner HAL 2.0 or higher. Use
     * {@link TunerVersionChecker#getTunerVersion()} to check the version.
     */
    public static final int AUDIO_STREAM_TYPE_AAC_HE_ADTS =
            android.hardware.tv.tuner.AudioStreamType.AAC_HE_ADTS;

    /*
     * High-Efficiency AAC (HE-AAC) with LATM (Low-overhead MPEG-4 Audio Transport Multiplex).
     *
     * This API is only supported by Tuner HAL 2.0 or higher. Use
     * {@link TunerVersionChecker#getTunerVersion()} to check the version.
     */
    public static final int AUDIO_STREAM_TYPE_AAC_HE_LATM =
            android.hardware.tv.tuner.AudioStreamType.AAC_HE_LATM;

    private final boolean mIsPassthrough;
    private int mAudioStreamType = AUDIO_STREAM_TYPE_UNDEFINED;
+15 −1
Original line number Diff line number Diff line
@@ -49,12 +49,14 @@ public class MediaEvent extends FilterEvent {
    private final long mDataId;
    private final int mMpuSequenceNumber;
    private final boolean mIsPrivateData;
    private final int mScIndexMask;
    private final AudioDescriptor mExtraMetaData;

    // This constructor is used by JNI code only
    private MediaEvent(int streamId, boolean isPtsPresent, long pts, boolean isDtsPresent, long dts,
            long dataLength, long offset, LinearBlock buffer, boolean isSecureMemory, long dataId,
            int mpuSequenceNumber, boolean isPrivateData, AudioDescriptor extraMetaData) {
            int mpuSequenceNumber, boolean isPrivateData, int scIndexMask,
            AudioDescriptor extraMetaData) {
        mStreamId = streamId;
        mIsPtsPresent = isPtsPresent;
        mPts = pts;
@@ -67,6 +69,7 @@ public class MediaEvent extends FilterEvent {
        mDataId = dataId;
        mMpuSequenceNumber = mpuSequenceNumber;
        mIsPrivateData = isPrivateData;
        mScIndexMask = scIndexMask;
        mExtraMetaData = extraMetaData;
    }

@@ -193,6 +196,17 @@ public class MediaEvent extends FilterEvent {
        return mIsPrivateData;
    }

    /**
     * Gets SC (Start Code) index mask.
     *
     * <p>This API is only supported by Tuner HAL 2.0 or higher. Unsupported version would return
     * {@code 0}. Use {@link TunerVersionChecker#getTunerVersion()} to check the version.
     */
    @RecordSettings.ScIndexMask
    public int getScIndexMask() {
        return mScIndexMask;
    }

    /**
     * Gets audio extra metadata.
     */
+3 −0
Original line number Diff line number Diff line
@@ -31,6 +31,9 @@ public interface ScanCallback {
    /** Scan locked the signal. */
    void onLocked();

    /** Scan unlocked the signal. */
    default void onUnLocked() {}

    /** Scan stopped. */
    void onScanStopped();

Loading