11abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/* 21abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Copyright (C) 2015 The Android Open Source Project 31abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 41abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 51abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * you may not use this file except in compliance with the License. 61abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * You may obtain a copy of the License at 71abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 81abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 91abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Unless required by applicable law or agreed to in writing, software 111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * See the License for the specific language governing permissions and 141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * limitations under the License. 151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 17ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko#include "tunertvinput_jni.h" 181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#include <map> 191abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#include "DvbManager.h" 21ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko#define LOG_TAG "tunertvinput_jni" 221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#include "logging.h" 231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 241abddd9f6225298066094e20a6c29061b6af4590Nick Chalko//------------------------------------------------------------------------------- 251abddd9f6225298066094e20a6c29061b6af4590Nick Chalko// JNI native method implementation 261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko//------------------------------------------------------------------------------- 271abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#define TS_PACKET_SIZE 188 291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#define TS_PAYLOAD_SIZE (TS_PACKET_SIZE * 7) // Fit Ethernet MTU (1500) 301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#define READ_TIMEOUT_MS 100 311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 321abddd9f6225298066094e20a6c29061b6af4590Nick Chalkostatic int sTotalBytesFetched = 0; 331abddd9f6225298066094e20a6c29061b6af4590Nick Chalkostatic std::map<jlong, DvbManager *> sDvbManagers; 341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/* 36ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class: com_android_usbtuner_TunerHal 371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method: nativeFinalize 38ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Signature: (J)V 391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 401abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT void JNICALL 41ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJava_com_android_usbtuner_TunerHal_nativeFinalize 421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko(JNIEnv *, jobject, jlong deviceId) { 431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId); 441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (it != sDvbManagers.end()) { 451abddd9f6225298066094e20a6c29061b6af4590Nick Chalko delete it->second; 461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko sDvbManagers.erase(it); 471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko} 491abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 501abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/* 51ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class: com_android_usbtuner_TunerHal 52ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Method: nativeTune 531abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (JILjava/lang/String;)Z 541abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 551abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT jboolean JNICALL 56ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJava_com_android_usbtuner_TunerHal_nativeTune 571abddd9f6225298066094e20a6c29061b6af4590Nick Chalko(JNIEnv *env, jobject thiz, jlong deviceId, jint frequency, jstring modulation, jint timeout_ms) { 581abddd9f6225298066094e20a6c29061b6af4590Nick Chalko std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId); 591abddd9f6225298066094e20a6c29061b6af4590Nick Chalko DvbManager *dvbManager; 601abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (it == sDvbManagers.end()) { 611abddd9f6225298066094e20a6c29061b6af4590Nick Chalko dvbManager = new DvbManager(env, thiz); 621abddd9f6225298066094e20a6c29061b6af4590Nick Chalko sDvbManagers.insert(std::pair<jlong, DvbManager *>(deviceId, dvbManager)); 631abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } else { 641abddd9f6225298066094e20a6c29061b6af4590Nick Chalko dvbManager = it->second; 651abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 66ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko int res = dvbManager->tune(env, thiz, 671abddd9f6225298066094e20a6c29061b6af4590Nick Chalko frequency, env->GetStringUTFChars(modulation, 0), timeout_ms); 681abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return (res == 0); 691abddd9f6225298066094e20a6c29061b6af4590Nick Chalko} 701abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 711abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/* 72ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class: com_android_usbtuner_TunerHal 731abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method: nativeCloseAllPidFilters 741abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (J)V 751abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 76ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJNIEXPORT void JNICALL Java_com_android_usbtuner_TunerHal_nativeCloseAllPidFilters 771abddd9f6225298066094e20a6c29061b6af4590Nick Chalko (JNIEnv *, jobject, jlong deviceId) { 781abddd9f6225298066094e20a6c29061b6af4590Nick Chalko std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId); 791abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (it != sDvbManagers.end()) { 801abddd9f6225298066094e20a6c29061b6af4590Nick Chalko it->second->closeAllDvbPidFilter(); 811abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 821abddd9f6225298066094e20a6c29061b6af4590Nick Chalko} 831abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 841abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/* 85ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class: com_android_usbtuner_TunerHal 861abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method: nativeStopTune 871abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (J)V 881abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 891abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT void JNICALL 90ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJava_com_android_usbtuner_TunerHal_nativeStopTune 911abddd9f6225298066094e20a6c29061b6af4590Nick Chalko(JNIEnv *, jobject, jlong deviceId) { 921abddd9f6225298066094e20a6c29061b6af4590Nick Chalko std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId); 931abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (it != sDvbManagers.end()) { 941abddd9f6225298066094e20a6c29061b6af4590Nick Chalko it->second->stopTune(); 951abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 961abddd9f6225298066094e20a6c29061b6af4590Nick Chalko} 971abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 981abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/* 99ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class: com_android_usbtuner_TunerHal 1001abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method: nativeAddPidFilter 1011abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (JII)V 1021abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1031abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT void JNICALL 104ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJava_com_android_usbtuner_TunerHal_nativeAddPidFilter 1051abddd9f6225298066094e20a6c29061b6af4590Nick Chalko(JNIEnv *env, jobject thiz, jlong deviceId, jint pid, jint filterType) { 1061abddd9f6225298066094e20a6c29061b6af4590Nick Chalko std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId); 1071abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (it != sDvbManagers.end()) { 1081abddd9f6225298066094e20a6c29061b6af4590Nick Chalko it->second->startTsPidFilter(env, thiz, pid, filterType); 1091abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko} 1111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/* 113ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class: com_android_usbtuner_TunerHal 1141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method: nativeWriteInBuffer 1151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (J[BI)I 1161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1171abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT jint JNICALL 118ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJava_com_android_usbtuner_TunerHal_nativeWriteInBuffer 1191abddd9f6225298066094e20a6c29061b6af4590Nick Chalko(JNIEnv *env, jobject thiz, jlong deviceId, jbyteArray javaBuffer, jint javaBufferSize) { 1201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko uint8_t tsBuffer[TS_PAYLOAD_SIZE]; 1211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId); 1221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (it == sDvbManagers.end()) { 1231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return -1; 1241abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1251abddd9f6225298066094e20a6c29061b6af4590Nick Chalko DvbManager *dvbManager = it->second; 1261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1271abddd9f6225298066094e20a6c29061b6af4590Nick Chalko // Always read multiple of TS_PACKET_SIZE 1281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko javaBufferSize = (javaBufferSize / TS_PACKET_SIZE) * TS_PACKET_SIZE; 1291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko int readBufferSize = (javaBufferSize < TS_PAYLOAD_SIZE) ? javaBufferSize : TS_PAYLOAD_SIZE; 1301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko int dataSize = dvbManager->readTsStream(env, thiz, tsBuffer, readBufferSize, READ_TIMEOUT_MS); 1321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (dataSize == 0) { 1331abddd9f6225298066094e20a6c29061b6af4590Nick Chalko ALOGD("No data to read DVR"); 1341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return 0; 1351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } else if (dataSize < 0) { 1361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return -1; 1371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1381abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko sTotalBytesFetched += dataSize; 1401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko env->SetByteArrayRegion(javaBuffer, 0, dataSize, (jbyte *) tsBuffer); 1421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return dataSize; 1431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko} 144