player: initial implementation