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