Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Supported by

Problem [Errno 9] bad file descriptor

edited February 2020 in OpenSesame

Hey, a student of ours is having a problem with writing audio files being recorded by opensesame. He is calling the recording from inline script.

The error is...

             File ".....init__py", line 885, in emit self.flush.
             File ".....", line 845, in flush self.stream.flush()
            IOerror:[Errno 0] Bad file descriptor
            logged from file legacy.py line 187

From what i gather elsewhere it seems to be something about attempting to close a write or open process that has already been deleted, I think the problem lies in the code below, however I am not 100% sure and was wondering if anyone could direct me to the potential source of the problem as the code looks sound to me.


def get_sound():
	# Open the mic
	stream = pyaudio.PyAudio().open(
		format=FORMAT,
		channels=CHANNELS,
		rate=RATE,
		input=True,
		input_device_index=0,
		frames_per_buffer=INPUT_FRAMES_PER_BLOCK
		)

	# Listen for sounds until a sound is detected or a timeout occurs.
	clicks=0
	response = 'none'
	response_time = 'none'
	start_time = self.time()
	allstream = []
	while True:
		pygame.event.clear()
		pressed=my_mouse.get_pressed()
		mpos, timestamp = my_mouse.get_pos()
		x, y = mpos
		tt = timestamp - start_time
		
		if response=='none':
			if self.time() - start_time >= trial_timeout:
				response_time = timeout
				response = 'timeout'
				var.loudness = None
				break  
			try:
				block = stream.read(chunk)
			except IOError as e:
				print e
		#get loudness and detect sound
			loudness = get_rms(block)
			if loudness > sound_threshold:
				response_time = self.time() - start_time
				response = 'detected'
				var.loudness = loudness
				print response
		
		#record audio
		if response=='detected':
			try:
				block = stream.read(chunk)
			except IOError as e:
				print e
			#add block to stream
			allstream.append(block)
			
			#time out from speech-onset. 
			if tt - response_time >= trial_timeout:
				rt = 'none'
				break  			

		#get mouse clicks.
		if pressed[0]==1:
			if x>(pos[0]) and x<(pos[0]+size[0]) and y>(pos[1]) and y <(pos[1]+size[1]):
				print 'clicked target'
				rt = tt				
				clicks+=1
				break
			else:
				clicks+=1
				self.sleep(50)
			
	# Close the audio stream
	stream.close()
	pyaudio.PyAudio().terminate()
	data = ''.join(allstream)
	wf = wave.open(path+str(pair_nr)+"_"+str(trial_no)+".wav", 'wb')
	wf.setnchannels(CHANNELS)
	wf.setsampwidth(pyaudio.PyAudio().get_sample_size(FORMAT))
	wf.setframerate(RATE)
	wf.writeframes(data)
	wf.close()
	return response, response_time, clicks, rt


Comments

  • Hi,

    The error message is a little hard to link to a particular part of script. I'm just guessing something here, but could it be that you shouldn't call pyaudio.PyAudio().terminate() before the end of the script? Could you try to figure out which part of the function call of the script is the culprit?


    Eduard

    Buy Me A Coffee

Sign In or Register to comment.