Decoupled output from player
Added IsOpen() to Output
Correctly detect EOF