javauis/mmapi_akn/baseline/src.nga/cmmavideoplayer.cpp
branchRCL_3
changeset 46 4376525cdefb
parent 19 04becd199f91
child 60 6c158198356e
--- a/javauis/mmapi_akn/baseline/src.nga/cmmavideoplayer.cpp	Wed Jun 09 09:34:07 2010 +0300
+++ b/javauis/mmapi_akn/baseline/src.nga/cmmavideoplayer.cpp	Mon Jun 21 15:32:50 2010 +0300
@@ -25,7 +25,9 @@
 #include "cmmasurfacewindow.h"
 
 // CONSTANTS
+const TInt KErrorMessageSize = 32;
 _LIT(KVideoControlName, "VideoControl");
+_LIT(KAccMonError, "Accessory monitor Error: %d");
 
 CMMAVideoPlayer* CMMAVideoPlayer::NewLC(
     CMMAMMFResolver* aResolver)
@@ -70,6 +72,8 @@
         }
     }
 
+    iAccMonCapabilityArray.Close();
+    delete iAccMonitor;
     delete iEmptySnapshotImage;
     delete iActiveSchedulerWait;
 }
@@ -86,8 +90,19 @@
 
 void CMMAVideoPlayer::ConstructL()
 {
+    DEBUG("MMA::CMMAVideoPlayer::ConstructL +");
     CMMAAudioPlayer::ConstructL();
     iActiveSchedulerWait = new(ELeave)CActiveSchedulerWait;
+    iAccMonitor = CAccMonitor::NewL();
+    iAccMonCapabilityArray.Append(KAccMonAVDevice);
+    iAccMonitor->StartObservingL(this, iAccMonCapabilityArray);
+    DEBUG("MMA::CMMAVideoPlayer::ConstructL -");
+}
+
+// static cleanup function
+static void PointerArrayCleanup(TAny* aArray)
+{
+    static_cast<RPointerArray<CAccMonitorInfo>*>(aArray)->ResetAndDestroy();
 }
 
 EXPORT_C void CMMAVideoPlayer::SetPlayerListenerObjectL(jobject aListenerObject,
@@ -101,12 +116,29 @@
     // this method must be called only ones
     __ASSERT_DEBUG(!iSurfaceWindow, User::Invariant());
 
+    // get audio/video cable connected status
+    TBool avCableConnStatus(EFalse);
+    RConnectedAccessories connectedAccessories;
+    TCleanupItem arrayCleanup(PointerArrayCleanup, 
+                              &connectedAccessories);
+    CleanupStack::PushL(arrayCleanup);
+    TInt accCount = 
+        iAccMonitor->GetConnectedAccessoriesL(connectedAccessories);
+    for (TInt i = 0; i < accCount; i++)
+    {
+        if (KAccMonAVDevice == connectedAccessories[i]->AccDeviceType())
+        {
+            avCableConnStatus = ETrue;
+            break;
+        }
+    }
+    CleanupStack::PopAndDestroy();
+
     // create window for videoplayer
     // event poster is always CMMAEventSource type.
-
     iSurfaceWindow = CMMASurfaceWindow::NewL(
                          static_cast< CMMAEventSource* >(iEventPoster),
-                         this);
+                         this, avCableConnStatus);
 }
 
 EXPORT_C void CMMAVideoPlayer::SetDisplayL(MMMADisplay* aDisplay)
@@ -212,6 +244,18 @@
         iSurfaceWindow->RemoveSurface();
     }
 
+    // Start player again and ignore error 
+    if ((aEvent.iEventType == KMMFEventCategoryVideoPlayerGeneralError) &&
+            (aEvent.iErrorCode == KMMVideoBlitError))
+    {
+        TRAPD(error, StartL(EFalse));
+        if (KErrNone != error)
+        {
+            DEBUG_INT("MMA:CMMAVideoPlayer::HandleEvent, StartL() error %d", error);
+        }
+        return;
+    }
+
     // KNotCompleteVideoError can be notified when video is not complete
     // ( missing sound ) but still can be played. Because
     // CMMAAudioPlayer::HandleEvent fails with all negative error codes,
@@ -519,4 +563,32 @@
     NotifyWithStringEvent(CMMAPlayerEvent::ESizeChanged, KVideoControlName);
 }
 
+void CMMAVideoPlayer::ConnectedL(CAccMonitorInfo* aAccessoryInfo)
+{
+    TAccMonCapability deviceType = aAccessoryInfo->AccDeviceType() ;
+    DEBUG_INT("MID::CMMAVideoPlayer::ConnectedL %d", deviceType);
+    if (iSurfaceWindow && (deviceType == KAccMonAVDevice))
+    {
+        iSurfaceWindow->SetAVCableConnStatus(ETrue);
+    }
+}
+
+void CMMAVideoPlayer::DisconnectedL(CAccMonitorInfo* aAccessoryInfo)
+{
+    TAccMonCapability deviceType = aAccessoryInfo->AccDeviceType() ;
+    DEBUG_INT("MID::CMMAVideoPlayer::DisconnectedL %d", deviceType);
+    if (iSurfaceWindow && (deviceType == KAccMonAVDevice))
+    {
+        iSurfaceWindow->SetAVCableConnStatus(EFalse);
+    }
+}
+
+void CMMAVideoPlayer::AccMonitorObserverError(TInt aError)
+{
+    DEBUG_INT("MMA::CMMAVideoPlayer::AccMonitorObserverError %d", aError);
+    TBuf<KErrorMessageSize> errorMessage;
+    errorMessage.Format(KAccMonError, aError);
+    PostStringEvent(CMMAPlayerEvent::EError, errorMessage);
+}
+
 //  END OF FILE