Problem [Errno 9] bad file descriptor
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