Handle exceptions in update
This commit is contained in:
		
							parent
							
								
									efb73128ab
								
							
						
					
					
						commit
						89242a9530
					
				
							
								
								
									
										55
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								main.py
									
									
									
									
									
								
							@ -50,7 +50,7 @@ def get_supported_sample_rates(pyaudio_device: int,
 | 
			
		||||
class AudioAnalyzer:
 | 
			
		||||
    frame_queue = None   # type: queue.Queue
 | 
			
		||||
 | 
			
		||||
    _hanning_window = None
 | 
			
		||||
    _hann_window = None
 | 
			
		||||
    _fft_buffer = None
 | 
			
		||||
    _fft_lock = None
 | 
			
		||||
    _stream = None
 | 
			
		||||
@ -90,7 +90,7 @@ class AudioAnalyzer:
 | 
			
		||||
 | 
			
		||||
        self._sample_rate = sample_rate
 | 
			
		||||
        self._samples_per_buffer = samples_per_buffer
 | 
			
		||||
        self._hanning_window = (1 - numpy.cos(numpy.linspace(0, 2 * pi, samples_per_fft, False))) / 2
 | 
			
		||||
        self._hann_window = (1 - numpy.cos(numpy.linspace(0, 2 * pi, samples_per_fft, False))) / 2
 | 
			
		||||
        self._fft_freqs = numpy.fft.fftfreq(samples_per_fft, 1 / sample_rate)
 | 
			
		||||
        self._fft_buffer = numpy.zeros(num_buffers * samples_per_buffer, dtype=numpy.float32)
 | 
			
		||||
        self.stop = False
 | 
			
		||||
@ -128,35 +128,34 @@ class AudioAnalyzer:
 | 
			
		||||
               time_info: Dict,
 | 
			
		||||
               status_flags,
 | 
			
		||||
               ):
 | 
			
		||||
        #TODO deal with exceptions happening in the callback!
 | 
			
		||||
 | 
			
		||||
        in_buffer = numpy.fromstring(in_data, numpy.int16)
 | 
			
		||||
        samples_per_buffer = in_buffer.size
 | 
			
		||||
 | 
			
		||||
        with self._fft_lock:
 | 
			
		||||
            self._fft_buffer[:-samples_per_buffer] = self._fft_buffer[samples_per_buffer:]
 | 
			
		||||
            self._fft_buffer[-samples_per_buffer:] = in_buffer
 | 
			
		||||
            fft = numpy.fft.rfft(self._fft_buffer * self._hanning_window)
 | 
			
		||||
 | 
			
		||||
        fft_argmax = numpy.abs(fft[1:]).argmax() + 1         # excluding 0-frequency
 | 
			
		||||
        frame_data = {
 | 
			
		||||
                'fft': fft,
 | 
			
		||||
                'fft_argmax': fft_argmax,
 | 
			
		||||
                'frequency': self.fft_freqs[fft_argmax],
 | 
			
		||||
                'magnitude': numpy.abs(fft[fft_argmax]),
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
        time_per_buffer = self._samples_per_buffer / self._sample_rate
 | 
			
		||||
        try:
 | 
			
		||||
            self.frame_queue.put(frame_data, timeout=time_per_buffer * 10)
 | 
			
		||||
        except queue.Full:
 | 
			
		||||
            logger.warning('Frame queue was full for more than 10 buffer periods!')
 | 
			
		||||
            in_buffer = numpy.fromstring(in_data, numpy.int16)
 | 
			
		||||
            samples_per_buffer = in_buffer.size
 | 
			
		||||
 | 
			
		||||
        if self.stop:
 | 
			
		||||
            return None, pyaudio.paComplete
 | 
			
		||||
        else:
 | 
			
		||||
            with self._fft_lock:
 | 
			
		||||
                self._fft_buffer[:-samples_per_buffer] = self._fft_buffer[samples_per_buffer:]
 | 
			
		||||
                self._fft_buffer[-samples_per_buffer:] = in_buffer
 | 
			
		||||
                fft = numpy.fft.rfft(self._fft_buffer * self._hann_window)
 | 
			
		||||
 | 
			
		||||
            fft_argmax = numpy.abs(fft[1:]).argmax() + 1         # excluding 0-frequency
 | 
			
		||||
            frame_data = {
 | 
			
		||||
                    'fft': fft,
 | 
			
		||||
                    'fft_argmax': fft_argmax,
 | 
			
		||||
                    'frequency': self.fft_freqs[fft_argmax],
 | 
			
		||||
                    'magnitude': numpy.abs(fft[fft_argmax]),
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
            time_per_buffer = self._samples_per_buffer / self._sample_rate
 | 
			
		||||
            try:
 | 
			
		||||
                self.frame_queue.put(frame_data, timeout=time_per_buffer * 10)
 | 
			
		||||
            except queue.Full:
 | 
			
		||||
                logger.warning('Frame queue was full for more than 10 buffer periods!')
 | 
			
		||||
 | 
			
		||||
            if self.stop:
 | 
			
		||||
                return None, pyaudio.paComplete
 | 
			
		||||
            return None, pyaudio.paContinue
 | 
			
		||||
 | 
			
		||||
        except:
 | 
			
		||||
            self.close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def monitor_pitch(pyaudio_device: int,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user