1 /* 2 * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.media.jfxmediaimpl.platform.osx; 27 28 import com.sun.glass.utils.NativeLibLoader; 29 import com.sun.media.jfxmedia.Media; 30 import com.sun.media.jfxmedia.MediaPlayer; 31 import com.sun.media.jfxmedia.locator.Locator; 32 import com.sun.media.jfxmedia.logging.Logger; 33 import com.sun.media.jfxmediaimpl.HostUtils; 34 import com.sun.media.jfxmediaimpl.platform.Platform; 35 import java.security.AccessController; 36 import java.security.PrivilegedAction; 37 38 /** 39 * Mac OS X Platform implementation. This class implements both the QTKit based 40 * platform and the AVFoundation based platforms. 41 * 42 * NOTE: The QTKit based platform is deprecated and will be removed in a future 43 * release. 44 */ 45 public final class OSXPlatform extends Platform { 46 /** 47 * The MIME types of all supported media. 48 */ 49 private static final String[] CONTENT_TYPES = { 50 "audio/x-aiff", 51 "audio/mp3", 52 "audio/mpeg", 53 "audio/x-m4a", 54 "video/mp4", 55 "video/x-m4v", 56 "application/vnd.apple.mpegurl", 57 "audio/mpegurl" 58 }; 59 60 private static final class OSXPlatformInitializer { 61 private static final OSXPlatform globalInstance; 62 static { 63 // Platform is only available if we can load it's native lib 64 // Do this early so we can report the correct content types 65 boolean isLoaded = false; 66 try { 67 isLoaded = AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> { 68 boolean avf = false; 69 boolean qtk = false; 70 // attempt to load the AVFoundation based player first 71 // AVFoundation will have precedence 72 try { 73 NativeLibLoader.loadLibrary("jfxmedia_avf"); 74 avf = true; 75 } catch (UnsatisfiedLinkError ule) {} 76 try { 77 NativeLibLoader.loadLibrary("jfxmedia_qtkit"); 78 qtk = true; 79 } catch (UnsatisfiedLinkError ule) {} 80 81 return avf || qtk; 82 }); 83 } catch (Exception e) { 84 // Ignore 85 } 86 if (isLoaded) { 87 globalInstance = new OSXPlatform(); 88 } else { 89 globalInstance = null; 90 } 91 } 92 } 93 94 public static Platform getPlatformInstance() { 95 return OSXPlatformInitializer.globalInstance; 96 } 97 98 private OSXPlatform() { 99 } 100 101 /** 102 * @return false if the platform cannot be loaded 103 */ 104 @Override 105 public boolean loadPlatform() { 106 if (!HostUtils.isMacOSX()) { 107 return false; 108 } 109 110 // ULE should not happen here, but just in case 111 try { 112 return osxPlatformInit(); 113 } catch (UnsatisfiedLinkError ule) { 114 if (Logger.canLog(Logger.DEBUG)) { 115 Logger.logMsg(Logger.DEBUG, "Unable to load OSX platform."); 116 } 117 // MediaUtils.nativeError(OSXPlatform.class, MediaError.ERROR_MANAGER_ENGINEINIT_FAIL); 118 return false; 119 } 120 } 121 122 @Override 123 public String[] getSupportedContentTypes() { 124 String[] contentTypesCopy = new String[CONTENT_TYPES.length]; 125 System.arraycopy(CONTENT_TYPES, 0, contentTypesCopy, 0, CONTENT_TYPES.length); 126 return contentTypesCopy; 127 } 128 129 @Override 130 public Media createMedia(Locator source) { 131 return new OSXMedia(source); 132 } 133 134 @Override 135 public MediaPlayer createMediaPlayer(Locator source) { 136 try { 137 return new OSXMediaPlayer(source); 138 } catch (Exception ex) { 139 if (Logger.canLog(Logger.DEBUG)) { 140 Logger.logMsg(Logger.DEBUG, "OSXPlatform caught exception while creating media player: "+ex); 141 ex.printStackTrace(); 142 } 143 } 144 return null; 145 } 146 147 private static native boolean osxPlatformInit(); 148 }