1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.usbtuner.tvinput; 18 19import android.media.tv.TvInputService; 20import android.util.Log; 21import com.google.android.exoplayer.audio.AudioCapabilities; 22import com.google.android.exoplayer.audio.AudioCapabilitiesReceiver; 23import com.android.usbtuner.exoplayer.cache.CacheManager; 24 25import java.util.Collections; 26import java.util.Set; 27import java.util.WeakHashMap; 28 29/** 30 * {@link BaseTunerTvInputService} serves TV channels coming from a tuner device. 31 */ 32public abstract class BaseTunerTvInputService extends TvInputService 33 implements AudioCapabilitiesReceiver.Listener { 34 private static final String TAG = "BaseTunerTvInputService"; 35 private static final boolean DEBUG = false; 36 37 // WeakContainer for {@link TvInputSessionImpl} 38 private final Set<TunerSession> mTunerSessions = Collections.newSetFromMap( 39 new WeakHashMap<TunerSession, Boolean>()); 40 private ChannelDataManager mChannelDataManager; 41 private AudioCapabilitiesReceiver mAudioCapabilitiesReceiver; 42 private AudioCapabilities mAudioCapabilities; 43 private CacheManager mCacheManager; 44 45 @Override 46 public void onCreate() { 47 super.onCreate(); 48 if (DEBUG) Log.d(TAG, "onCreate"); 49 mChannelDataManager = new ChannelDataManager(getApplicationContext()); 50 mAudioCapabilitiesReceiver = new AudioCapabilitiesReceiver(getApplicationContext(), this); 51 mAudioCapabilitiesReceiver.register(); 52 mCacheManager = createCacheManager(); 53 if (mCacheManager == null) { 54 Log.i(TAG, "Trickplay is disabled"); 55 } else { 56 Log.i(TAG, "Trickplay is enabled"); 57 } 58 } 59 60 /** 61 * Creates {@CacheManager}. It returns null, if storage in not enough. 62 */ 63 protected abstract CacheManager createCacheManager(); 64 65 @Override 66 public void onDestroy() { 67 if (DEBUG) Log.d(TAG, "onDestroy"); 68 super.onDestroy(); 69 mChannelDataManager.release(); 70 mAudioCapabilitiesReceiver.unregister(); 71 if (mCacheManager != null) { 72 mCacheManager.close(); 73 } 74 } 75 76 @Override 77 public RecordingSession onCreateRecordingSession(String inputId) { 78 return new TunerRecordingSession(this, inputId, mChannelDataManager); 79 } 80 81 @Override 82 public Session onCreateSession(String inputId) { 83 if (DEBUG) Log.d(TAG, "onCreateSession"); 84 final TunerSession session = new TunerSession( 85 this, mChannelDataManager, mCacheManager); 86 mTunerSessions.add(session); 87 session.setAudioCapabilities(mAudioCapabilities); 88 session.setOverlayViewEnabled(true); 89 return session; 90 } 91 92 @Override 93 public void onAudioCapabilitiesChanged(AudioCapabilities audioCapabilities) { 94 mAudioCapabilities = audioCapabilities; 95 for (TunerSession session : mTunerSessions) { 96 if (!session.isReleased()) { 97 session.setAudioCapabilities(audioCapabilities); 98 } 99 } 100 } 101} 102