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