TunerHal.java revision 2e1279b8bbe0603fb4399b25b73121bed5953c46
1ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko/*
2ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Copyright (C) 2015 The Android Open Source Project
3ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko *
4ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
5ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * you may not use this file except in compliance with the License.
6ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * You may obtain a copy of the License at
7ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko *
8ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
9ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko *
10ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Unless required by applicable law or agreed to in writing, software
11ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
12ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * See the License for the specific language governing permissions and
14ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * limitations under the License.
15ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */
16ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
17ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkopackage com.android.usbtuner;
18ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
19ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.content.Context;
20ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.support.annotation.IntDef;
21ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.support.annotation.StringDef;
22ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.util.Log;
23ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
24ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport com.android.usbtuner.util.TisConfiguration;
25ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
26ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport java.lang.annotation.Retention;
27ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport java.lang.annotation.RetentionPolicy;
28ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport java.util.Objects;
29ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
30ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko/**
31ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * A base class to handle a hardware tuner device.
32ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */
33ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkopublic abstract class TunerHal implements AutoCloseable {
34ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected static final String TAG = "TunerHal";
35ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected static final boolean DEBUG = false;
36ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
37ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @IntDef({ FILTER_TYPE_OTHER, FILTER_TYPE_AUDIO, FILTER_TYPE_VIDEO, FILTER_TYPE_PCR })
38ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @Retention(RetentionPolicy.SOURCE)
39ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public @interface FilterType {}
40ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public static final int FILTER_TYPE_OTHER = 0;
41ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public static final int FILTER_TYPE_AUDIO = 1;
42ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public static final int FILTER_TYPE_VIDEO = 2;
43ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public static final int FILTER_TYPE_PCR = 3;
44ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
45ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @StringDef({ MODULATION_8VSB, MODULATION_QAM256 })
46ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @Retention(RetentionPolicy.SOURCE)
47ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public @interface ModulationType {}
48ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public static final String MODULATION_8VSB = "8VSB";
49ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public static final String MODULATION_QAM256 = "QAM256";
50ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
51ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected static final int PID_PAT = 0;
52ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected static final int PID_ATSC_SI_BASE = 0x1ffb;
53ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected static final int DEFAULT_VSB_TUNE_TIMEOUT_MS = 2000;
54ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected static final int DEFAULT_QAM_TUNE_TIMEOUT_MS = 4000; // Some device takes time for
55ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                                                                   // QAM256 tuning.
56ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    private boolean mIsStreaming;
57ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    private int mFrequency;
58ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    private String mModulation;
59ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
60ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    static {
61ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        System.loadLibrary("tunertvinput_jni");
62ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
63ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
642e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    /**
652e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko     * Creates a TunerHal instance.
662e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko     * @param context context for creating the TunerHal instance
672e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko     * @return the TunerHal instance
682e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko     */
692e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public static TunerHal createInstance(Context context) {
70ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        TunerHal tunerHal;
71ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (TisConfiguration.isPackagedWithLiveChannels(context)) {
72ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            tunerHal = new UsbTunerHal(context);
73ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        } else {
74ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            tunerHal = new InternalTunerHal(context);
752e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        }
762e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        if (tunerHal.openFirstAvailable()) {
77ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return tunerHal;
78ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
79ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return null;
80ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
81ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
82ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected TunerHal(Context context) {
83ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        mIsStreaming = false;
84ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        mFrequency = -1;
85ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        mModulation = null;
86ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
87ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
88ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected boolean isStreaming() {
89ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return mIsStreaming;
90ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
91ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
92ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @Override
93ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected void finalize() throws Throwable {
94ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        super.finalize();
95ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        close();
96ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
97ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
98ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected native void nativeFinalize(long deviceId);
99ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
100ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    /**
101ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * Acquires the first available tuner device. If there is a tuner device that is available, the
102ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * tuner device will be locked to the current instance.
103ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     *
104ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * @return {@code true} if the operation was successful, {@code false} otherwise
105ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     */
106ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected abstract boolean openFirstAvailable();
107ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
108ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected abstract boolean isDeviceOpen();
109ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
110ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected abstract long getDeviceId();
111ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
112ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    /**
113ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * Sets the tuner channel. This should be called after acquiring a tuner device.
114ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     *
115ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * @param frequency a frequency of the channel to tune to
116ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * @param modulation a modulation method of the channel to tune to
117ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * @return {@code true} if the operation was successful, {@code false} otherwise
118ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     */
119ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public boolean tune(int frequency, @ModulationType String modulation) {
120ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (!isDeviceOpen()) {
121ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            Log.e(TAG, "There's no available device");
122ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return false;
123ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
124ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (mIsStreaming) {
125ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            nativeCloseAllPidFilters(getDeviceId());
126ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            mIsStreaming = false;
127ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
128ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
129ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        // When tuning to a new channel in the same frequency, there's no need to stop current tuner
130ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        // device completely and the only thing necessary for tuning is reopening pid filters.
131ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (mFrequency == frequency && Objects.equals(mModulation, modulation)) {
132ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            addPidFilter(PID_PAT, FILTER_TYPE_OTHER);
133ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            addPidFilter(PID_ATSC_SI_BASE, FILTER_TYPE_OTHER);
134ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            mIsStreaming = true;
135ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return true;
136ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
137ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        int timeout_ms = modulation.equals(MODULATION_8VSB) ? DEFAULT_VSB_TUNE_TIMEOUT_MS
138ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                : DEFAULT_QAM_TUNE_TIMEOUT_MS;
139ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (nativeTune(getDeviceId(), frequency, modulation, timeout_ms)) {
140ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            addPidFilter(PID_PAT, FILTER_TYPE_OTHER);
141ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            addPidFilter(PID_ATSC_SI_BASE, FILTER_TYPE_OTHER);
142ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            mFrequency = frequency;
143ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            mModulation = modulation;
144ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            mIsStreaming = true;
145ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return true;
146ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
147ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return false;
148ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
149ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
150ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected native boolean nativeTune(long deviceId, int frequency,
151ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            @ModulationType String modulation, int timeout_ms);
152ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
153ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    /**
154ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * Sets a pid filter. This should be set after setting a channel.
155ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     *
156ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * @param pid a pid number to be added to filter list
157ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * @param filterType a type of pid. Must be one of (FILTER_TYPE_XXX)
158ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * @return {@code true} if the operation was successful, {@code false} otherwise
159ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     */
160ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public boolean addPidFilter(int pid, @FilterType int filterType) {
161ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (!isDeviceOpen()) {
162ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            Log.e(TAG, "There's no available device");
163ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return false;
164ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
165ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (pid >= 0 && pid <= 0x1fff) {
166ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            nativeAddPidFilter(getDeviceId(), pid, filterType);
167ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return true;
168ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
169ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return false;
170ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
171ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
172ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected native void nativeAddPidFilter(long deviceId, int pid, @FilterType int filterType);
173ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected native void nativeCloseAllPidFilters(long deviceId);
174ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
175ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    /**
176ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * Stops current tuning. The tuner device and pid filters will be reset by this call and make
177ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * the tuner ready to accept another tune request.
178ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     */
179ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public void stopTune() {
180ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (isDeviceOpen()) {
181ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            if (mIsStreaming) {
182ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                nativeCloseAllPidFilters(getDeviceId());
183ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            }
184ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            nativeStopTune(getDeviceId());
185ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
186ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        mIsStreaming = false;
187ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        mFrequency = -1;
188ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        mModulation = null;
189ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
190ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
191ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected native void nativeStopTune(long deviceId);
192ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
193ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    /**
194ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * This method must be called after {@link TunerHal#tune} and before
195ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * {@link TunerHal#stopStreaming}. Writes at most maxSize TS frames in a buffer
196ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * provided by the user. The frames employ MPEG encoding.
197ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     *
198ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * @param javaBuffer a buffer to write the video data in
199ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * @param javaBufferSize the max amount of bytes to write in this buffer. Usually this number
200ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     *            should be equal to the length of the buffer.
201ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * @return the amount of bytes written in the buffer. Note that this value could be 0 if no new
202ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     *         frames have been obtained since the last call.
203ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     */
204ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public int readTsStream(byte[] javaBuffer, int javaBufferSize) {
205ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (isDeviceOpen()) {
206ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return nativeWriteInBuffer(getDeviceId(), javaBuffer, javaBufferSize);
207ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        } else {
208ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return 0;
209ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
210ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
211ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
212ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected native int nativeWriteInBuffer(long deviceId, byte[] javaBuffer, int javaBufferSize);
213ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
214ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    /**
215ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * Opens Linux DVB frontend device. This method is called from native JNI and used only for
216ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * UsbTunerHal.
217ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     */
218ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected int openDvbFrontEndFd() {
219ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return -1;
220ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
221ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
222ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    /**
223ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * Opens Linux DVB demux device. This method is called from native JNI and used only for
224ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * UsbTunerHal.
225ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     */
226ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected int openDvbDemuxFd() {
227ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return -1;
228ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
229ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
230ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    /**
231ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * Opens Linux DVB dvr device. This method is called from native JNI and used only for
232ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * UsbTunerHal.
233ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     */
234ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected int openDvbDvrFd() {
235ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return -1;
236ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
237ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko}
238