1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Add video playback support for Android and iOS. Update VideoComponent API to support building custom UIs.

This commit is contained in:
Lukasz Kozakiewicz 2018-05-11 17:57:26 +02:00
parent dc7217fbbb
commit 315326477d
45 changed files with 4293 additions and 308 deletions

View file

@ -1251,6 +1251,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_video/capture/juce_CameraDevice.cpp"
"../../../../../modules/juce_video/capture/juce_CameraDevice.h"
"../../../../../modules/juce_video/native/juce_android_CameraDevice.h"
"../../../../../modules/juce_video/native/juce_android_Video.h"
"../../../../../modules/juce_video/native/juce_ios_CameraDevice.h"
"../../../../../modules/juce_video/native/juce_mac_CameraDevice.h"
"../../../../../modules/juce_video/native/juce_mac_Video.h"
@ -2491,6 +2492,7 @@ set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.h" P
set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/native/juce_android_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/native/juce_android_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/native/juce_ios_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)

View file

@ -31,6 +31,9 @@ import android.content.res.Configuration;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.hardware.camera2.*;
import android.database.ContentObserver;
import android.media.session.*;
import android.media.MediaMetadata;
import android.net.http.SslError;
import android.net.Uri;
import android.os.Bundle;
@ -94,8 +97,11 @@ public class AudioPluginHost extends Activity
//==============================================================================
public boolean isPermissionDeclaredInManifest (int permissionID)
{
String permissionToCheck = getAndroidPermissionName(permissionID);
return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));
}
public boolean isPermissionDeclaredInManifest (String permissionToCheck)
{
try
{
PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);
@ -1997,11 +2003,13 @@ public class AudioPluginHost extends Activity
implements SurfaceHolder.Callback
{
private long nativeContext = 0;
private boolean forVideo;
NativeSurfaceView (Context context, long nativeContextPtr)
NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)
{
super (context);
nativeContext = nativeContextPtr;
forVideo = createdForVideo;
}
public Surface getNativeSurface()
@ -2019,38 +2027,51 @@ public class AudioPluginHost extends Activity
@Override
public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)
{
surfaceChangedNative (nativeContext, holder, format, width, height);
if (forVideo)
surfaceChangedNativeVideo (nativeContext, holder, format, width, height);
else
surfaceChangedNative (nativeContext, holder, format, width, height);
}
@Override
public void surfaceCreated (SurfaceHolder holder)
{
surfaceCreatedNative (nativeContext, holder);
if (forVideo)
surfaceCreatedNativeVideo (nativeContext, holder);
else
surfaceCreatedNative (nativeContext, holder);
}
@Override
public void surfaceDestroyed (SurfaceHolder holder)
{
surfaceDestroyedNative (nativeContext, holder);
if (forVideo)
surfaceDestroyedNativeVideo (nativeContext, holder);
else
surfaceDestroyedNative (nativeContext, holder);
}
@Override
protected void dispatchDraw (Canvas canvas)
{
super.dispatchDraw (canvas);
dispatchDrawNative (nativeContext, canvas);
if (forVideo)
dispatchDrawNativeVideo (nativeContext, canvas);
else
dispatchDrawNative (nativeContext, canvas);
}
//==============================================================================
@Override
protected void onAttachedToWindow ()
protected void onAttachedToWindow()
{
super.onAttachedToWindow();
getHolder().addCallback (this);
}
@Override
protected void onDetachedFromWindow ()
protected void onDetachedFromWindow()
{
super.onDetachedFromWindow();
getHolder().removeCallback (this);
@ -2062,11 +2083,17 @@ public class AudioPluginHost extends Activity
private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);
private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,
int format, int width, int height);
private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);
private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);
private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);
private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,
int format, int width, int height);
}
public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)
public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)
{
return new NativeSurfaceView (this, nativeSurfacePtr);
return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);
}
//==============================================================================
@ -2826,6 +2853,151 @@ public class AudioPluginHost extends Activity
}
//==============================================================================
public class MediaControllerCallback extends MediaController.Callback
{
private native void mediaControllerAudioInfoChanged (long host, MediaController.PlaybackInfo info);
private native void mediaControllerMetadataChanged (long host, MediaMetadata metadata);
private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state);
private native void mediaControllerSessionDestroyed (long host);
MediaControllerCallback (long hostToUse)
{
host = hostToUse;
}
@Override
public void onAudioInfoChanged (MediaController.PlaybackInfo info)
{
mediaControllerAudioInfoChanged (host, info);
}
@Override
public void onMetadataChanged (MediaMetadata metadata)
{
mediaControllerMetadataChanged (host, metadata);
}
@Override
public void onPlaybackStateChanged (PlaybackState state)
{
mediaControllerPlaybackStateChanged (host, state);
}
@Override
public void onQueueChanged (List<MediaSession.QueueItem> queue) {}
@Override
public void onSessionDestroyed()
{
mediaControllerSessionDestroyed (host);
}
private long host;
}
//==============================================================================
public class MediaSessionCallback extends MediaSession.Callback
{
private native void mediaSessionPause (long host);
private native void mediaSessionPlay (long host);
private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras);
private native void mediaSessionSeekTo (long host, long pos);
private native void mediaSessionStop (long host);
MediaSessionCallback (long hostToUse)
{
host = hostToUse;
}
@Override
public void onPause()
{
mediaSessionPause (host);
}
@Override
public void onPlay()
{
mediaSessionPlay (host);
}
@Override
public void onPlayFromMediaId (String mediaId, Bundle extras)
{
mediaSessionPlayFromMediaId (host, mediaId, extras);
}
@Override
public void onSeekTo (long pos)
{
mediaSessionSeekTo (host, pos);
}
@Override
public void onStop()
{
mediaSessionStop (host);
}
@Override
public void onFastForward() {}
@Override
public boolean onMediaButtonEvent (Intent mediaButtonIntent)
{
return true;
}
@Override
public void onRewind() {}
@Override
public void onSkipToNext() {}
@Override
public void onSkipToPrevious() {}
@Override
public void onSkipToQueueItem (long id) {}
private long host;
}
//==============================================================================
public class SystemVolumeObserver extends ContentObserver
{
private native void mediaSessionSystemVolumeChanged (long host);
SystemVolumeObserver (Activity activityToUse, long hostToUse)
{
super (null);
activity = activityToUse;
host = hostToUse;
}
void setEnabled (boolean shouldBeEnabled)
{
if (shouldBeEnabled)
activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this);
else
activity.getApplicationContext().getContentResolver().unregisterContentObserver (this);
}
@Override
public void onChange (boolean selfChange, Uri uri)
{
if (uri.toString().startsWith ("content://settings/system/volume_music"))
mediaSessionSystemVolumeChanged (host);
}
private Activity activity;
private long host;
}
//==============================================================================
public static final String getLocaleValue (boolean isRegion)
{

View file

@ -2436,6 +2436,7 @@
<ClInclude Include="..\..\..\..\modules\juce_opengl\juce_opengl.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>

View file

@ -4065,6 +4065,9 @@
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">
<Filter>JUCE Modules\juce_video\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">
<Filter>JUCE Modules\juce_video\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">
<Filter>JUCE Modules\juce_video\native</Filter>
</ClInclude>

View file

@ -2436,6 +2436,7 @@
<ClInclude Include="..\..\..\..\modules\juce_opengl\juce_opengl.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>

View file

@ -4065,6 +4065,9 @@
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">
<Filter>JUCE Modules\juce_video\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">
<Filter>JUCE Modules\juce_video\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">
<Filter>JUCE Modules\juce_video\native</Filter>
</ClInclude>

View file

@ -2436,6 +2436,7 @@
<ClInclude Include="..\..\..\..\modules\juce_opengl\juce_opengl.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>

View file

@ -4065,6 +4065,9 @@
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">
<Filter>JUCE Modules\juce_video\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">
<Filter>JUCE Modules\juce_video\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">
<Filter>JUCE Modules\juce_video\native</Filter>
</ClInclude>

View file

@ -264,6 +264,10 @@
#ifndef JUCE_USE_CAMERA
#define JUCE_USE_CAMERA 0
#endif
#ifndef JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME
//#define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1
#endif
//==============================================================================
#ifndef JUCE_STANDALONE_APPLICATION
#if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)