diff --git a/main.py b/main.py index df6fffd..011b957 100644 --- a/main.py +++ b/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,