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:
parent
dc7217fbbb
commit
315326477d
45 changed files with 4293 additions and 308 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue