My research team has built an experiment that is a memory test on several images and sounds. It has alternating blocks of sounds and images, like this:
Sound Study (40 trials)
Sound Test (40 trials)
Image Study (40 trials)
Image Test (40 trials)
The image and sound blocks are counter-balanced, so that half of the subjects get images first and half of the subjects get sounds first.
We play videos before each of the four parts with instructions. Each video lasts for 1-2 minutes and is an mp4 file. We’re using visual.MovieStim() to play the videos. We intermittently get an error that freezes the program with the error:
File "C:\Program Files (x86)\PsychoPy2\lib\site-packages\pyglet\media\drivers\directsound\__init__.py", line 61 in run for player in self.players: RuntimeError: Set changed size during iteration
We’ve run through the program a couple hundred times in the computer lab we will collect data in to try to find patterns to the crash since it is intermittent. We get it about 15% of the time. When it happens, the crash happens on trial 86 if sounds were played first (6 trials after the image test instruction video played) and on trial 43 if images were played first (3 trials after the image study instruction video played).
We commented out the call to play the videos and were able to get through the program 100 times without a crash.
Here’s the specifications of the setup we’re using
Computer lab of 25 computers using a network based user account on Windows 10
Standalone PsychoPy 1.85.1
Task built in PsychoPy coder
The code for the function to play the video is below. Any suggestions on how to fix this would be greatly appreciated.
def playMovie(filename): _clock = core.Clock() movie = visual.MovieStim(win=win, name='movie', filename=filename, ori=0, pos=(0,0), opacity=1, depth=0.0) movieLength = movie.duration #essentially, get number of frames #msg = visual.TextStim(win, text="Start Instructions - Press Spacebar to Continue", color="black", units="pix") #msg.draw() #win.flip() #event.waitKeys(keyList=["space"]) #log.write("Starting Movie, %f\n" % core.getTime()) #start the movie t = 0 _clock.reset() frameN = -1 continueRoutine = True endExpNow = False # update component parameters for each repeat key_resp_2 = event.BuilderKeyResponse() # keep track of which components have finished Components = [movie, key_resp_2] for thisComponent in Components: if hasattr(thisComponent, "status"): thisComponent.status = NOT_STARTED while continueRoutine: t = _clock.getTime() frameN = frameN+1 # number of completed frames (so 0 is the first frame) #movie updates if t>=0.0 and movie.status == NOT_STARTED: #keep track of start time/frame for later movie.tstart = t movie.frameNStart = frameN #exact frame index movie.setAutoDraw(True) frameRemains = movieLength - win.monitorFramePeriod * 0.75 #how many frames remain if movie.status == STARTED and t>= frameRemains: movie.setAutoDraw(False) if movie.status == FINISHED: #force-quit routine continueRoutine = False #check if all components have finished if not continueRoutine: # a component has requested a force-quit of routine break continueRoutine = False # will revert to True if at east one component still running for thisComponent in Components: if hasattr(thisComponent,"status") and thisComponent.status != FINISHED: continueRoutine = True break #at least one component has not yet finished #refresh screen if continueRoutine: win.flip()