def _decode_audio_packet(self): packet = self._packet size_out = ctypes.c_int(len(self._audio_buffer)) while True: audio_packet_ptr = ctypes.cast(packet.data, ctypes.c_void_p) audio_packet_size = packet.size used = av.avbin_decode_audio(self._audio_stream, audio_packet_ptr, audio_packet_size, self._audio_buffer, size_out) if used < 0: self._audio_packet_size = 0 break audio_packet_ptr.value += used audio_packet_size -= used if size_out.value <= 0: continue # XXX how did this ever work? replaced with copy below # buffer = ctypes.string_at(self._audio_buffer, size_out) # XXX to actually copy the data.. but it never used to crash, so # maybe I'm missing something buffer = ctypes.create_string_buffer(size_out.value) ctypes.memmove(buffer, self._audio_buffer, len(buffer)) buffer = buffer.raw duration = float(len(buffer)) / self.audio_format.bytes_per_second self._audio_packet_timestamp = \ timestamp = timestamp_from_avbin(packet.timestamp) return AudioData(buffer, len(buffer), timestamp, duration, [])
def write(self, audio_data): if not self._audio_data_list: self._head_time = 0.0 self._head_system_time = time.time() self._audio_data_list.append( AudioData(None, audio_data.length, audio_data.timestamp, audio_data.duration)) audio_data.consume(audio_data.length, self.audio_format)
def _get_audio_data(self, bytes_): bytes_ = min(bytes_, self._max_offset - self._offset) if bytes_ <= 0: return None timestamp = float(self._offset) / self._bytes_per_second duration = float(bytes_) / self._bytes_per_second data = self._generate_data(bytes_, self._offset) self._offset += bytes_ return AudioData(data, bytes_, timestamp, duration, list())
def get_audio_data(self, bytes): bytes = min(bytes, self._max_offset - self._offset) if bytes <= 0: return None timestamp = float(self._offset) / self._bytes_per_second duration = float(bytes) / self._bytes_per_second data = self._generate_data(bytes, self._offset) self._offset += bytes return AudioData(data, bytes, timestamp, duration, [])
def get_audio_data(self, bytes_): bytes_ = min(bytes_, self._max_offset - self._offset) if not bytes_: return None data = self._file.read(bytes_) self._offset += len(data) timestamp = float(self._offset) / self.audio_format.bytes_per_second duration = float(bytes_) / self.audio_format.bytes_per_second return AudioData(data, len(data), timestamp, duration, list())
def get_audio_data(self, bytes) -> (AudioData, None): offset = self._tell timestamp = float(offset) / self._bytes_per_second # Align to sample size if self._bytes_per_sample == 2: bytes &= 0xfffffffe elif self._bytes_per_sample == 4: bytes &= 0xfffffffc if bytes in _BUFFERS: buffer, byref = _BUFFERS[bytes] else: buffer = ctypes.create_string_buffer(bytes) byref = ctypes.byref(buffer) _BUFFERS[bytes] = buffer, byref frames = bytes // self._bytes_per_sample // self._channels self.sunvox.audio_callback(byref, frames, 0, self.sunvox.get_ticks()) self._tell += bytes data = buffer.raw if not len(data): return None duration = float(len(data)) / self._bytes_per_second return AudioData(data, len(data), timestamp, duration, [])
def _get_audio_data(self, bytes): # XXX bytes currently ignored while True: while self._audio_packet_size > 0: size_out = ctypes.c_int(len(self._audio_buffer)) #print self._audio_stream, self._audio_packet_ptr, self._audio_packet_size, self._audio_buffer, size_out used = av.avbin_decode_audio(self._audio_stream, self._audio_packet_ptr, self._audio_packet_size, self._audio_buffer, size_out) if used < 0: self._audio_packet_size = 0 break self._audio_packet_ptr.value += used self._audio_packet_size -= used if size_out.value <= 0: continue buffer = ctypes.string_at(self._audio_buffer, size_out) duration = \ float(len(buffer)) / self.audio_format.bytes_per_second timestamp = self._audio_packet_timestamp self._audio_packet_timestamp += duration return AudioData(buffer, len(buffer), timestamp, duration) packet = self._get_packet_for_stream(self._audio_stream_index) if not packet: return None self._audio_packet_timestamp = \ timestamp_from_avbin(packet.timestamp) self._audio_packet = packet # keep from GC self._audio_packet_ptr = ctypes.cast(packet.data, ctypes.c_void_p) self._audio_packet_size = packet.size