 
     :returns: _assets内の、position=0となるアセットのindexとPresentation Timestamp
     */
-    private func _getWindowEnd() -> (index:Int, time:CMTime)? {
+    private func _getWindowEnd() -> AssetPosition? {
 
         if _assets.isEmpty || _readers.isEmpty { return nil }
 
         // 現在の再生場所を起点にしてposition=1.0地点を探索する
         if let i_t1 = find(self._assets, _readers.first!.asset) {
 
-            let t1 = (i_t1, _currentPresentationTimestamp)
+            let t1 = AssetPosition(index: i_t1, time: _currentPresentationTimestamp)
             let offset = window * (1.0 - position)
 
             if let windowEnd = _findAsset(_assets, from: t1, offset: offset) {
                 return windowEnd
             } else {
                 // 見つからなかった場合、全アセットの最後端を1.0として扱う
-                return (_assets.count-1, _assets.last!.duration)
+                return AssetPosition(index:_assets.count-1, time:_assets.last!.duration)
             }
         }
         return nil

import AVFoundation

let kMaximumNumOfReaders = 3 // AVAssetReaderで事前にstartReading()しておくムービーの数

/**
:class: StreamFrameProducer

    :returns: 再生位置(0.0-1.0)。値域外の場合はnilを返す
    */
    func getPositionOf(index:Int, time:CMTime) -> Float? {
        let target = AssetPosition(index:index, time:time)

        /*
        「offset = window * position」であることを利用して位置を求める
