All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.sciss.proc.impl.AuralFolderImpl.scala Maven / Gradle / Ivy

/*
 *  AuralFolderImpl.scala
 *  (SoundProcesses)
 *
 *  Copyright (c) 2010-2024 Hanns Holger Rutz. All rights reserved.
 *
 *	This software is published under the GNU Affero General Public License v3+
 *
 *
 *  For further information, please contact Hanns Holger Rutz at
 *  [email protected]
 */

package de.sciss.proc.impl

import de.sciss.lucre.{Disposable, Folder, Obj, Source, Txn, synth}
import de.sciss.proc.{AuralContext, AuralObj, Runner, TimeRef, Transport}

// XXX TODO there is an unfortunate duplication now with FolderRunnerImpl
// do we need `AuralFolder` at all?
object AuralFolderImpl {
  def apply[T <: synth.Txn[T]](folder: Folder[T], attr: Runner.Attr[T])
                              (implicit tx: T, context: AuralContext[T]): AuralObj.Folder[T] = {
    val transport = Transport[T](context.universe, attr)
    folder.iterator.foreach(transport.addObject)  // XXX TODO: should we pass `attr`?
    new Impl(tx.newHandle(folder), transport).init(folder)
  }

  private final class Impl[T <: Txn[T]](objH: Source[T, Folder[T]],
                                        protected val transport: Transport[T])
    extends AuralFolderLikeImpl[T, /*Folder[T],*/ AuralObj.Folder[T]]
    with AuralObj.Folder[T] { impl =>

    def tpe: Obj.Type = Folder

    type Repr = Folder[T]

    def obj   (implicit tx: T): Folder[T] = objH()
    def folder(implicit tx: T): Folder[T] = objH()

    def mkObserver(f: Folder[T])(implicit tx: T): Disposable[T] =
      f.changed.react { implicit tx =>upd =>
        processFolderUpdate(upd)
      }

    protected def performPlay(timeRef: TimeRef)(implicit tx: T): Unit =
      startTransport(timeRef.offset)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy