Mercurial > hg > auditok
changeset 94:19300cbbb84d
Change read implementation for BufferAudioSource
author | Amine Sehili <amine.sehili@gmail.com> |
---|---|
date | Sun, 06 Jan 2019 14:19:53 +0100 |
parents | dfedc03078b2 |
children | a2ad7085c262 |
files | auditok/io.py tests/test_audio_source.py |
diffstat | 2 files changed, 14 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/auditok/io.py Sat Jan 05 18:51:33 2019 +0100 +++ b/auditok/io.py Sun Jan 06 14:19:53 2019 +0100 @@ -218,12 +218,11 @@ sampling_rate=DEFAULT_SAMPLE_RATE, sample_width=DEFAULT_SAMPLE_WIDTH, channels=DEFAULT_NB_CHANNELS): - + AudioSource.__init__(self, sampling_rate, sample_width, channels) check_audio_data(data_buffer, sample_width, channels) - AudioSource.__init__(self, sampling_rate, sample_width, channels) self._buffer = data_buffer - self._index = 0 - self._left = 0 if self._buffer is None else len(self._buffer) + self._sample_size_all_channels = sample_width * channels + self._current_position_bytes = 0 self._is_open = False def is_open(self): @@ -238,20 +237,12 @@ def read(self, size): if not self._is_open: - raise IOError("Stream is not open") - - if self._left > 0: - - to_read = size * self.sample_width * self.channels - if to_read > self._left: - to_read = self._left - - data = self._buffer[self._index: self._index + to_read] - self._index += to_read - self._left -= to_read - + raise AudioIOError("Stream is not open") + bytes_to_read = self._sample_size_all_channels * size + data = self._buffer[self._current_position_bytes: self._current_position_bytes + bytes_to_read] + if data: + self._current_position_bytes += len(data) return data - return None def get_data_buffer(self): @@ -268,8 +259,7 @@ """ check_audio_data(data_buffer, self.sample_width, self.channels) self._buffer = data_buffer - self._index = 0 - self._left = 0 if self._buffer is None else len(self._buffer) + self._current_position_bytes = 0 def append_data(self, data_buffer): """ Append data to this audio stream @@ -281,29 +271,21 @@ """ check_audio_data(data_buffer, self.sample_width, self.channels) self._buffer += data_buffer - self._left += len(data_buffer) def rewind(self): self.set_position(0) def get_position(self): - return self._index / self.sample_width + return self._current_position_bytes / self._sample_size_all_channels def get_time_position(self): - return float(self._index) / (self.sample_width * self.sampling_rate) + return float(self._current_position_bytes) / (self._sample_size_all_channels * self.sampling_rate) def set_position(self, position): if position < 0: raise ValueError("position must be >= 0") - - if self._buffer is None: - self._index = 0 - self._left = 0 - return - - position *= self.sample_width - self._index = position if position < len(self._buffer) else len(self._buffer) - self._left = len(self._buffer) - self._index + position *= self._sample_size_all_channels + self._current_position_bytes = position if position < len(self._buffer) else len(self._buffer) def set_time_position(self, time_position): # time in seconds position = int(self.sampling_rate * time_position)
--- a/tests/test_audio_source.py Sat Jan 05 18:51:33 2019 +0100 +++ b/tests/test_audio_source.py Sun Jan 06 14:19:53 2019 +0100 @@ -738,7 +738,7 @@ data_buffer=b"ABCDEFGHI", sampling_rate=8, sample_width=2, - channels=2, + channels=1, ) self.assertEqual( "The length of audio data must be an integer "