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