@Override public boolean onSelectTrack(int type, String trackId) { if (trackId == null) { return true; } int trackIndex = getIndexFromTrackId(trackId); if (mPlayer != null) { if (type == TvTrackInfo.TYPE_SUBTITLE) { if (!mCaptionEnabled) { return false; } mSelectedSubtitleTrackIndex = trackIndex; } mPlayer.setSelectedTrack(type, trackIndex); notifyTrackSelected(type, trackId); return true; } return false; }
@Override public void onStateChanged(boolean playWhenReady, int playbackState) { if (playWhenReady && playbackState == ExoPlayer.STATE_READY) { notifyTracksChanged(getAllTracks()); String audioId = getTrackId(TvTrackInfo.TYPE_AUDIO, mPlayer.getSelectedTrack(TvTrackInfo.TYPE_AUDIO)); String videoId = getTrackId(TvTrackInfo.TYPE_VIDEO, mPlayer.getSelectedTrack(TvTrackInfo.TYPE_VIDEO)); String textId = getTrackId(TvTrackInfo.TYPE_SUBTITLE, mPlayer.getSelectedTrack(TvTrackInfo.TYPE_SUBTITLE)); notifyTrackSelected(TvTrackInfo.TYPE_AUDIO, audioId); notifyTrackSelected(TvTrackInfo.TYPE_VIDEO, videoId); notifyTrackSelected(TvTrackInfo.TYPE_SUBTITLE, textId); notifyVideoAvailable(); } }
private void applyMultiAudio() { List<TvTrackInfo> tracks = getTracks(TvTrackInfo.TYPE_AUDIO); if (tracks == null) { mTvOptionsManager.onMultiAudioChanged(null); return; } String id = TvSettings.getMultiAudioId(this); String language = TvSettings.getMultiAudioLanguage(this); int channelCount = TvSettings.getMultiAudioChannelCount(this); TvTrackInfo bestTrack = TvTrackInfoUtils .getBestTrackInfo(tracks, id, language, channelCount); if (bestTrack != null) { String selectedTrack = getSelectedTrack(TvTrackInfo.TYPE_AUDIO); if (!bestTrack.getId().equals(selectedTrack)) { selectTrack(TvTrackInfo.TYPE_AUDIO, bestTrack); } else { mTvOptionsManager.onMultiAudioChanged( Utils.getMultiAudioString(this, bestTrack, false)); } return; } mTvOptionsManager.onMultiAudioChanged(null); }
private void saveMultiAudioSetting(String trackId) { List<TvTrackInfo> tracks = getTracks(TvTrackInfo.TYPE_AUDIO); if (tracks != null) { for (TvTrackInfo track : tracks) { if (track.getId().equals(trackId)) { TvSettings.setMultiAudioId(this, track.getId()); TvSettings.setMultiAudioLanguage(this, track.getLanguage()); TvSettings.setMultiAudioChannelCount(this, track.getAudioChannelCount()); return; } } } TvSettings.setMultiAudioId(this, null); TvSettings.setMultiAudioLanguage(this, null); TvSettings.setMultiAudioChannelCount(this, 0); }
@Override protected List<Item> getItemList() { List<TvTrackInfo> tracks = getMainActivity().getTracks(TvTrackInfo.TYPE_AUDIO); mSelectedTrackId = getMainActivity().getSelectedTrack(TvTrackInfo.TYPE_AUDIO); List<Item> items = new ArrayList<>(); if (tracks != null) { boolean needToShowSampleRate = Utils.needToShowSampleRate(getActivity(), tracks); int pos = 0; for (final TvTrackInfo track : tracks) { RadioButtonItem item = new MultiAudioOptionItem( Utils.getMultiAudioString(getActivity(), track, needToShowSampleRate), track.getId()); if (track.getId().equals(mSelectedTrackId)) { item.setChecked(true); mInitialSelectedPosition = pos; mSelectedTrackId = mFocusedTrackId = track.getId(); } items.add(item); ++pos; } } return items; }
private void updateCaptionTracks(List<AtscCaptionTrack> captionTracks) { if (DEBUG) { Log.d(TAG, "Update CaptionTrack " + captionTracks); } removeTvTracks(TvTrackInfo.TYPE_SUBTITLE); mCaptionTrackMap.clear(); if (captionTracks != null) { for (AtscCaptionTrack captionTrack : captionTracks) { if (mCaptionTrackMap.indexOfKey(captionTrack.serviceNumber) >= 0) { continue; } String language = captionTrack.language; // The service number of the caption service is used for track id of a subtitle. // Later, when a subtitle is chosen, track id will be passed on to TsParser. TvTrackInfo.Builder builder = new TvTrackInfo.Builder(TvTrackInfo.TYPE_SUBTITLE, SUBTITLE_TRACK_PREFIX + captionTrack.serviceNumber); builder.setLanguage(language); mTvTracks.add(builder.build()); mCaptionTrackMap.put(captionTrack.serviceNumber, captionTrack); } } mSession.notifyTracksChanged(mTvTracks); }
public void testComparator() { Comparator<TvTrackInfo> comparator = TvTrackInfoUtils.createComparator("1", "en", 1); ComparatorTester.withoutEqualsTest(comparator) // lang not match .addComparableGroup(create("1", "kr", 1), create("2", "kr", 2), create("1", "ja", 1), create("1", "ch", 1)) // lang match not count match .addComparableGroup(create("2", "en", 2), create("3", "en", 3), create("1", "en", 2)) // lang and count match .addComparableGroup(create("2", "en", 1), create("3", "en", 1)) // all match .addComparableGroup(create("1", "en", 1), create("1", "en", 1)) .test(); }
private void waitUntilAudioTracksHaveSize(int expected) { long start = SystemClock.elapsedRealtime(); int size = -1; while (SystemClock.elapsedRealtime() < start + WAIT_TRACK_SIZE_TIMEOUT_MS) { getInstrumentation().waitForIdleSync(); List<TvTrackInfo> tracks = mActivity.getTracks(TvTrackInfo.TYPE_AUDIO); if (tracks != null) { size = tracks.size(); if (size == expected) { return; } } SystemClock.sleep(TRACK_SIZE_CHECK_INTERVAL_MS); } fail("Waited for " + WAIT_TRACK_SIZE_TIMEOUT_MS + " milliseconds for track size to be " + expected + " but was " + size); }
private List<TvTrackInfo> getAllTracks() { List<TvTrackInfo> tracks = new ArrayList<>(); for (int i = 0, n = exoPlayerToTvTrackTypeMap.size(); i < n; i++) { int exoPlayerTrackType = exoPlayerToTvTrackTypeMap.keyAt(i); int tvTrackType = exoPlayerToTvTrackTypeMap.valueAt(i); for (int j = 0, m = player.getTrackCount(exoPlayerTrackType); j < m; j++) { MediaFormat trackFormat = player.getTrackFormat(exoPlayerTrackType, j); String trackId = getTrackId(tvTrackType, j); TvTrackInfo.Builder builder = new TvTrackInfo.Builder(tvTrackType, trackId); if (tvTrackType == TvTrackInfo.TYPE_VIDEO) { builder.setVideoWidth(trackFormat.width); builder.setVideoHeight(trackFormat.height); } else if (tvTrackType == TvTrackInfo.TYPE_AUDIO) { builder.setAudioChannelCount(trackFormat.channelCount); builder.setAudioSampleRate(trackFormat.sampleRate); if (trackFormat.language != null) { builder.setLanguage(trackFormat.language); } } tracks.add(builder.build()); } } return tracks; }
@Override public boolean onSelectTrack(int type, String trackId) { if (trackId == null) { return true; } int trackIndex = getIndexFromTrackId(trackId); if (mPlayer != null) { if (type == TvTrackInfo.TYPE_SUBTITLE) { if (! mCaptionEnabled) { return false; } mSelectedSubtitleTrackIndex = trackIndex; } mPlayer.setSelectedTrack(type, trackIndex); notifyTrackSelected(type, trackId); return true; } return false; }
@Override public void onStateChanged(boolean playWhenReady, int playbackState) { if (mPlayer == null) { return; } if (playWhenReady && playbackState == ExoPlayer.STATE_READY) { notifyTracksChanged(getAllTracks()); String audioId = getTrackId(TvTrackInfo.TYPE_AUDIO, mPlayer.getSelectedTrack(TvTrackInfo.TYPE_AUDIO)); String videoId = getTrackId(TvTrackInfo.TYPE_VIDEO, mPlayer.getSelectedTrack(TvTrackInfo.TYPE_VIDEO)); String textId = getTrackId(TvTrackInfo.TYPE_SUBTITLE, mPlayer.getSelectedTrack(TvTrackInfo.TYPE_SUBTITLE)); notifyTrackSelected(TvTrackInfo.TYPE_AUDIO, audioId); notifyTrackSelected(TvTrackInfo.TYPE_VIDEO, videoId); notifyTrackSelected(TvTrackInfo.TYPE_SUBTITLE, textId); notifyVideoAvailable(); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Math.abs(mPlayer.getPlaybackSpeed() - 1) < 0.1 && playWhenReady && playbackState == ExoPlayer.STATE_BUFFERING) { notifyVideoUnavailable(TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING); } }
private List<TvTrackInfo> getAllTracks() { String trackId; List<TvTrackInfo> tracks = new ArrayList<>(); int[] trackTypes = { DemoPlayer.TYPE_AUDIO, DemoPlayer.TYPE_VIDEO, DemoPlayer.TYPE_TEXT }; for (int trackType : trackTypes) { int count = mPlayer.getTrackCount(trackType); for (int i = 0; i < count; i++) { MediaFormat format = mPlayer.getTrackFormat(trackType, i); trackId = getTrackId(trackType, i); TvTrackInfo.Builder builder = new TvTrackInfo.Builder(trackType, trackId); if (trackType == DemoPlayer.TYPE_VIDEO) { builder.setVideoWidth(format.width); builder.setVideoHeight(format.height); } else if (trackType == DemoPlayer.TYPE_AUDIO) { builder.setAudioChannelCount(format.channelCount); builder.setAudioSampleRate(format.sampleRate); if (format.language != null) { builder.setLanguage(format.language); } } else if (trackType == DemoPlayer.TYPE_TEXT) { if (format.language != null) { builder.setLanguage(format.language); } } tracks.add(builder.build()); } } return tracks; }
@Override public void onSetCaptionEnabled(boolean enabled) { mCaptionEnabled = enabled; if (mPlayer != null) { if (mCaptionEnabled) { mPlayer.setSelectedTrack(TvTrackInfo.TYPE_SUBTITLE, mSelectedSubtitleTrackIndex); } else { mPlayer.setSelectedTrack(TvTrackInfo.TYPE_SUBTITLE, DemoPlayer.TRACK_DISABLED); } } }
private void selectTrack(int type, TvTrackInfo track) { mTvView.selectTrack(type, track == null ? null : track.getId()); if (type == TvTrackInfo.TYPE_AUDIO) { mTvOptionsManager.onMultiAudioChanged(track == null ? null : Utils.getMultiAudioString(this, track, false)); } else if (type == TvTrackInfo.TYPE_SUBTITLE) { mTvOptionsManager.onClosedCaptionsChanged(track); } }
private void saveClosedCaptionSetting(int option, String trackId) { mCaptionSettings.setEnableOption(option); if (option == CaptionSettings.OPTION_ON) { List<TvTrackInfo> tracks = getTracks(TvTrackInfo.TYPE_SUBTITLE); if (tracks != null) { for (TvTrackInfo track : tracks) { if (track.getId().equals(trackId)) { mCaptionSettings.setLanguage(track.getLanguage()); mCaptionSettings.setTrackId(trackId); return; } } } } }
@Override public void onTracksChanged(String inputId, List<TvTrackInfo> tracks) { mHasClosedCaption = false; for (TvTrackInfo track : tracks) { if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) { mHasClosedCaption = true; break; } } if (mOnTuneListener != null) { mOnTuneListener.onStreamInfoChanged(TunableTvView.this); } }
/** * Selects the best TvTrackInfo available or the first if none matches. * * @param tracks The tracks to choose from * @param id The track id to match. * @param language The language to match. * @param channelCount The channel count to match. * @return the best matching track or the first one if none matches. */ public static TvTrackInfo getBestTrackInfo(List<TvTrackInfo> tracks, String id, String language, int channelCount) { if (tracks == null) { return null; } Comparator<TvTrackInfo> comparator = createComparator(id, language, channelCount); TvTrackInfo best = null; for (TvTrackInfo track : tracks) { if (comparator.compare(track, best) > 0) { best = track; } } return best; }
public static boolean needToShowSampleRate(Context context, List<TvTrackInfo> tracks) { Set<String> multiAudioStrings = new HashSet<>(); for (TvTrackInfo track : tracks) { String multiAudioString = getMultiAudioString(context, track, false); if (multiAudioStrings.contains(multiAudioString)) { return true; } multiAudioStrings.add(multiAudioString); } return false; }
@VisibleForTesting boolean updateMultiAudioAction() { List<TvTrackInfo> audioTracks = getMainActivity().getTracks(TvTrackInfo.TYPE_AUDIO); boolean oldEnabled = MenuAction.SELECT_AUDIO_LANGUAGE_ACTION.isEnabled(); boolean newEnabled = audioTracks != null && audioTracks.size() > 1; if (oldEnabled != newEnabled) { MenuAction.SELECT_AUDIO_LANGUAGE_ACTION.setEnabled(newEnabled); return true; } return false; }
private void doSelectTrack(int type, String trackId) { int numTrackId = trackId != null ? Integer.parseInt(trackId.substring(TRACK_PREFIX_SIZE)) : -1; if (type == TvTrackInfo.TYPE_AUDIO) { if (trackId == null) { return; } AtscAudioTrack audioTrack = mAudioTrackMap.get(numTrackId); if (audioTrack == null) { return; } int oldAudioPid = mChannel.getAudioPid(); mChannel.selectAudioTrack(audioTrack.index); int newAudioPid = mChannel.getAudioPid(); if (oldAudioPid != newAudioPid) { mPlayer.setSelectedTrack(MpegTsPlayer.TRACK_TYPE_AUDIO, audioTrack.index); } mSession.notifyTrackSelected(type, trackId); } else if (type == TvTrackInfo.TYPE_SUBTITLE) { if (trackId == null) { mSession.notifyTrackSelected(type, null); mCaptionTrack = null; stopCaptionTrack(); return; } for (TvTrackInfo track : mTvTracks) { if (track.getId().equals(trackId)) { // The service number of the caption service is used for track id of a // subtitle track. Passes the following track id on to TsParser. mSession.notifyTrackSelected(type, trackId); mCaptionTrack = mCaptionTrackMap.get(numTrackId); startCaptionTrack(); return; } } } }
private void removeTvTracks(int trackType) { Iterator<TvTrackInfo> iterator = mTvTracks.iterator(); while (iterator.hasNext()) { TvTrackInfo tvTrackInfo = iterator.next(); if (tvTrackInfo.getType() == trackType) { iterator.remove(); } } }
private void updateVideoTrack(int width, int height) { removeTvTracks(TvTrackInfo.TYPE_VIDEO); mTvTracks.add(new TvTrackInfo.Builder(TvTrackInfo.TYPE_VIDEO, VIDEO_TRACK_ID) .setVideoWidth(width).setVideoHeight(height).build()); mSession.notifyTracksChanged(mTvTracks); mSession.notifyTrackSelected(TvTrackInfo.TYPE_VIDEO, VIDEO_TRACK_ID); }
private void notifyAudioTracksUpdated() { if (mPlayer == null) { // Audio tracks will be updated later once player initialization is done. return; } int audioTrackCount = mPlayer.getTrackCount(MpegTsPlayer.TRACK_TYPE_AUDIO); removeTvTracks(TvTrackInfo.TYPE_AUDIO); for (int i = 0; i < audioTrackCount; i++) { AtscAudioTrack audioTrack = mAudioTrackMap.get(i); if (audioTrack == null) { continue; } String language = audioTrack.language; if (language == null && mChannel.getAudioTracks() != null && mChannel.getAudioTracks().size() == mAudioTrackMap.size()) { // If a language is not present, use a language field in PMT section parsed. language = mChannel.getAudioTracks().get(i).language; } // Save the index to the audio track. // Later, when an audio track is selected, both the audio pid and its audio stream // type reside in the selected index position of the tuner channel's audio data. audioTrack.index = i; TvTrackInfo.Builder builder = new TvTrackInfo.Builder( TvTrackInfo.TYPE_AUDIO, AUDIO_TRACK_PREFIX + i); builder.setLanguage(language); builder.setAudioChannelCount(audioTrack.channelCount); builder.setAudioSampleRate(audioTrack.sampleRate); TvTrackInfo track = builder.build(); mTvTracks.add(track); } mSession.notifyTracksChanged(mTvTracks); }
private void doDiscoverCaptionServiceNumber(int serviceNumber) { int index = mCaptionTrackMap.indexOfKey(serviceNumber); if (index < 0) { AtscCaptionTrack captionTrack = new AtscCaptionTrack(); captionTrack.serviceNumber = serviceNumber; captionTrack.wideAspectRatio = false; captionTrack.easyReader = false; mCaptionTrackMap.put(serviceNumber, captionTrack); mTvTracks.add(new TvTrackInfo.Builder(TvTrackInfo.TYPE_SUBTITLE, SUBTITLE_TRACK_PREFIX + serviceNumber).build()); mSession.notifyTracksChanged(mTvTracks); } }
@Override public void onStateChanged(boolean playWhenReady, int playbackState) { if (playWhenReady && playbackState == DemoPlayer.STATE_READY) { notifyTracksChanged(getAllTracks()); String videoId = getTrackId(TvTrackInfo.TYPE_VIDEO, player.getSelectedTrack(TvTrackInfo.TYPE_VIDEO)); String audioId = getTrackId(TvTrackInfo.TYPE_AUDIO, player.getSelectedTrack(TvTrackInfo.TYPE_AUDIO)); notifyTrackSelected(TvTrackInfo.TYPE_VIDEO, videoId); notifyTrackSelected(TvTrackInfo.TYPE_AUDIO, audioId); notifyVideoAvailable(); } }
private void resetTracks() { mTracks.clear(); mTracksIndices.clear(); notifyTracksChanged(mTracks); notifyTrackSelected(TvTrackInfo.TYPE_AUDIO, null); notifyTrackSelected(TvTrackInfo.TYPE_VIDEO, null); notifyTrackSelected(TvTrackInfo.TYPE_SUBTITLE, null); }
public void onClosedCaptionsChanged(TvTrackInfo track) { mClosedCaptionsLanguage = (track == null) ? null : (track.getLanguage() != null) ? track.getLanguage() : mContext.getString(R.string.default_language); notifyOptionChanged(OPTION_CLOSED_CAPTIONS); }
private void applyClosedCaption() { List<TvTrackInfo> tracks = getTracks(TvTrackInfo.TYPE_SUBTITLE); if (tracks == null) { mTvOptionsManager.onClosedCaptionsChanged(null); return; } boolean enabled = mCaptionSettings.isEnabled(); mTvView.setClosedCaptionEnabled(enabled); String selectedTrackId = getSelectedTrack(TvTrackInfo.TYPE_SUBTITLE); TvTrackInfo alternativeTrack = null; if (enabled) { String language = mCaptionSettings.getLanguage(); String trackId = mCaptionSettings.getTrackId(); for (TvTrackInfo track : tracks) { if (Utils.isEqualLanguage(track.getLanguage(), language)) { if (track.getId().equals(trackId)) { if (!track.getId().equals(selectedTrackId)) { selectTrack(TvTrackInfo.TYPE_SUBTITLE, track); } else { // Already selected. Update the option string only. mTvOptionsManager.onClosedCaptionsChanged(track); } if (DEBUG) { Log.d(TAG, "Subtitle Track Selected {id=" + track.getId() + ", language=" + track.getLanguage() + "}"); } return; } else if (alternativeTrack == null) { alternativeTrack = track; } } } if (alternativeTrack != null) { if (!alternativeTrack.getId().equals(selectedTrackId)) { selectTrack(TvTrackInfo.TYPE_SUBTITLE, alternativeTrack); } else { mTvOptionsManager.onClosedCaptionsChanged(alternativeTrack); } if (DEBUG) { Log.d(TAG, "Subtitle Track Selected {id=" + alternativeTrack.getId() + ", language=" + alternativeTrack.getLanguage() + "}"); } return; } } if (selectedTrackId != null) { selectTrack(TvTrackInfo.TYPE_SUBTITLE, null); if (DEBUG) Log.d(TAG, "Subtitle Track Unselected"); return; } mTvOptionsManager.onClosedCaptionsChanged(null); }
public List<TvTrackInfo> getTracks(int type) { return mTvView.getTracks(type); }
@Override public void onTracksChanged(String inputId, List<TvTrackInfo> tracks) { mDelegate.onTracksChanged(inputId, tracks); }
private String getLabel(TvTrackInfo track) { if (track.getLanguage() != null) { return new Locale(track.getLanguage()).getDisplayName(); } return getString(R.string.default_language); }
@Override public void onTrackSelected(String inputId, int type, String trackId) { if (trackId == null) { // A track is unselected. if (type == TvTrackInfo.TYPE_VIDEO) { mVideoWidth = 0; mVideoHeight = 0; mVideoFormat = StreamInfo.VIDEO_DEFINITION_LEVEL_UNKNOWN; mVideoFrameRate = 0f; mVideoDisplayAspectRatio = 0f; } else if (type == TvTrackInfo.TYPE_AUDIO) { mAudioChannelCount = StreamInfo.AUDIO_CHANNEL_COUNT_UNKNOWN; } } else { List<TvTrackInfo> tracks = getTracks(type); boolean trackFound = false; if (tracks != null) { for (TvTrackInfo track : tracks) { if (track.getId().equals(trackId)) { if (type == TvTrackInfo.TYPE_VIDEO) { mVideoWidth = track.getVideoWidth(); mVideoHeight = track.getVideoHeight(); mVideoFormat = Utils.getVideoDefinitionLevelFromSize( mVideoWidth, mVideoHeight); mVideoFrameRate = track.getVideoFrameRate(); if (mVideoWidth <= 0 || mVideoHeight <= 0) { mVideoDisplayAspectRatio = 0.0f; } else { float VideoPixelAspectRatio = track.getVideoPixelAspectRatio(); mVideoDisplayAspectRatio = VideoPixelAspectRatio * mVideoWidth / mVideoHeight; } } else if (type == TvTrackInfo.TYPE_AUDIO) { mAudioChannelCount = track.getAudioChannelCount(); } trackFound = true; break; } } } if (!trackFound) { Log.w(TAG, "Invalid track ID: " + trackId); } } if (mOnTuneListener != null) { mOnTuneListener.onStreamInfoChanged(TunableTvView.this); } }
/** * Compares how closely two {@link android.media.tv.TvTrackInfo}s match {@code language}, {@code * channelCount} and {@code id} in that precedence. * * @param id The track id to match. * @param language The language to match. * @param channelCount The channel count to match. * @return -1 if lhs is a worse match, 0 if lhs and rhs match equally and 1 if lhs is a better * match. */ public static Comparator<TvTrackInfo> createComparator(final String id, final String language, final int channelCount) { return new Comparator<TvTrackInfo>() { @Override public int compare(TvTrackInfo lhs, TvTrackInfo rhs) { if (lhs == rhs) { return 0; } if (lhs == null) { return -1; } if (rhs == null) { return 1; } // Assumes {@code null} language matches to any language since it means user hasn't // selected any track before or selected a track without language information. boolean rhsLangMatch = language == null || Utils.isEqualLanguage(rhs.getLanguage(), language); boolean lhsLangMatch = language == null || Utils.isEqualLanguage(lhs.getLanguage(), language); if (rhsLangMatch) { if (lhsLangMatch) { boolean rhsCountMatch = rhs.getAudioChannelCount() == channelCount; boolean lhsCountMatch = lhs.getAudioChannelCount() == channelCount; if (rhsCountMatch) { if (lhsCountMatch) { boolean rhsIdMatch = rhs.getId().equals(id); boolean lhsIdMatch = lhs.getId().equals(id); if (rhsIdMatch) { return lhsIdMatch ? 0 : -1; } else { return lhsIdMatch ? 1 : 0; } } else { return -1; } } else { return lhsCountMatch ? 1 : 0; } } else { return -1; } } else { return lhsLangMatch ? 1 : 0; } } }; }
public static String getMultiAudioString(Context context, TvTrackInfo track, boolean showSampleRate) { if (track.getType() != TvTrackInfo.TYPE_AUDIO) { throw new IllegalArgumentException("Not an audio track: " + track); } String language = context.getString(R.string.default_language); if (!TextUtils.isEmpty(track.getLanguage())) { language = new Locale(track.getLanguage()).getDisplayName(); } else { Log.d(TAG, "No language information found for the audio track: " + track); } StringBuilder metadata = new StringBuilder(); switch (track.getAudioChannelCount()) { case AUDIO_CHANNEL_NONE: break; case AUDIO_CHANNEL_MONO: metadata.append(context.getString(R.string.multi_audio_channel_mono)); break; case AUDIO_CHANNEL_STEREO: metadata.append(context.getString(R.string.multi_audio_channel_stereo)); break; case AUDIO_CHANNEL_SURROUND_6: metadata.append(context.getString(R.string.multi_audio_channel_surround_6)); break; case AUDIO_CHANNEL_SURROUND_8: metadata.append(context.getString(R.string.multi_audio_channel_surround_8)); break; default: if (track.getAudioChannelCount() > 0) { metadata.append(context.getString(R.string.multi_audio_channel_suffix, track.getAudioChannelCount())); } else { Log.d(TAG, "Invalid audio channel count (" + track.getAudioChannelCount() + ") found for the audio track: " + track); } break; } if (showSampleRate) { int sampleRate = track.getAudioSampleRate(); if (sampleRate > 0) { if (metadata.length() > 0) { metadata.append(", "); } int integerPart = sampleRate / 1000; int tenths = (sampleRate % 1000) / 100; metadata.append(integerPart); if (tenths != 0) { metadata.append("."); metadata.append(tenths); } metadata.append("kHz"); } } if (metadata.length() == 0) { return language; } return context.getString(R.string.multi_audio_display_string_with_channel, language, metadata.toString()); }
private static TvTrackInfo create(String id, String fr, int audioChannelCount) { return new TvTrackInfo.Builder(TvTrackInfo.TYPE_AUDIO, id) .setLanguage(fr) .setAudioChannelCount(audioChannelCount) .build(); }
public void testGetBestTrackInfo_empty() { TvTrackInfo result = getBestTrackInfo(Collections.emptyList(), UN_MATCHED_ID, "en", 1); assertEquals("best track ", null, result); }
public void testGetBestTrackInfo_exactMatch() { TvTrackInfo result = getBestTrackInfo(ALL, "1", "en", 1); assertEquals("best track ", INFO_1_EN_1, result); }
public void testGetBestTrackInfo_langAndChannelCountMatch() { TvTrackInfo result = getBestTrackInfo(ALL, UN_MATCHED_ID, "en", 5); assertEquals("best track ", INFO_2_EN_5, result); }