lWaitTimeout);/**/
    final long lNumberOfBuffers = mDcamAcquisition.getBufferControl()
                                                  .getNumberOfSinglePlaneBuffers();
    DCAMCAP_TRANSFERINFO lTransferinfo = mDcamAcquisition.getTransferinfo();
    mDcamAcquisition.mAcquiredFrameIndex = lTransferinfo.nFrameCount();
    while (mStopIfFalse)
    {
      // DCAMCAP_EVENT_FRAMEREADYORSTOPPED(2|16),
      final DCAMWAIT_EVENT lDcamcapEventToWaitFor;
      if (mContinuousAcquisition && !mStackAcquisition)
        lDcamcapEventToWaitFor = DCAMWAIT_EVENT.DCAMCAP_EVENT_FRAMEREADYORSTOPPED;
      else if (mStackAcquisition)
        lDcamcapEventToWaitFor = DCAMWAIT_EVENT.DCAMCAP_EVENT_FRAMEREADYORSTOPPED;
      else
        lDcamcapEventToWaitFor = DCAMWAIT_EVENT.DCAMCAP_EVENT_FRAMEREADY;
      mDcamAcquisition.mAcquisitionStartedSignal.countDown();
      if (mDcamAcquisition.mDebug)
        System.out.print("waitForEvent.before... ");
      final boolean lWaitSuccess = (mDcamAcquisition.mDcamDevice.getDcamWait().waitForEvent(lDcamcapEventToWaitFor,
                                                                                            lWaitTimeout));
      if (mDcamAcquisition.mDebug)
        System.out.println(" ...after.");
      final long lAcquisitionTimeStampInNanoseconds = StopWatch.absoluteTimeInNanoseconds();
      // System.out.println(System.nanoTime());
      lTransferinfo = mDcamAcquisition.getTransferinfo();
      final long lNumberOfFramesWrittenByDrivertoBuffers = lTransferinfo.nFrameCount();
      final long lDriversFrameIndex = lNumberOfFramesWrittenByDrivertoBuffers - 1;
      final long lReceivedFrameIndexInBufferList = lTransferinfo.nNewestFrameIndex();
      if (mDcamAcquisition.mDebug)
      {
        System.out.println("lDriversFrameIndex=" + lDriversFrameIndex);
        System.out.println("lReceivedFrameIndexInBufferList=" + lReceivedFrameIndexInBufferList);
      }
      if (!lWaitSuccess)
      {
        if (!mDcamAcquisition.isExternalTriggering() && !mDcamAcquisition.isSoftwareTriggering())
        {
          System.err.println("DcamJ: waiting for event failed!!!!");
          System.err.format("DcamJ: frame index = %d (local index = %d) out of %d frames to capture (%s acquisition)  \n",
                            mDcamAcquisition.mAcquiredFrameIndex,
                            lReceivedFrameIndexInBufferList,
                            mNumberOfFramesToCapture,
                            mStackAcquisition  ? "stack"
                                              : "single plane");
          System.err.println("DcamJ: timeout waiting for frame!");
          break;
        }
        continue;
      }
      final long lDcamWaitEvent = mDcamAcquisition.mDcamDevice.getDcamWait()
                                                              .getEvent();
      final boolean lReceivedStopEvent = lDcamWaitEvent == DCAMWAIT_EVENT.DCAMCAP_EVENT_STOPPED.value;
      final boolean lReceivedFrameReadyEvent = lDcamWaitEvent == DCAMWAIT_EVENT.DCAMCAP_EVENT_FRAMEREADY.value;
      DcamFrame lDcamFrame = null;
      if (mStackAcquisition && lReceivedStopEvent)
      {
        if (mDcamAcquisition.mDebug)
          System.out.println("DcamJ: Received Stop Event");
        if (mStackAcquisition)
        {
          lDcamFrame = mDcamAcquisition.getBufferControl()
                                        .getStackDcamFrame();
          lDcamFrame.setIndex(lDriversFrameIndex);
          lDcamFrame.setTimeStampInNs(lAcquisitionTimeStampInNanoseconds);
          mDcamAcquisition.notifyListeners(  mDcamAcquisition.mAcquiredFrameIndex,
                                            lAcquisitionTimeStampInNanoseconds,
                                            0,
                                            lDcamFrame);
          mDcamAcquisition.mAcquiredFrameIndex++;
          mStopIfFalse = false;
        }
      }
      if (!mStackAcquisition && lReceivedFrameReadyEvent)
      {
        long lFirstFrameNotYetAcquired = mDcamAcquisition.mAcquiredFrameIndex;
        long lNumberOfFramesToAcquire = lDriversFrameIndex - lFirstFrameNotYetAcquired;
        long lRingBufferFrameIndex = (lReceivedFrameIndexInBufferList - lNumberOfFramesToAcquire);
        while (lRingBufferFrameIndex < 0)
          lRingBufferFrameIndex += lNumberOfBuffers;
        lRingBufferFrameIndex %= lNumberOfBuffers;
        for (long lFrameIndex = lFirstFrameNotYetAcquired; lFrameIndex <= lDriversFrameIndex; lFrameIndex++)
        {
          lDcamFrame = mDcamAcquisition.getBufferControl()
                                        .getDcamFrameForIndex(lRingBufferFrameIndex);
          lDcamFrame.setIndex(lFrameIndex);
          lDcamFrame.setTimeStampInNs(lAcquisitionTimeStampInNanoseconds);
          mDcamAcquisition.notifyListeners(  lFrameIndex,
                                            lAcquisitionTimeStampInNanoseconds,
                                            lRingBufferFrameIndex,
                                            lDcamFrame);
          mDcamAcquisition.mAcquiredFrameIndex++;
          lRingBufferFrameIndex = (lRingBufferFrameIndex + 1) % lNumberOfBuffers;
        }
      }
      if (lDcamFrame != null)
      {
        if (mDcamAcquisition.mDebug)
          System.out.format("DcamJ: true frame index = %d, acquired frame index = %d (local index = %d) \n",
                            lDriversFrameIndex,
                            mDcamAcquisition.mAcquiredFrameIndex,
                            lReceivedFrameIndexInBufferList);
        lDcamFrame.setIndex(lDriversFrameIndex);
        lDcamFrame.setTimeStampInNs(lAcquisitionTimeStampInNanoseconds);
      }
      if (lReceivedFrameReadyEvent)
      {
        if (mDcamAcquisition.mDebug)
          System.out.println("DcamJ: Received frame ready Event");
        if (!mContinuousAcquisition && !mStackAcquisition
            && lReceivedFrameIndexInBufferList >= mNumberOfFramesToCapture - 1)
        {
          mStopIfFalse = false;
        }
      }
    }
    // if (!mContinuousAcquisition)
    {
      // System.out.println("getTransferinfo.before");
      lTransferinfo = mDcamAcquisition.getTransferinfo();
      // System.out.println("getTransferinfo.after");
      final int lNumberOfFramesWrittenByDrivertoBuffers = (int) lTransferinfo.nFrameCount();
      final long lReceivedFrameIndexInBufferList = lTransferinfo.nNewestFrameIndex();
      if (mDcamAcquisition.mDebug)
      {
        System.out.println("lNumberOfFramesWrittenByDrivertoBuffers=" + lNumberOfFramesWrittenByDrivertoBuffers);
        System.out.println("lReceivedFrameIndexInBufferList=" + lReceivedFrameIndexInBufferList);