Skip to content

Commit

Permalink
possible to re-record playback files
Browse files Browse the repository at this point in the history
this is useful for recreating playback files for the regression
database. playback entries not currently supported for REDUX mode

added -playbackIgnoreDigest and -recordingFilename options for RUN mode
  • Loading branch information
JetSetIlly committed Jun 11, 2024
1 parent eaf62ed commit e97629f
Show file tree
Hide file tree
Showing 8 changed files with 47 additions and 33 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,4 @@ armcode.map
*.macro
go.work
go.work.sum
REDUX_PLAYBACK_FILES
18 changes: 10 additions & 8 deletions debugger/commandline_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,16 @@ type CommandLineOptions struct {
ELF string

// playmode only
ComparisonROM string
ComparisonPrefs string
Record bool
PlaybackCheckROM bool
PatchFile string
Wav bool
NoEject bool
Macro string
ComparisonROM string
ComparisonPrefs string
Record bool
RecordFilename string
PlaybackCheckROM bool
PlaybackIgnoreDigest bool
PatchFile string
Wav bool
NoEject bool
Macro string

// debugger only
InitScript string
Expand Down
23 changes: 14 additions & 9 deletions debugger/debugger.go
Original file line number Diff line number Diff line change
Expand Up @@ -820,7 +820,7 @@ func (dbg *Debugger) StartInPlayMode(filename string) error {

// record wav file
if dbg.opts.Wav {
fn := unique.Filename("audio", cartload.Name)
fn := unique.Filename("audio", dbg.cartload.Name)
ww, err := wavwriter.NewWavWriter(fn)
if err != nil {
return fmt.Errorf("debugger: %w", err)
Expand All @@ -830,17 +830,18 @@ func (dbg *Debugger) StartInPlayMode(filename string) error {

// record gameplay
if dbg.opts.Record {
dbg.startRecording(cartload.Name)
dbg.startRecording(dbg.cartload.Name)
}
} else {
if dbg.opts.Record {
return fmt.Errorf("debugger: cannot make a new recording using a playback file")
}

err = dbg.startPlayback(filename)
if err != nil {
return fmt.Errorf("debugger: %w", err)
}

// record gameplay
if dbg.opts.Record {
dbg.startRecording(dbg.cartload.Name)
}
}

if dbg.opts.Macro != "" {
Expand Down Expand Up @@ -1274,7 +1275,12 @@ func (dbg *Debugger) startRecording(cartShortName string) error {
dbg.vcs.TV.SetSimple(true)

var err error
recording := unique.Filename("recording", cartShortName)
var recording string
if dbg.opts.RecordFilename == "" {
recording = unique.Filename("recording", cartShortName)
} else {
recording = dbg.opts.RecordFilename
}
dbg.recorder, err = recorder.NewRecorder(recording, dbg.vcs)
if err != nil {
return err
Expand All @@ -1301,7 +1307,7 @@ func (dbg *Debugger) endRecording() {
func (dbg *Debugger) startPlayback(filename string) error {
dbg.vcs.TV.SetSimple(true)

plb, err := recorder.NewPlayback(filename)
plb, err := recorder.NewPlayback(filename, dbg.opts.PlaybackIgnoreDigest)
if err != nil {
return err
}
Expand All @@ -1311,7 +1317,6 @@ func (dbg *Debugger) startPlayback(filename string) error {
if err != nil {
return fmt.Errorf("debugger: %w", err)
}
defer cartload.Close()

// check hash of cartridge before continuing
if dbg.opts.PlaybackCheckROM && cartload.HashSHA1 != plb.Hash {
Expand Down
6 changes: 4 additions & 2 deletions gopher2600.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,8 +314,10 @@ func emulate(mode string, sync *mainSync, args []string) error {
if emulationMode == govern.ModePlay {
flgs.StringVar(&opts.ComparisonROM, "comparisonROM", "", "ROM to run in parallel for comparison")
flgs.StringVar(&opts.ComparisonPrefs, "comparisonPrefs", "", "preferences for comparison emulation")
flgs.BoolVar(&opts.Record, "record", false, "record user input to playback file")
flgs.BoolVar(&opts.PlaybackCheckROM, "playbackCheckROM", true, "check ROM hashes on playback")
flgs.BoolVar(&opts.Record, "record", false, "record user input to new file for future playback")
flgs.StringVar(&opts.RecordFilename, "recordFilename", "", "set output name for recording")
flgs.BoolVar(&opts.PlaybackCheckROM, "playbackCheckROM", true, "check ROM hash on playback")
flgs.BoolVar(&opts.PlaybackIgnoreDigest, "playbackIgnoreDigest", false, "ignore video digests in playback files")
flgs.StringVar(&opts.PatchFile, "patch", "", "path to apply to emulation (not playback files")
flgs.BoolVar(&opts.Wav, "wav", false, "record audio to wav file")
flgs.BoolVar(&opts.NoEject, "noeject", false, "emulator will not quit is noeject is true")
Expand Down
4 changes: 0 additions & 4 deletions hardware/input/input.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,6 @@ func (inp *Input) PeripheralID(id plugging.PortID) plugging.PeripheralID {
// If a playback is currently active the input will not be handled and false
// will be returned.
func (inp *Input) HandleInputEvent(ev ports.InputEvent) (bool, error) {
if inp.playback != nil {
return false, nil
}

for _, r := range inp.recorder {
err := r.RecordEvent(ports.TimedInputEvent{Time: inp.tv.GetCoords(), InputEvent: ev})
if err != nil {
Expand Down
14 changes: 9 additions & 5 deletions hardware/input/recording.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,8 @@ type EventRecorder interface {
}

// AttachEventRecorder attaches an EventRecorder implementation.
func (inp *Input) AddRecorder(r EventRecorder) error {
if inp.playback != nil {
return fmt.Errorf("input: attach recorder: emulator already has a playback attached")
}
func (inp *Input) AddRecorder(r EventRecorder) {
inp.recorder = append(inp.recorder, r)
return nil
}

// ClearRecorders removes all registered event recorders.
Expand Down Expand Up @@ -105,6 +101,14 @@ func (inp *Input) handlePlaybackEvents() error {
return fmt.Errorf("input: passenger event queue is full: input dropped")
}
}

// forward event to attached recorders
for _, r := range inp.recorder {
err := r.RecordEvent(ev)
if err != nil {
return err
}
}
}
}

Expand Down
12 changes: 8 additions & 4 deletions recorder/playback.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ type Playback struct {
vcs *hardware.VCS
digest *digest.Video

// whether to ignore video digest for each playback input
ignoreDigest bool

// the last frame where an event occurs
endFrame int
}
Expand All @@ -77,12 +80,13 @@ func (plb Playback) EndFrame() (bool, error) {
//
// The returned playback must be attached to the VCS input system (with
// AttachToVCSInput() function) for it it to be useful.
func NewPlayback(transcript string) (*Playback, error) {
func NewPlayback(transcript string, ignoreDigest bool) (*Playback, error) {
var err error

plb := &Playback{
transcript: transcript,
sequence: make([]playbackEntry, 0),
transcript: transcript,
sequence: make([]playbackEntry, 0),
ignoreDigest: ignoreDigest,
}

tf, err := os.Open(transcript)
Expand Down Expand Up @@ -241,7 +245,7 @@ func (plb *Playback) GetPlayback() (ports.TimedInputEvent, error) {
entry := plb.sequence[plb.seqCt]
if coords.Equal(entry.event.Time, c) {
plb.seqCt++
if entry.hash != plb.digest.Hash() {
if !plb.ignoreDigest && entry.hash != plb.digest.Hash() {
return ports.TimedInputEvent{
Time: c,
InputEvent: ports.InputEvent{
Expand Down
2 changes: 1 addition & 1 deletion regression/playback.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ func (reg PlaybackRegression) String() string {
func (reg *PlaybackRegression) regress(newRegression bool, output io.Writer, msg string) (_ bool, _ string, rerr error) {
output.Write([]byte(msg))

plb, err := recorder.NewPlayback(reg.Script)
plb, err := recorder.NewPlayback(reg.Script, false)
if err != nil {
return false, "", fmt.Errorf("playback: %w", err)
}
Expand Down

0 comments on commit e97629f

Please sign in to comment.