/* * Copyright 2013 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ package org.webrtc; /** Java wrapper for a C++ MediaSourceInterface. */ public class MediaSource { /** Tracks MediaSourceInterface.SourceState */ public enum State { INITIALIZING, LIVE, ENDED, MUTED; @CalledByNative("State") static State fromNativeIndex(int nativeIndex) { return values()[nativeIndex]; } } private final RefCountDelegate refCountDelegate; private long nativeSource; public MediaSource(long nativeSource) { refCountDelegate = new RefCountDelegate(() -> JniCommon.nativeReleaseRef(nativeSource)); this.nativeSource = nativeSource; } public State state() { checkMediaSourceExists(); return nativeGetState(nativeSource); } public void dispose() { checkMediaSourceExists(); refCountDelegate.release(); nativeSource = 0; } /** Returns a pointer to webrtc::MediaSourceInterface. */ protected long getNativeMediaSource() { checkMediaSourceExists(); return nativeSource; } /** * Runs code in {@code runnable} holding a reference to the media source. If the object has * already been released, does nothing. */ void runWithReference(Runnable runnable) { if (refCountDelegate.safeRetain()) { try { runnable.run(); } finally { refCountDelegate.release(); } } } private void checkMediaSourceExists() { if (nativeSource == 0) { throw new IllegalStateException("MediaSource has been disposed."); } } private static native State nativeGetState(long pointer); }