package com.iwedia.dlna; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.util.Log; import com.iwedia.comm.IDlnaCallback; import com.iwedia.comm.IDlnaControl; import com.iwedia.dlna.dmr.service.DmrEvent; import com.iwedia.dlna.dmr.service.IDlnaDefaultListener; import com.iwedia.service.proxyservice.IDTVInterface; public class DlnaControl extends IDlnaControl.Stub implements IDTVInterface { private static final boolean DEBUG = true; private static final String LOG_TAG = "DTVManagerProxy.DlnaControl"; private static boolean isDtcp = false; private static boolean serverCreated = false; private static boolean rendererCreated = false; private static int dtcp_port = 10080; DlnaDMR MRenderer; DlnaDMS MServer; DlnaStreamParam param; private String mime = ""; private String url = "http://192.168.232.112:8983/Live_Stream.ts"; private String dtcp = "0"; private int port = 0; final static RemoteCallbackList<IDlnaCallback> mDlnaCallbackManager = new RemoteCallbackList<IDlnaCallback>(); private static String getUsbPath() { String usbPath = "/storage/usb/"; try { Process proc = Runtime.getRuntime().exec("ls /storage/usb"); BufferedReader in = new BufferedReader(new InputStreamReader( proc.getInputStream())); String line; try { if ((line = in.readLine()) != null) { usbPath += line; System.out.println(usbPath); } } finally { in.close(); } proc.getInputStream().close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("usbPath: " + usbPath); return usbPath; } public void deinitDlna() throws RemoteException { Log.i(LOG_TAG, "deinitDlna()"); if (rendererCreated) { if (MRenderer.isStarted()) { Log.i(LOG_TAG, "Stoping renderer ..."); try { MRenderer.stop(); } catch (DlnaException e1) { e1.printStackTrace(); } } Log.i(LOG_TAG, "Terminate renderer ..."); MRenderer.terminate(); rendererCreated = false; } if (serverCreated) { if (MServer.isStarted()) { Log.i(LOG_TAG, "Stoping server ..."); try { MServer.stop(); } catch (DlnaException e1) { e1.printStackTrace(); } } Log.i(LOG_TAG, "Terminate server ..."); MServer.terminate(); serverCreated = false; } try { Log.i(LOG_TAG, "Stoping player ..."); MultimediaManager.mPlayerControl.stop(); } catch (DlnaException e1) { e1.printStackTrace(); } MultimediaManager.mPlayerControl.terminate(); try { Log.i(LOG_TAG, "nativeDmcService deinitDlna()"); if (MultimediaManager.nativeDmcService != null) { MultimediaManager.nativeDmcService.getDlnaService().deinit(); } else { Log.i(LOG_TAG, "DLNA DMC Service not running"); } } catch (RemoteException e1) { e1.printStackTrace(); } try { Log.i(LOG_TAG, "nativeService deinitDlna()"); if (MultimediaManager.nativeService.getDlnaService() != null) { MultimediaManager.nativeService.getDlnaService().deinit(); } else { Log.i(LOG_TAG, "DLNA DMS Service not running"); } } catch (RemoteException e) { e.printStackTrace(); } try { Log.i(LOG_TAG, "nativeDmrService deinitDlna()"); if (MultimediaManager.nativeDmrService.getDlnaService() != null) { MultimediaManager.nativeDmrService.getDlnaService().deinit(); } else { Log.i(LOG_TAG, "DLNA DMR Service not running"); } } catch (RemoteException e) { e.printStackTrace(); } } public boolean getServerStatus() throws RemoteException { if (serverCreated) { if (MServer.isStarted()) { return true; } return false; } else { return false; } } public boolean getRendererStatus() throws RemoteException { if (rendererCreated) { if (MRenderer.isStarted()) { return true; } return false; } else { return false; } } @Override public boolean startDlnaRenderer(String friendlyName) throws RemoteException { DlnaDeviceIpAddress deviceAddress = new DlnaDeviceIpAddress(); try { rendererCreated = true; Log.i(LOG_TAG, "Start new DLNA Renderer... " + friendlyName); MRenderer = new DlnaDMR(MultimediaManager.getNativeDmrService(), "DLNA_Renderer", ""); MRenderer.setFrandlyName( friendlyName + "(" + deviceAddress.getDeviceIpAddress() + ")", "DMR"); MRenderer.setManufacturerName("iWedia", "DMR"); MRenderer.setManufacturerURL("http://www.iwedia.com", "DMR"); MRenderer.setModelName("iWedia DLNA Demo", "DMR"); MRenderer .setModelDesc("iWedia - DLNA v1.5 Demo application", "DMR"); MRenderer.setModelNumber("2.0", "DMR"); MRenderer .setModelURL( "http://www.iwedia.com/software-components/dlna-and-dtcp-ip", "DMR"); MRenderer.start(); MRenderer.setFriendlyName(friendlyName + "(" + deviceAddress.getDeviceIpAddress() + ")"); } catch (DlnaException e) { e.printStackTrace(); } IDlnaDefaultListener mDlnaDefaultListener = new IDlnaDefaultListener.Stub() { @Override public void handleEvent(int arg0, DmrEvent arg1) throws RemoteException { System.out.println("DlnaRendererEvent event: " + arg0); if (arg0 == 5) { System.out.println("DlnaRendererPlayEvent"); sDlnaPlayRendererEvent(arg1.getDmrObject() .getDmrObjectUri(), arg1.getDmrObject() .getDmrObjectFriendlyName(), arg1.getDmrObject() .getDmrObjectMime()); } else if (arg0 == 6) { System.out.println("DlnaRendererStopEvent"); sDlnaStopRendererEvent(); } else if (arg0 == 7) { System.out.println("DlnaRendererPauseEvent"); sDlnaPauseRendererEvent(); } else if (arg0 == 8) { System.out.println("DlnaRendererResumeEvent"); sDlnaResumeRendererEvent(); } else if (arg0 == 9) { System.out.println("DlnaRendererVolumeEvent"); } else if (arg0 == 10) { System.out.println("DlnaRendererMuteEvent"); } else if (arg0 == 11) { int iSeekTo; System.out.println("DlnaRendererSeekToEvent"); String sSeekTo = arg1.getDmrSeekValue(); Log.e("JAVA-String", sSeekTo); int k = sSeekTo.lastIndexOf(':'); String tail = sSeekTo.substring(k + 1); int iSeekTo1 = Integer.parseInt(tail); sSeekTo = sSeekTo.substring(0, k); k = sSeekTo.lastIndexOf(':'); tail = sSeekTo.substring(k + 1); int iSeekTo2 = Integer.parseInt(tail); String head = sSeekTo.substring(0, k); int iSeekTo3 = Integer.parseInt(head); iSeekTo = (iSeekTo3 * 3600 + iSeekTo2 * 60 + iSeekTo1) * 1000; sDlnaSeekToRendererEvent(iSeekTo); } else if (arg0 == 12) { System.out.println("DlnaRendererPositionEvent"); sDlnaPositionRendererEvent(); } } }; MultimediaManager.getNativeDmrService().getDlnaService() .registerDlnaDefaultListener(mDlnaDefaultListener); return true; } @Override public boolean startDlnaServer(String friendlyName) throws RemoteException { File Server_base = new File("/data/data/com.iwedia.service/dlna.sqlite"); if (Server_base.exists()) { Server_base.delete(); } String usbFullPath = getUsbPath(); DlnaDeviceIpAddress deviceAddress = new DlnaDeviceIpAddress(); try { serverCreated = true; System.out.println("Start new DLNA Server"); MServer = new DlnaDMS(MultimediaManager.getNativeService(), "DLNA_Server", "/data/data/com.iwedia.service/dlna.sqlite", ""); MServer.setManufacturerName("iWedia", "DMS"); MServer.setManufacturerURL("http://www.iwedia.com", "DMS"); MServer.setModelName("iWedia DLNA Demo", "DMS"); MServer.setModelDesc("iWedia - DLNA v1.5 Demo application", "DMS"); MServer.setModelNumber("2.0", "DMS"); MServer.setModelURL( "http://www.iwedia.com/software-components/dlna-and-dtcp-ip", "DMS"); MServer.setFrandlyName( friendlyName + "(" + deviceAddress.getDeviceIpAddress() + ")", "DMS"); MServer.setFriendlyName(friendlyName + "(" + deviceAddress.getDeviceIpAddress() + ")"); if (isDtcp) { System.out.println("Starting server with dtcp port: " + dtcp_port); MServer.setDtcpPort(dtcp_port); MServer.start(dtcp_port); } else { MServer.start(-1); } param = new DlnaStreamParam(); url = ("http://" + deviceAddress.getDeviceIpAddress() + ":8983/Live_Stream.ts"); /* * param.setDtcp_host(dtcp); param.setMime(mime); * param.setPort(port); param.setProfile(0); param.setUri(url); * MServer.shareStreamExt(param); */ MServer.share(usbFullPath); } catch (DlnaException e) { e.printStackTrace(); } return true; } @Override public boolean changeDMSName(String friendlyName) throws RemoteException { DlnaDeviceIpAddress deviceAddress = new DlnaDeviceIpAddress(); if (DEBUG) { Log.i(LOG_TAG, "Change DMS name"); } try { if (serverCreated) { if (MServer.isStarted()) { try { MServer.stop(); } catch (DlnaException e) { e.printStackTrace(); } } System.out.println("Change DLNA Server name"); MServer.setFrandlyName( friendlyName + "(" + deviceAddress.getDeviceIpAddress() + ")", "DMS"); MServer.setFriendlyName(friendlyName + "(" + deviceAddress.getDeviceIpAddress() + ")"); if (isDtcp) { System.out.println("Starting server with dtcp port: " + dtcp_port); MServer.setDtcpPort(dtcp_port); MServer.start(dtcp_port); } else { MServer.start(-1); } } } catch (DlnaException e) { e.printStackTrace(); } return true; } @Override public boolean changeDMRName(String friendlyName) throws RemoteException { DlnaDeviceIpAddress deviceAddress = new DlnaDeviceIpAddress(); if (DEBUG) { Log.e(LOG_TAG, "Change DMR name"); } try { if (rendererCreated) { if (MRenderer.isStarted()) { try { MRenderer.stop(); } catch (DlnaException e) { e.printStackTrace(); } } Log.i(LOG_TAG, "Changing DLNA Renderer name to: " + friendlyName); MRenderer.setFrandlyName( friendlyName + "(" + deviceAddress.getDeviceIpAddress() + ")", "DMR"); MRenderer.setFriendlyName(friendlyName + "(" + deviceAddress.getDeviceIpAddress() + ")"); MRenderer.start(); } } catch (DlnaException e) { e.printStackTrace(); } return true; } @Override public boolean stopDlnaRenderer() throws RemoteException { MultimediaManager.getNativeDmrService().getDlnaService() .unRegisterDlnaDefaultListener(); if (DEBUG) { Log.e(LOG_TAG, "stopDlnaRenderer"); } try { MRenderer.stop(); } catch (DlnaException e) { e.printStackTrace(); } if (DEBUG) { Log.e(LOG_TAG, "terminateDlnaRenderer"); } MRenderer.terminate(); rendererCreated = false; return true; } @Override public boolean stopDlnaServer() throws RemoteException { if (DEBUG) { Log.e(LOG_TAG, "stopDlnaServer("); } try { MServer.stop(); } catch (DlnaException e) { e.printStackTrace(); } MServer.terminate(); serverCreated = false; return true; } @Override public boolean notifyDlnaRenderer(int notifyType, int notifyValue, String position) throws RemoteException { if (DEBUG) { Log.i(LOG_TAG, "notifyDlnaRenderer-> notifyType: " + notifyType + "; notifyValue : " + notifyValue + "; position: " + position); } synchronized (MRenderer) { try { MRenderer.dlnaSetNotify(notifyType, notifyValue, position); } catch (DlnaException e) { e.printStackTrace(); } return true; } } public static void sDlnaPlayRendererEvent(String uri, String friendlyName, String mime) { synchronized (mDlnaCallbackManager) { int i = mDlnaCallbackManager.beginBroadcast(); if (i > 1) { Log.e(LOG_TAG, "More than one callback (" + i + ")"); } while (i > 0) { i--; try { mDlnaCallbackManager.getBroadcastItem(i) .dlnaPlayRendererEvent(uri, friendlyName, mime); } catch (RemoteException e) { e.printStackTrace(); } catch (RuntimeException e) { e.printStackTrace(); mDlnaCallbackManager.unregister(mDlnaCallbackManager .getBroadcastItem(i)); } } mDlnaCallbackManager.finishBroadcast(); } } public static void sDlnaPauseRendererEvent() { synchronized (mDlnaCallbackManager) { int i = mDlnaCallbackManager.beginBroadcast(); if (i > 1) { Log.e(LOG_TAG, "More than one callback (" + i + ")"); } while (i > 0) { i--; try { mDlnaCallbackManager.getBroadcastItem(i) .dlnaPauseRendererEvent(); } catch (RemoteException e) { e.printStackTrace(); } catch (RuntimeException e) { e.printStackTrace(); mDlnaCallbackManager.unregister(mDlnaCallbackManager .getBroadcastItem(i)); } } mDlnaCallbackManager.finishBroadcast(); } } public static void sDlnaResumeRendererEvent() { synchronized (mDlnaCallbackManager) { int i = mDlnaCallbackManager.beginBroadcast(); if (i > 1) { Log.e(LOG_TAG, "More than one callback (" + i + ")"); } while (i > 0) { i--; try { mDlnaCallbackManager.getBroadcastItem(i) .dlnaResumeRendererEvent(); } catch (RemoteException e) { e.printStackTrace(); } catch (RuntimeException e) { e.printStackTrace(); mDlnaCallbackManager.unregister(mDlnaCallbackManager .getBroadcastItem(i)); } } mDlnaCallbackManager.finishBroadcast(); } } public static void sDlnaStopRendererEvent() { synchronized (mDlnaCallbackManager) { int i = mDlnaCallbackManager.beginBroadcast(); if (i > 1) { Log.e(LOG_TAG, "More than one callback (" + i + ")"); } while (i > 0) { i--; try { mDlnaCallbackManager.getBroadcastItem(i) .dlnaStopRendererEvent(); } catch (RemoteException e) { e.printStackTrace(); } catch (RuntimeException e) { e.printStackTrace(); mDlnaCallbackManager.unregister(mDlnaCallbackManager .getBroadcastItem(i)); } } mDlnaCallbackManager.finishBroadcast(); } } public static void sDlnaPositionRendererEvent() { synchronized (mDlnaCallbackManager) { int i = mDlnaCallbackManager.beginBroadcast(); if (i > 1) { Log.e(LOG_TAG, "More than one callback (" + i + ")"); } while (i > 0) { i--; try { mDlnaCallbackManager.getBroadcastItem(i) .dlnaPositionRendererEvent(); } catch (RemoteException e) { e.printStackTrace(); } catch (RuntimeException e) { e.printStackTrace(); mDlnaCallbackManager.unregister(mDlnaCallbackManager .getBroadcastItem(i)); } } mDlnaCallbackManager.finishBroadcast(); } } public static void sDlnaSeekToRendererEvent(int seekTo) { synchronized (mDlnaCallbackManager) { int i = mDlnaCallbackManager.beginBroadcast(); if (i > 1) { Log.e(LOG_TAG, "More than one callback (" + i + ")"); } while (i > 0) { i--; try { mDlnaCallbackManager.getBroadcastItem(i) .dlnaSeekToRendererEvent(seekTo); } catch (RemoteException e) { e.printStackTrace(); } catch (RuntimeException e) { e.printStackTrace(); mDlnaCallbackManager.unregister(mDlnaCallbackManager .getBroadcastItem(i)); } } mDlnaCallbackManager.finishBroadcast(); } } private static boolean isClbkRegistered = false; @Override public void registerCallback(IDlnaCallback dlnaCallback) throws RemoteException { if (isClbkRegistered == false) { isClbkRegistered = mDlnaCallbackManager.register(dlnaCallback); } else { Log.d(LOG_TAG, "registerCallback: Callback is already registered!"); } } @Override public void unregisterCallback(IDlnaCallback dlnaCallback) throws RemoteException { if (isClbkRegistered == true) { mDlnaCallbackManager.unregister(dlnaCallback); isClbkRegistered = false; } else { Log.d(LOG_TAG, "unregisterCallback: Callback is not registered!"); } } @Override public void channelZapping(boolean status) { // TODO Auto-generated method stub } }