+
+\section{Going back}
+
+Thinking about this again in October 2016 it feels like the
+get-stuff-at-this-time API is causing problems. It especially seems
+to be a bad fit for previewing audio. The API is nice for callers,
+but there is a lot of dancing around behind it to make it work, and it
+seems that it is more `flexible' than necessary; all callers ever do
+is seek or run.
+
+Hence there is a temptation to go back to see-what-comes-out.
+
+There are two operations: make DCP and preview. Make DCP seems to be
+
+\lstset{language=C++}
+\lstset{basicstyle=\footnotesize\ttfamily,
+ breaklines=true,
+ keywordstyle=\color{blue}\ttfamily,
+ stringstyle=\color{red}\ttfamily,
+ commentstyle=\color{olive}\ttfamily}
+
+\begin{lstlisting}
+ while (!done) {
+ done = player->pass();
+ // pass() causes things to appear which are
+ // sent to encoders / disk
+ }
+\end{lstlisting}
+
+And preview seems to be
+
+\begin{lstlisting}
+ // Thread 1
+ while (!done) {
+ done = player->pass();
+ // pass() causes things to appear which are buffered
+ sleep_until_buffers_empty();
+ }
+
+ // Thread 2
+ while (true) {
+ get_video_and_audio_from_buffers();
+ push_to_output();
+ sleep();
+ }
+\end{lstlisting}
+
+\texttt{Player::pass} must call \texttt{pass()} on its decoders. They
+will emit stuff which \texttt{Player} must adjust (mixing sound etc.).
+Player then emits the `final cut', which must have properties like no
+gaps in video/audio.
+
+Maybe you could have a parent class for simpler get-stuff-at-this-time
+decoders to give them \texttt{pass()} / \texttt{seek()}.
+
+One problem I remember is which decoder to \texttt{pass()} at any given time:
+it must be the one with the earliest last output, presumably.
+Resampling also looks fiddly in the v1 code.
+
+
+\section{Having a go}
+
+\begin{lstlisting}
+ class Decoder {
+ virtual void pass() = 0;
+ virtual void seek(ContentTime time, bool accurate) = 0;
+
+ signals2<void (ContentVideo)> Video;
+ signals2<void (ContentAudio, AudioStreamPtr)> Audio;
+ signals2<void (ContentTextSubtitle)> TextSubtitle;
+ };
+\end{lstlisting}
+
+or perhaps
+
+\begin{lstlisting}
+ class Decoder {
+ virtual void pass() = 0;
+ virtual void seek(ContentTime time, bool accurate) = 0;
+
+ shared_ptr<VideoDecoder> video;
+ shared_ptr<AudioDecoder> audio;
+ shared_ptr<SubtitleDecoder> subtitle;
+ };
+
+ class VideoDecoder {
+ signals2<void (ContentVideo)> Data;
+ };
+\end{lstlisting}
+
+Questions:
+\begin{itemize}
+\item Video / audio frame or \texttt{ContentTime}?
+\item Can all the subtitle period notation code go?
+\end{itemize}
+