Mercurial > hg > auditok
comparison auditok/io.py @ 94:19300cbbb84d
Change read implementation for BufferAudioSource
author | Amine Sehili <amine.sehili@gmail.com> |
---|---|
date | Sun, 06 Jan 2019 14:19:53 +0100 |
parents | dfe4553b9c5b |
children | da2330e5b9ce |
comparison
equal
deleted
inserted
replaced
93:dfedc03078b2 | 94:19300cbbb84d |
---|---|
216 | 216 |
217 def __init__(self, data_buffer, | 217 def __init__(self, data_buffer, |
218 sampling_rate=DEFAULT_SAMPLE_RATE, | 218 sampling_rate=DEFAULT_SAMPLE_RATE, |
219 sample_width=DEFAULT_SAMPLE_WIDTH, | 219 sample_width=DEFAULT_SAMPLE_WIDTH, |
220 channels=DEFAULT_NB_CHANNELS): | 220 channels=DEFAULT_NB_CHANNELS): |
221 | 221 AudioSource.__init__(self, sampling_rate, sample_width, channels) |
222 check_audio_data(data_buffer, sample_width, channels) | 222 check_audio_data(data_buffer, sample_width, channels) |
223 AudioSource.__init__(self, sampling_rate, sample_width, channels) | |
224 self._buffer = data_buffer | 223 self._buffer = data_buffer |
225 self._index = 0 | 224 self._sample_size_all_channels = sample_width * channels |
226 self._left = 0 if self._buffer is None else len(self._buffer) | 225 self._current_position_bytes = 0 |
227 self._is_open = False | 226 self._is_open = False |
228 | 227 |
229 def is_open(self): | 228 def is_open(self): |
230 return self._is_open | 229 return self._is_open |
231 | 230 |
236 self._is_open = False | 235 self._is_open = False |
237 self.rewind() | 236 self.rewind() |
238 | 237 |
239 def read(self, size): | 238 def read(self, size): |
240 if not self._is_open: | 239 if not self._is_open: |
241 raise IOError("Stream is not open") | 240 raise AudioIOError("Stream is not open") |
242 | 241 bytes_to_read = self._sample_size_all_channels * size |
243 if self._left > 0: | 242 data = self._buffer[self._current_position_bytes: self._current_position_bytes + bytes_to_read] |
244 | 243 if data: |
245 to_read = size * self.sample_width * self.channels | 244 self._current_position_bytes += len(data) |
246 if to_read > self._left: | |
247 to_read = self._left | |
248 | |
249 data = self._buffer[self._index: self._index + to_read] | |
250 self._index += to_read | |
251 self._left -= to_read | |
252 | |
253 return data | 245 return data |
254 | |
255 return None | 246 return None |
256 | 247 |
257 def get_data_buffer(self): | 248 def get_data_buffer(self): |
258 """ Return all audio data as one string buffer. """ | 249 """ Return all audio data as one string buffer. """ |
259 return self._buffer | 250 return self._buffer |
266 `data_buffer` : str, basestring, Bytes | 257 `data_buffer` : str, basestring, Bytes |
267 a string buffer with a length multiple of (sample_width * channels) | 258 a string buffer with a length multiple of (sample_width * channels) |
268 """ | 259 """ |
269 check_audio_data(data_buffer, self.sample_width, self.channels) | 260 check_audio_data(data_buffer, self.sample_width, self.channels) |
270 self._buffer = data_buffer | 261 self._buffer = data_buffer |
271 self._index = 0 | 262 self._current_position_bytes = 0 |
272 self._left = 0 if self._buffer is None else len(self._buffer) | |
273 | 263 |
274 def append_data(self, data_buffer): | 264 def append_data(self, data_buffer): |
275 """ Append data to this audio stream | 265 """ Append data to this audio stream |
276 | 266 |
277 :Parameters: | 267 :Parameters: |
279 `data_buffer` : str, basestring, Bytes | 269 `data_buffer` : str, basestring, Bytes |
280 a buffer with a length multiple of (sample_width * channels) | 270 a buffer with a length multiple of (sample_width * channels) |
281 """ | 271 """ |
282 check_audio_data(data_buffer, self.sample_width, self.channels) | 272 check_audio_data(data_buffer, self.sample_width, self.channels) |
283 self._buffer += data_buffer | 273 self._buffer += data_buffer |
284 self._left += len(data_buffer) | |
285 | 274 |
286 def rewind(self): | 275 def rewind(self): |
287 self.set_position(0) | 276 self.set_position(0) |
288 | 277 |
289 def get_position(self): | 278 def get_position(self): |
290 return self._index / self.sample_width | 279 return self._current_position_bytes / self._sample_size_all_channels |
291 | 280 |
292 def get_time_position(self): | 281 def get_time_position(self): |
293 return float(self._index) / (self.sample_width * self.sampling_rate) | 282 return float(self._current_position_bytes) / (self._sample_size_all_channels * self.sampling_rate) |
294 | 283 |
295 def set_position(self, position): | 284 def set_position(self, position): |
296 if position < 0: | 285 if position < 0: |
297 raise ValueError("position must be >= 0") | 286 raise ValueError("position must be >= 0") |
298 | 287 position *= self._sample_size_all_channels |
299 if self._buffer is None: | 288 self._current_position_bytes = position if position < len(self._buffer) else len(self._buffer) |
300 self._index = 0 | |
301 self._left = 0 | |
302 return | |
303 | |
304 position *= self.sample_width | |
305 self._index = position if position < len(self._buffer) else len(self._buffer) | |
306 self._left = len(self._buffer) - self._index | |
307 | 289 |
308 def set_time_position(self, time_position): # time in seconds | 290 def set_time_position(self, time_position): # time in seconds |
309 position = int(self.sampling_rate * time_position) | 291 position = int(self.sampling_rate * time_position) |
310 self.set_position(position) | 292 self.set_position(position) |
311 | 293 |