Files
2025-07-13 23:16:20 +08:00

413 lines
12 KiB
C#

using System;
using System.Runtime.InteropServices;
using UnityEngine;
namespace UMP.Wrappers
{
internal class WrapperAndroid : IWrapperNative, IWrapperPlayer, IWrapperSpu, IWrapperAudio
{
private const string CLASS_PATH_CORE = "unitydirectionkit/universalmediaplayer/core/UniversalMediaPlayer";
private const string CLASS_PATH_NATIVE = "unitydirectionkit/universalmediaplayer/nativeplayer/MediaPlayerNative";
private const string CLASS_PATH_LIBVLC = "unitydirectionkit/universalmediaplayer/libvlcplayer/MediaPlayerVLC";
private const string CLASS_PATH_EXO = "unitydirectionkit/universalmediaplayer/exoplayer/MediaPlayerExo";
private AndroidJavaObject _coreObj;
private object _playerExpanded;
private int _nativeIndex;
#region Native Imports
[DllImport(UMPSettings.ASSET_NAME)]
private static extern int UMPNativeInit();
[DllImport(UMPSettings.ASSET_NAME)]
private static extern void UMPNativeUpdateIndex(int index);
[DllImport(UMPSettings.ASSET_NAME)]
private static extern void UMPNativeSetTexture(int index, IntPtr texture);
[DllImport(UMPSettings.ASSET_NAME)]
private static extern void UMPNativeSetPixelsBuffer(int index, IntPtr buffer, int width, int height);
[DllImport(UMPSettings.ASSET_NAME)]
private static extern void UMPNativeUpdateFrameBuffer(int index);
[DllImport(UMPSettings.ASSET_NAME)]
private static extern IntPtr UMPNativeGetUnityRenderCallback();
[DllImport(UMPSettings.ASSET_NAME)]
private static extern IntPtr UMPNativeGetPlayCallback();
[DllImport(UMPSettings.ASSET_NAME)]
private static extern IntPtr UMPNativeGetUpdateSurfaceTextureCallback();
[DllImport(UMPSettings.ASSET_NAME)]
private static extern IntPtr UMPNativeGetUpdateFrameBufferCallback();
#endregion
public WrapperAndroid(PlayerOptionsAndroid options)
{
_nativeIndex = UMPNativeInit();
AndroidJavaObject player = null;
if (options.PlayerType == PlayerOptionsAndroid.PlayerTypes.Native)
{
player = new AndroidJavaObject(CLASS_PATH_NATIVE, new object[0]);
}
else if (options.PlayerType == PlayerOptionsAndroid.PlayerTypes.LibVLC)
{
player = new AndroidJavaObject(CLASS_PATH_LIBVLC, new object[0]);
_playerExpanded = new ExpandedAndroidLibVLC(player);
}
else if (options.PlayerType == PlayerOptionsAndroid.PlayerTypes.Exo)
{
player = new AndroidJavaObject(CLASS_PATH_EXO, new object[0]);
}
var arg = new object[3];
arg[0] = _nativeIndex;
arg[1] = player;
arg[2] = options.GetOptions('\n');
_coreObj = new AndroidJavaObject(CLASS_PATH_CORE, arg);
}
#region Native
public int NativeIndex
{
get
{
return _nativeIndex;
}
}
public void NativeUpdateIndex()
{
UMPNativeUpdateIndex(_nativeIndex);
}
public void NativeSetTexture(IntPtr texture)
{
UMPNativeSetTexture(_nativeIndex, texture);
}
public void NativeSetPixelsBuffer(IntPtr buffer, int width, int height)
{
UMPNativeSetPixelsBuffer(_nativeIndex, buffer, width, height);
}
public void NativeUpdatePixelsBuffer()
{
if (SystemInfo.graphicsMultiThreaded)
GL.IssuePluginEvent(UMPNativeGetUpdateFrameBufferCallback(), _nativeIndex);
else
UMPNativeUpdateFrameBuffer(_nativeIndex);
}
public IntPtr NativeGetUnityRenderCallback()
{
return UMPNativeGetUnityRenderCallback();
}
#endregion
#region Player
public void PlayerSetDataSource(string path, object playerObject = null)
{
if (_coreObj != null)
_coreObj.Call("exportSetDataSource", path);
}
public bool PlayerPlay(object playerObject = null)
{
var started = false;
if (SystemInfo.graphicsMultiThreaded)// && !_isReady)
{
GL.IssuePluginEvent(UMPNativeGetPlayCallback(), (int)_coreObj.GetRawObject());
started = true;
}
else
{
started = _coreObj.Call<bool>("exportPlay");
}
return started;
}
public void PlayerPause(object playerObject = null)
{
if (_coreObj != null)
_coreObj.Call("exportPause");
}
public void PlayerStop(object playerObject = null)
{
if (_coreObj != null)
_coreObj.Call("exportStop");
}
public void PlayerRelease(object playerObject = null)
{
if (_coreObj != null)
_coreObj.Call("exportRelease");
}
public bool PlayerIsPlaying(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<bool>("exportIsPlaying");
return false;
}
public bool PlayerIsReady(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<bool>("exportIsReady");
return false;
}
public long PlayerGetLength(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<long>("exportDuration");
return 0;
}
public long PlayerGetTime(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<long>("exportGetTime");
return 0;
}
public void PlayerSetTime(long time, object playerObject = null)
{
if (_coreObj != null)
_coreObj.Call("exportSetTime", time);
}
public float PlayerGetPosition(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<float>("exportGetPosition");
return 0;
}
public void PlayerSetPosition(float pos, object playerObject = null)
{
if (_coreObj != null)
_coreObj.Call("exportSetPosition", pos);
}
public float PlayerGetRate(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<float>("exportGetPlaybackRate");
return 1;
}
public bool PlayerSetRate(float rate, object playerObject = null)
{
if (_coreObj != null)
{
_coreObj.Call("exportSetPlaybackRate", rate);
return true;
}
return false;
}
public int PlayerGetVolume(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<int>("exportGetVolume");
return 0;
}
public int PlayerSetVolume(int volume, object playerObject = null)
{
if (_coreObj != null)
_coreObj.Call("exportSetVolume", volume);
return 1;
}
public bool PlayerGetMute(object playerObject = null)
{
// Not used in this implementation
return false;
}
public void PlayerSetMute(bool mute, object playerObject = null)
{
// Not used in this implementation
}
public int PlayerVideoWidth(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<int>("exportVideoWidth");
return 0;
}
public int PlayerVideoHeight(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<int>("exportVideoHeight");
return 0;
}
public int PlayerVideoFramesCounter(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<int>("exportVideoFramesCounter");
return 0;
}
public PlayerState PlayerGetState()
{
var eventValue = 0;
if (_coreObj != null)
eventValue = _coreObj.Call<int>("exportGetState");
return (PlayerState)eventValue;
}
public object PlayerGetStateValue()
{
object value = _coreObj.Call<float>("exportGetStateFloatValue");
if ((float)value < 0)
{
value = _coreObj.Call<long>("exportGetStateLongValue");
if ((long)value < 0)
value = _coreObj.Call<string>("exportGetStateStringValue");
}
return value;
}
#endregion
#region Player Spu
public MediaTrackInfo[] PlayerSpuGetTracks(object playerObject = null)
{
var tracks = new System.Collections.Generic.List<MediaTrackInfo>();
if (_coreObj != null)
{
int tracksLength = _coreObj.Call<int>("exportGetSpuTracksLength");
for (int i = 0; i < tracksLength; i++)
{
int id = _coreObj.Call<int>("exportGetSpuTrackId", i);
string name = _coreObj.Call<string>("exportGetSpuTrackName", i);
tracks.Add(new MediaTrackInfo(id, name));
}
}
return tracks.ToArray();
}
public int PlayerSpuGetTrack(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<int>("exportGetSpuTrack");
return 0;
}
public int PlayerSpuSetTrack(int spuIndex, object playerObject = null)
{
if (_coreObj != null)
_coreObj.Call("exportSetSpuTrack", spuIndex);
return 0;
}
#endregion
#region Player Audio
public MediaTrackInfo[] PlayerAudioGetTracks(object playerObject = null)
{
var tracks = new System.Collections.Generic.List<MediaTrackInfo>();
if (_coreObj != null)
{
int tracksLength = _coreObj.Call<int>("exportGetAudioTracksLength");
for (int i = 0; i < tracksLength; i++)
{
int id = _coreObj.Call<int>("exportGetAudioTrackId", i);
string name = _coreObj.Call<string>("exportGetAudioTrackName", i);
tracks.Add(new MediaTrackInfo(id, name));
}
}
return tracks.ToArray();
}
public int PlayerAudioGetTrack(object playerObject = null)
{
if (_coreObj != null)
return _coreObj.Call<int>("exportGetAudioTrack");
return 0;
}
public int PlayerAudioSetTrack(int audioIndex, object playerObject = null)
{
if (_coreObj != null)
_coreObj.Call("exportSetAudioTrack", audioIndex);
return 0;
}
#endregion
#region Platform dependent functionality
public object PlayerExpanded
{
get
{
return _playerExpanded;
}
}
public void PlayerUpdateSurfaceTexture()
{
if (_coreObj != null)
{
if (SystemInfo.graphicsMultiThreaded)
GL.IssuePluginEvent(UMPNativeGetUpdateSurfaceTextureCallback(), (int)_coreObj.GetRawObject());
else
_coreObj.Call("exportUpdateSurfaceTexture");
}
}
public bool PlayerSetSubtitleFile(Uri path)
{
if (_coreObj != null)
{
var arg = new object[1];
arg[0] = path.AbsoluteUri;
return _coreObj.Call<bool>("exportSetSubtitleFile", arg);
}
return false;
}
#endregion
}
}